Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 防止x窗口系统中的窗口最大化/最小化_C++_X11 - Fatal编程技术网

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

C++ 防止x窗口系统中的窗口最大化/最小化,c++,x11,C++,X11,我正在为x(c++中)中的窗口编写一些低级窗口代码,我想防止用户将窗口最大化或最小化。我不介意这是通过拒绝调整大小的请求,还是通过移除按钮本身来实现的。但是,我与x绑定,无法使用qt或其他我知道提供此功能的更高级别库 目前,我所能做的就是截取ResizeRequest事件,然后使用XResizeWindow将窗口大小设置回原来的大小。。。但这会导致窗口暂时最大化,然后返回到其原始状态。有没有一种方法可以直接拒绝ResizeRequest,这似乎是处理这个问题的正确方法,但谷歌搜索和文档拖网还没有

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

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

谢谢, 詹姆斯,你不能

本质上,您将与窗口管理器(以及最终的用户)进行激烈的斗争。 例如,您可以观看PropertyNotify事件,以检查您的窗口(或者更确切地说,您的窗口所连接的窗口(由窗口管理器提供))是否最小化。然后你就把它变小了。然后用户将其最小化,或者窗口管理器。从技术上讲,你可以反对它,但我强烈建议你不要这样做

也就是说:您可以尝试向窗口管理器提供一些提示,说明您认为哪些内容适合该窗口。见:

是窗口管理器为每个窗口管理的属性(用于告诉其他工具该窗口可能具有的功能)。这些行动之一是

_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\u NORMAL\u提示
,并删除任何大小调整、最大化和最小化操作:那么您会感到幸运

你真正想要实现什么?某种信息亭模式?在某种公平贸易模式下,路过的人不能“关机”,关闭,调整大小,摆弄你正在展示的应用程序


如果是这样:考虑运行XScript,而根本不涉及任何窗口管理器。只要启动你需要的应用程序并完成它。

从技术上讲,你不能阻止任何事情,因为WMs可以做任何他们想做的事情,但最合理的窗口管理器会让你控制它

最好的现代方法是设置_NET_WM_WINDOW_类型语义类型(如果其中任何一个适用)。例如,在许多WMs中,对话框类型可能意味着不可最大化。

听起来这些都不适用于你的应用程序,所以你必须设置具体的提示

为了避免最大化,您只想使窗口不可调整大小。正如您所发现的,仅仅通过调整大小来“对抗”调整大小是一个坏主意。它具有无限的循环潜力

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

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

我刚刚在谷歌上搜索了MWM提示文档,其中一个结果是我建议9年前将它们记录下来;-) 不幸的是,没有一个结果是真实的文档

您可能可以从和gdk_window_set_mwm_hints()中找到它

h是到处剪切和粘贴的结构(在大多数WMs和工具包中)

通过WM在窗口上设置_NET_WM_ALLOWED_ACTIONS提示,指示WM决定在窗口上添加哪些功能。此提示的主要目的是寻呼机、任务列表和其他桌面组件可以为窗口提供匹配操作

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

有关血淋淋的详细信息,请尝试源代码。。。例如,metacity的window.c文件中的recalc_window_features(),当前位于第6185行

为X:里程编码时的哲学调整将随窗口管理器的不同而变化。很多人通常使用的“主流”产品都会遵循规范,并按照您的预期工作。然而,有各种各样的WMs存在,一些坏了,另一些故意古怪。你能做的最糟糕的事情是尝试“战斗”或围绕WM工作,因为基本上所有这样做的方式都会在运行理智的WM时破坏应用程序。你最好的办法是让事情符合规格,使用普通的WMs,如果你让用户不高兴,因为他们的WM允许他们调整不可调整窗口的大小,你只需要告诉他们向提供WM的人投诉。可插拔WM设计的全部要点是WM决定了某些行为,而不是应用程序


祝你好运。现代X非常复杂,在没有工具箱的情况下编写Xlib有点像是在要求。。。不完全正确。但你可能会把它做得很好-P

这是一个老问题,但是,有一种非官方的,但大多数窗口管理器都支持的方法来做这些事情-

\u MOTIF\u WM\u hits


请看这里:示例代码。

我想创建一个不可调整大小的窗口。当然这是可能的,更高级别的管理者实现了这一点。例如,在java中,您可以将窗口设置为不可调整大小,并禁用“最大化/最小化”按钮。@james,但为什么要设置不可调整大小的窗口呢。如果调整窗口的大小,或者你只是把你的想法强加给你的用户,会不会有什么东西坏掉。如果用户更改窗口中内容的字体大小,该怎么办?如果窗口中的某些消息比您预期的要长,该怎么办。除非有充分的理由,否则不要剥夺用户的功能。仅仅因为没有“按钮”并不意味着什么。在大多数窗口管理器中使用alt+leftmouse并关闭。您可以设置一些大小提示(manxsizehints),符合要求的窗口管理器将尊重这些“提示”
_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.)