我正在尝试通过GTK应用程序访问每个监视器的X11属性集。属性的名称取决于监视器号。访问该属性的应用程序使用Qt。现在,看来Qt对监视器的编号与GTK的编号不同,所以当我从Qt程序检索属性时,它得到的监视器编号错误,因为某些原因GTK和Qt不同意非监视器编号。
为确认这一点,我进行了两项测试,以检查同一台显示器的GTK和Qt给我什么。这是我的测试GTK代码:
#include <iostream>
#include <gtk/gtk.h>
int main(int argc, char** argv)
{
gtk_init(&argc, &argv);
const auto widget=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(widget);
while(gtk_events_pending())
gtk_main_iteration();
const auto window=gtk_widget_get_window(widget);
const auto screen=gdk_window_get_screen(window);
const auto monitor=gdk_screen_get_monitor_at_window(screen,window);
std::cout << "GTK monitor number: " << monitor << "\n";
}
这是Qt代码:
#include <iostream>
#include <QWidget>
#include <QApplication>
#include <QDesktopWidget>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QWidget widget;
widget.show();
app.processEvents();
const auto desktop=app.desktop();
std::cout << "Qt screen number: " << desktop->screenNumber(&widget) << "\n";
}
xrandr
是这样的:
$ xrandr
Screen 0: minimum 8 x 8, current 3200 x 1080, maximum 16384 x 16384
DVI-I-0 disconnected primary (normal left inverted right x axis y axis)
DVI-I-1 connected 1920x1080+1280+0 (normal left inverted right x axis y axis) 477mm x 268mm
1920x1080 60.0*+ 59.9 50.0
<...>
HDMI-0 disconnected (normal left inverted right x axis y axis)
DVI-D-0 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 380mm x 300mm
1280x1024 60.0 + 75.0*
<...>
通过所有这些设置,当鼠标指针放在右侧监视器上时,我将从测试中获得以下输出:
Qt screen number: 0
GTK monitor number: 1
而当光标在左侧监视器上时相反。窗口管理器配置为将窗口放置在光标所在的监视器上,因此同一监视器实际上由GTK和Qt编号的不同。
因此,我的问题:我如何找出要从Qt应用程序返回的GTK gdk_screen_get_monitor_at_window
返回的监视器编号?