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

时间:2010-04-08 08:50:19

标签: c x11 xlib gdk

使用gdk_screen_get_monitor_geometry,我可以获得以像素为单位的总面积和每个显示器的相对位置,即使有两个或更多用作单个屏幕。

但是,我想获得每个监视器的可用区域(即不包括面板)。我发现的唯一的东西是_NET_WORKAREA,但这是一个跨越所有显示器的巨大区域。根据分辨率和排列,该区域内可能有面板。

如何获得每台显示器的实际可用面积?理想情况下,仅使用Gtk / Gdk,没有X11特定的。

2 个答案:

答案 0 :(得分:2)

以下方法有点复杂,但这是我使用的方法。即使在窗口映射时窗口管理器和GTK +之间存在复杂的交互时,它也应该是健壮的 - 例如,当某些面板被自动隐藏时。

基本思想是为每个屏幕创建一个透明的无装饰最大化窗口,在映射时获取其几何(大小和位置)(例如,使用map-event回调),并立即销毁它们。这可以让你获得每个屏幕内的可用区域。然后,您可以使用现有的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()销毁窗口。< / p>

请注意,在实践中,您只需要一个窗口。我个人会使用一个简单的循环。我怀疑由于窗口管理器的奇怪/错误,为每个屏幕创建一个新窗口更加健壮,而不是仅仅在屏幕之间移动相同的窗口。事实证明它也更容易,因为你可以使用一个简单的回调函数来获得每个屏幕的可用区域。

像我说的那样,这很复杂。另一方面,标准应用程序不应该关心屏幕尺寸;它应该只是做用户或窗口管理器要求的。因此,如果没有更好的设施可以找到这些信息,我不会感到惊讶。屏幕尺寸可能随时改变,例如,如果用户旋转显示器,或者更改显示分辨率。

答案 1 :(得分:1)

最后我最终直接使用了xlib,各种“技巧”就像上面提到的一样,最终最终失败了,经常会出现奇怪的角落情况而且从未遵循KISS原则。

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