[gtk+] Emit monitors-changed signal when appropriate



commit 63e2f54516329cd54509e87e417905d73277eb9e
Author: Kristian Rietveld <kris gtk org>
Date:   Sat Oct 24 12:25:29 2009 +0200

    Emit monitors-changed signal when appropriate

 gdk/quartz/gdkscreen-quartz.c |   25 ++++++++++++++++++++-----
 gdk/quartz/gdkscreen-quartz.h |    2 ++
 2 files changed, 22 insertions(+), 5 deletions(-)
---
diff --git a/gdk/quartz/gdkscreen-quartz.c b/gdk/quartz/gdkscreen-quartz.c
index 68ca377..ac22590 100644
--- a/gdk/quartz/gdkscreen-quartz.c
+++ b/gdk/quartz/gdkscreen-quartz.c
@@ -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);
diff --git a/gdk/quartz/gdkscreen-quartz.h b/gdk/quartz/gdkscreen-quartz.h
index a67401d..370e876 100644
--- a/gdk/quartz/gdkscreen-quartz.h
+++ b/gdk/quartz/gdkscreen-quartz.h
@@ -47,6 +47,8 @@ struct _GdkScreenQuartz
   GdkRectangle *screen_rects;
 
   guint screen_changed_id;
+
+  guint emit_monitors_changed : 1;
 };
 
 struct _GdkScreenQuartzClass



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]