防止x窗口系统中的窗口最大化/最小化

时间:2010-07-22 12:05:38

标签: c++ x11

我正在为x中的窗口(用c ++编写)编写一些低级窗口代码,我想阻止用户最大化或最小化窗口。我不介意这是通过拒绝调整大小的请求,还是通过删除按钮本身来完成的。但是,我绑定到x并且不能使用qt或其他我知道提供此功能的高级库。

目前我所做的就是拦截ResizeRequest事件,然后使用XResizeWindow设置窗口大小......但这会导致窗口暂时最大化然后返回其原始状态。有没有办法直接拒绝ResizeRequest,这似乎是处理这个问题的正确方法,但是相当多的谷歌搜索和文档拖网都没有找到解决方案。

感谢, 詹姆斯

3 个答案:

答案 0 :(得分:3)

你做不到。

基本上你会像对着窗口管理器一样对抗(最后对用户而言)。 例如,您可以观察PropertyNotify事件以检查您的窗口(或窗口附加的窗口(由窗口管理器提供))是否被最小化。然后你最小化它。然后用户将其最小化,或窗口管理器。从技术上讲,你可以反对它,但我强烈反对它。

说:您可以尝试向窗口管理器提供一些关于您认为适合窗口的提示。见http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html#id2523223

_NET_WM_ALLOWED_ACTIONS

是窗口管理器按窗口管理的属性(告诉其他工具该窗口可能的内容)。其中一项行动是

_NET_WM_ACTION_RESIZE indicates that the window may be resized. 
(Implementation note: Window Managers can identify a non-resizable
window because its minimum and maximum size in WM_NORMAL_HINTS will 
be the same.)

因此,如果您的用户正在使用正确解释WM_NORMAL_HINTS的窗口管理器并删除任何调整大小,最大化,最小化:那么您会感到很幸运。

你真正想要实现的目标是什么?某种亭子模式?某种公平交易模式,走路的人不能“关闭”,关闭,调整大小,摆弄你正在呈现的应用程序?

如果是这样的话:考虑在没有任何窗口管理器的情况下运行xsession。只需根据需要启动您的应用即可。

答案 1 :(得分:2)

从技术上讲,你不能阻止任何事情,因为WM可以做任何他们想做的事情,但是大多数合理的窗口管理员会让你控制它。

首选的现代方法是设置_NET_WM_WINDOW_TYPE语义类型(如果其中任何一个适用)。例如,在许多WM中,对话框类型可能意味着不可最大化。 http://standards.freedesktop.org/wm-spec/1.3/

听起来好像这些都不适用于你的应用程序,所以你必须设置特定的提示。

为避免最大化,您只想使窗口无法调整大小。正如你所发现的那样,仅仅通过调整大小来“战斗”调整大小是一个坏主意。它具有无限的循环潜力等等。

XSetWMSizeHints()是避免最大化的正确方法。设置最小尺寸=最大尺寸。瞧,不可调整大小。

为了避免最小化,你必须使用一些旧的遗产称为Mwm提示。不幸的是,这涉及剪切和粘贴结构定义,然后将属性设置为结构的位。

我只是用谷歌搜索MWM提示文档,其中一个结果是我建议记录它们,9年前;-) http://mail.gnome.org/archives/wm-spec-list/2001-December/msg00044.html 不幸的是,结果都不是实际的文档。

您可以从http://git.gnome.org/browse/gtk+/tree/gdk/x11/MwmUtil.h和gdk_window_set_mwm_hints()http://git.gnome.org/browse/gtk+/tree/gdk/x11/gdkwindow-x11.c#n4389

中找出答案。

MwmUtil.h是在任何地方剪切和粘贴的结构(大多数WM和工具包)。

_CN_WM_ALLOWED_ACTIONS提示在您的窗口上由WM 设置,指示WM已决定将哪些功能放在窗口上。此提示的主要目的是寻呼机和任务列表以及其他桌面组件可以为窗口提供匹配操作。

涵盖所有这些的规格是ICCCM(旧规范,仍然大部分有效)和EMWH(新的扩展和澄清,因为ICCCM留下了许多未解决的问题)。

有关血腥的详细信息,请尝试使用源代码...例如,metacity的window.c文件中的recalc_window_features(),当前在第6185行http://git.gnome.org/browse/metacity/tree/src/core/window.c#n6185

编码X时的哲学调整:里程将因窗口管理器而异。许多人一般使用的“主流”产品将遵循规范并按照您的预期进行工作。然而,那里有各种各样的WM,一些破坏,另一些故意古怪。你可以做的最糟糕的事情是尝试“战斗”或围绕WM工作,因为基本上所有这样做的方式最终都会破坏应用程序,当运行一个理智的WM。你最好的选择是让事情遵循规范,使用正常的WM,如果你让用户感到不安,他们可以调整你的不可调整大小的窗口,因为他们的WM允许,你只需告诉他们抱怨任何提供WM的人。可插拔WM设计的重点是WM确定了一些这种行为,而不是应用程序。

祝你好运。现代X非常复杂,没有工具包编写Xlib就像是要求事情......不太对劲。但是你可以让它进展顺利。 :-P

答案 2 :(得分:0)

这是一个老问题,但是,有一个非官方的,但大多数窗口管理员支持做这些事情的方式 - _MOTIF_WM_HINTS

查看此处:Disable actions, move, resize, minimize, etc using python-xlib获取示例代码。