如何使Qt与GTK监视器号一致?

时间:2018-10-12 22:42:12

标签: c++ qt gtk screen x11

我正在尝试通过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返回的监视器编号?

0 个答案:

没有答案