微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

解决方法

以下方法有点复杂,但它是我使用的.即使在映射窗口时窗口管理器和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()销毁窗口.

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

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

原文地址:https://www.jb51.cc/c/118845.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐