【问题标题】:How to use xlib to listen for screen resolution changes on Linux如何在 Linux 上使用 xlib 监听屏幕分辨率变化
【发布时间】:2013-06-03 23:32:19
【问题描述】:

我正在编写一个小的本地例程来通知另一个进程用户已更改屏幕分辨率。我尝试使用 gtk,但它在非复合窗口管理器上不稳定并且经常崩溃。我正在研究 xlib 并有一个示例工作,当生成的 X Window 的大小发生更改时会通知我,但我不知道如何获得屏幕分辨率已更改的通知。任何帮助,将不胜感激。我包括了我的 xlib 测试代码和 gtk+ 测试代码,如所示,在使用非复合窗口管理器时会崩溃很多。

这是我使用 xlib 的测试代码

Display * display;
int screen;
Window root, window;

display = XOpenDisplay (NULL);
if (!display){ syslog(LOG_INFO, "Could not open display.\n"); }
screen = DefaultScreen(display); root = RootWindow(display, screen);

window = XCreateSimpleWindow (display, root,
                              0, 0, 300, 300, // xpos, ypos, width, height
                              0, 0, // border width, border pixel
                              0  /* background */);
// Add StructureNotifyMask to send us events involving resizing of the window, etc.
XSelectInput (display, window, ExposureMask | StructureNotifyMask);
XMapWindow (display, window);
while (1){
    XEvent e;
    XNextEvent (display, &e);

    // Respond to ConfigureNotify, the type of event sent by the
    // server if the window is resized.
    if (e.type == ConfigureNotify){
        XConfigureEvent xce = e.xconfigure;

        /* This event type is generated for a variety of
           happenings, so check whether the window has been
           resized. */
        syslog(LOG_INFO, "New Width,Height %d,%d", xce.width, xce.height);
    }
}

使用 GTK+ 测试代码

GtkWidget *window;
GdkScreen *screen;

screen = gdk_screen_get_default();
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
syslog(LOG_INFO, "NATIVESUPPORT: startDisplayChangedEventThread(): screen and window objects created.\n");

if (!screen){ syslog(LOG_INFO, "NATIVESUPPORT: screen is null."); }
if (!window){ syslog(LOG_INFO, "NATIVESUPPORT: window is null."); }

g_signal_connect(screen, "size-changed", G_CALLBACK(resize_cb), (gpointer)window);
g_signal_connect(screen, "monitors-changed", G_CALLBACK(resize_cb), (gpointer)window);

syslog(LOG_INFO, "NATIVESUPPORT: startDisplayChangedEventThread(): call back created.\n");

syslog(LOG_INFO, "NATIVESUPPORT: startDisplayChangedEventThread(): starting main.\n");
gtk_main();

【问题讨论】:

    标签: linux gtk xlib


    【解决方案1】:

    解决方案是映射到默认的根窗口。

        display = XOpenDisplay (NULL);
        if (!display)
        {
            syslog(LOG_INFO, "Could not open display.\n");
        }
        screen = DefaultScreen (display);
        root = RootWindow (display, screen);
    
        window = DefaultRootWindow( display );
        if ( 0 > window )
        {
             syslog(LOG_INFO, "Failed to obtain the root windows Id of the default screen of given display.\n");
        }
    
        Status ret = XGetWindowAttributes( display, window, &xwAttr );
        width = xwAttr.width;
        height = xwAttr.height;
    
        XSelectInput (display, window, ExposureMask |
                          /* Add StructureNotifyMask to send us events
                             involving resizing of the window, etc. */
                          StructureNotifyMask);
    
        XMapWindow (display, window);
    

    【讨论】:

    • 感谢未来,我还需要弄清楚如何跟踪窗口分辨率的变化(知道何时重新计算一些屏幕宽x高大小的缓冲区图像)。现在来弄清楚 XCB 是如何做到这一点的...... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    相关资源
    最近更新 更多