7

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

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

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

4

2 回答 2

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().

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

就像我说的,这很令人费解。另一方面,标准应用程序不应该关心屏幕尺寸;它应该只做用户或窗口管理器要求的事情。因此,如果没有更好的设施来查找此信息,我不会感到惊讶。屏幕大小可能随时改变,例如,如果用户旋转他们的显示器,或改变显示分辨率。

于 2012-06-24T04:59:33.377 回答
1

最后我最终直接使用了 xlib,像上面建议的那样的各种“技巧”最终最终最终失败了,从长远来看,经常出现奇怪的极端情况,并且从未遵循 KISS 原则。

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

于 2012-07-15T23:27:34.460 回答