Я пишу небольшую собственную процедуру, чтобы уведомить другой процесс, что пользователь изменил разрешение экрана. Я попытался использовать 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();