使用gdk_screen_get_monitor_geometry,我可以获得以像素为单位的总面积和每个显示器的相对位置,即使有两个或更多用作单个屏幕。
但是,我想获得每个监视器的可用区域(即不包括面板)。我发现的唯一的东西是_NET_WORKAREA,但这是一个跨越所有显示器的巨大区域。根据分辨率和排列,该区域内可能有面板。
如何获得每台显示器的实际可用面积?理想情况下,仅使用Gtk / Gdk,没有X11特定的。
答案 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代码库中。