6

ユーザーが画面解像度を変更したことを別のプロセスに通知する小さなネイティブ ルーチンを作成しています。gtk を使用してみましたが、非複合ウィンドウ マネージャーでは不安定で、頻繁にクラッシュします。xlib を調べていて、生成された X ウィンドウのサイズが変更されたときに通知するサンプルが動作していますが、画面の解像度が変更されたことを通知する方法がわかりません。どんな助けでも大歓迎です。私は 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();
4

1 に答える 1

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);
于 2013-06-04T00:16:48.663 に答える