我正在写一个小的本地例程来通知另一个进程用户已经更改了屏幕分辨率。我尝试使用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();
答案 0 :(得分:3)
解决方案是映射到默认的根窗口。
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);