]> Pileus Git - ~andy/gtk/commitdiff
Emit monitors-changed signal when appropriate
authorKristian Rietveld <kris@gtk.org>
Sat, 24 Oct 2009 10:25:29 +0000 (12:25 +0200)
committerKristian Rietveld <kris@gtk.org>
Mon, 26 Oct 2009 08:52:53 +0000 (09:52 +0100)
gdk/quartz/gdkscreen-quartz.c
gdk/quartz/gdkscreen-quartz.h

index 68ca3776ce01e7d0b3d69368ee9b998d5b88185d..ac2259049b87f0c7eb48483fe45ae86a0802826b 100644 (file)
@@ -60,6 +60,8 @@ _gdk_screen_quartz_init (GdkScreenQuartz *screen_quartz)
 
   CGDisplayRegisterReconfigurationCallback (display_reconfiguration_callback,
                                             screen);
+
+  screen_quartz->emit_monitors_changed = FALSE;
 }
 
 static void
@@ -187,6 +189,12 @@ process_display_reconfiguration (GdkScreenQuartz *screen)
   if (width != gdk_screen_get_width (GDK_SCREEN (screen))
       || height != gdk_screen_get_height (GDK_SCREEN (screen)))
     g_signal_emit_by_name (_gdk_screen, "size-changed");
+
+  if (screen->emit_monitors_changed)
+    {
+      g_signal_emit_by_name (screen, "monitors-changed");
+      screen->emit_monitors_changed = FALSE;
+    }
 }
 
 static gboolean
@@ -211,18 +219,25 @@ display_reconfiguration_callback (CGDirectDisplayID            display,
   if (flags & kCGDisplayBeginConfigurationFlag)
     {
       /* Ignore the begin configuration signal. */
-
-      /* FIXME: We can most probably use this flag to properly
-       * emit monitors-changed.
-       */
       return;
     }
   else
     {
+      /* We save information about the changes, so we can emit
+       * ::monitors-changed when appropriate.  This signal must be
+       * emitted when the number, size of position of one of the
+       * monitors changes.
+       */
+      if (flags & kCGDisplayMovedFlag
+          || flags & kCGDisplayAddFlag
+          || flags & kCGDisplayRemoveFlag
+          || flags & kCGDisplayEnabledFlag
+          || flags & kCGDisplayDisabledFlag)
+        screen->emit_monitors_changed = TRUE;
+
       /* At this point Cocoa does not know about the new screen data
        * yet, so we delay our refresh into an idle handler.
        */
-
       if (!screen->screen_changed_id)
         screen->screen_changed_id = gdk_threads_add_idle (screen_changed_idle,
                                                           screen);
index a67401d03f15609c9c7f54550eb1dd7ed35a479e..370e876984310f40758228b7318d1de577397804 100644 (file)
@@ -47,6 +47,8 @@ struct _GdkScreenQuartz
   GdkRectangle *screen_rects;
 
   guint screen_changed_id;
+
+  guint emit_monitors_changed : 1;
 };
 
 struct _GdkScreenQuartzClass