title: How to use xlib to listen for screen resolution changes on Linux
body: <p>I'm writing a little native routine to notify another process that the user has changed the screen resolution.  I tried using gtk but it's unstable on non composite window managers and crashes often.  I'm looking into xlib and have a sample working that notifies me when a generated X Window's size is changed but I can't figure out how to get notified that the screen resolution has changed.  Any help would be appreciated.  I'm including my xlib test code and gtk+ test code which as indicated crashes a lot when using non composite window managers.</p>
  
  <p>Here is my test code using xlib</p>
  
  <pre><code>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, &amp;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);
      }
  }
  </code></pre>
  
  <p>Test code using GTK+</p>
  
  <pre><code>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();
  </code></pre>