2013-06-03 1 views
4

Я пишу небольшую собственную процедуру, чтобы уведомить другой процесс, что пользователь изменил разрешение экрана. Я попытался использовать gtk, но он нестабилен для некомпонентных оконных менеджеров и часто возникает сбой. Я изучаю xlib и имею пример работы, который уведомляет меня, когда изменяется размер сгенерированного X Window, но я не могу понять, как получить уведомление о том, что разрешение экрана изменилось. Любая помощь будет оценена по достоинству. Я включаю свой тестовый код xlib и тестовый код gtk +, который, как указано, сильно падает при использовании составных оконных менеджеров.Как использовать xlib для прослушивания изменений разрешения экрана в Linux

Вот мой тестовый код с помощью 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(); 

ответ

2

Решением было картографирование корневого окна по умолчанию.

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);