但是,我想获得每个监视器的可用区域(即不包括面板).我发现的唯一的东西是_NET_WORKAREA,但这是一个跨越所有显示器的巨大区域.根据分辨率和排列,该区域内可能有面板.
如何获得每台显示器的实际可用面积?理想情况下,仅使用Gtk / Gdk,没有X11特定的.
解决方法
基本思想是为每个屏幕创建一个透明的无装饰最大化窗口,在映射时获取其几何(大小和位置)(例如,使用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()销毁窗口.
请注意,在实践中,您只需要一个窗口.我个人会使用一个简单的循环.我怀疑由于窗口管理器的奇怪/错误,为每个屏幕创建一个新窗口更加健壮,而不是仅仅在屏幕之间移动相同的窗口.事实证明它也更容易,因为你可以使用一个简单的回调函数来获得每个屏幕的可用区域.
就像我说的,这是非常复杂的.另一方面,标准应用程序不应该关心屏幕尺寸;它应该只是做用户或窗口管理器要求的.因此,如果没有更好的设施可以找到这些信息,我不会感到惊讶.屏幕尺寸可能随时改变,例如,如果用户旋转显示器,或者更改显示分辨率.