Gtk:获取每个显示器的可用区域(不包括面板)

7
使用gdk_screen_get_monitor_geometry,我可以获取每个监视器的总像素区域和相对位置,即使有两个或多个用作单个屏幕。
然而,我想要获取每个监视器的可用区域(即不包括面板)。我找到的唯一东西是_NET_WORKAREA,但那是一个跨越所有监视器的巨大区域。根据分辨率和排列方式,这个区域内可能会有面板。
如何获取每个监视器的实际可用区域?理想情况下,仅使用Gtk/Gdk,没有X11特定的内容。
2个回答

2
以下方法有点复杂,但这是我会用的方法。即使在窗口管理器和GTK+之间存在复杂的交互时,例如当某些面板自动隐藏时,它也应该是强大的。
基本思想是为每个屏幕创建一个透明的无装饰最大化窗口,在窗口映射时获取其几何形状(大小和位置),并立即销毁它们。这将让您获得每个屏幕内的可用区域。然后,如果有的话,可以使用现有的gdk_screen_get_monitor_geometry()方法来确定可用区域在监视器之间的分配情况。
具体步骤如下:
使用gdk_display_get_default()方法获取默认显示器,然后使用gdk_display_get_n_screens()方法找出它有多少个屏幕。
为每个屏幕使用gtk_window_new()方法创建一个新窗口,并使用gtk_window_set_screen()方法将窗口移动到各自的屏幕上。使用gtk_window_set_decorated(FALSE)方法去除窗口的装饰,使用gtk_window_maximize(TRUE)方法最大化窗口,并使用gtk_window_set_opacity(0.0)方法使其透明。连接map-event信号到回调处理程序(使用g_signal_connect()方法)。使用gtk_widget_show()方法显示窗口。
信号处理程序需要调用gtk_window_get_position()和/或gtk_window_get_size()方法来获取新映射窗口的位置和/或大小,然后使用gtk_widget_destroy()方法销毁窗口。
请注意,在实践中,您只需要一个窗口。我个人会使用一个简单的循环。我怀疑由于窗口管理器的奇怪性/错误,为每个屏幕创建一个新窗口比仅在屏幕之间移动相同的窗口更加稳健。事实证明这也更容易,因为您可以使用单个简单的回调函数来获取每个屏幕的可用区域。
就像我说的那样,这非常复杂。另一方面,标准应用程序不应关心屏幕大小;它应该只是按照用户或窗口管理器的要求执行操作。因此,如果没有更好的设施来查找此信息,我不会感到惊讶。屏幕大小可能会在任何时候发生变化,例如,如果用户旋转其显示器或更改显示分辨率。

这很聪明,但我想知道是否有一种同步的方法,即不需要允许事件循环进行。 - zwol
请记住,并非所有桌面都是合成的,因此设置不透明度可能会无效。 - ssokolow
@Zack:如果你不想让“当前”应用程序的事件循环周期运行,那么请分叉一个子进程,并通过管道以文本形式返回这些区域。 - Nominal Animal
@ssokolow:我相信零不透明度总是意味着窗口不可见,即使不支持合成或透明度。(换句话说,合成提供更多的分级、部分透明度,但完全透明度或完全不透明度应该始终得到支持。)不过我太懒了,没有去验证这一点。 - Nominal Animal

1

最终我决定直接使用xlib,各种“技巧”像上面建议的那样最终在长期运行中失败了,经常出现奇怪的边角情况,并且从未遵循KISS原则。

我使用的解决方案在X-Tile代码库中。


1
我已经拿到了x-tile的源代码,我不是个白痴。但是相比于搜索整个源代码,看一些系统调用会更容易,你不觉得吗? - Cem Kalyoncu
1
抱歉,但是你的代码很混乱,而且与标记的C语言不同,它是用Python编写的。为了让其他人不浪费时间,正确的写法应该是_NET_WORKAREA,详情请参考:http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html#idm140130317674416 - Cem Kalyoncu
嗨@CemKalyoncu和Chris,非常感谢,特别是Cem为像我这样的新手指出了这一点。 - Noitidart
@leo-ufimtsev .... 是啊,当这个问题被提出时,Wayland在5年前在哪里呢...而现在它又在哪里呢...许多X应用程序将在未来几年内仍然在Wayland包装器中运行... 如果 Wayland有所作为的话... - Chris Camacho
是的,我知道,这很烦人 :-/.(现在我正在将Eclipse从X移植到Wayland。)Wayland似乎很合法,许多人似乎正在进行移植。Gnome / Firefox / Libreoffice只是其中几个例子。 Wayland还具有对X的XWayland向后支持,因此新的Gtk3应用程序可能会是纯Wayland,而旧的东西可能不会被移植得那么多。 - Leo Ufimtsev
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接