gtk+ r22398 - in trunk: . gdk/x11



Author: matthiasc
Date: Tue Feb 24 05:09:13 2009
New Revision: 22398
URL: http://svn.gnome.org/viewvc/gtk+?rev=22398&view=rev

Log:
        * gdk/x11/gdkevents-x11.c:
        * gdk/x11/gdkscreen-x11.[hc]: Another attempt at getting Xrandr
        screen size changes right. Actually handle XRRScreenChangeNotify
        events, and ignore root ConfigureNotify events if we are using
        Xrandr. Only emit size-changed signals if the screen size changed,
        and only emit monitor-changed signals if the monitors changed.



Modified:
   trunk/ChangeLog
   trunk/gdk/x11/gdkevents-x11.c
   trunk/gdk/x11/gdkscreen-x11.c
   trunk/gdk/x11/gdkscreen-x11.h

Modified: trunk/gdk/x11/gdkevents-x11.c
==============================================================================
--- trunk/gdk/x11/gdkevents-x11.c	(original)
+++ trunk/gdk/x11/gdkevents-x11.c	Tue Feb 24 05:09:13 2009
@@ -2107,10 +2107,11 @@
       else
 #endif
 #ifdef HAVE_RANDR
-      if (xevent->type - display_x11->xrandr_event_base == RRNotify)
+      if (xevent->type - display_x11->xrandr_event_base == RRScreenChangeNotify ||
+          xevent->type - display_x11->xrandr_event_base == RRNotify)
 	{
           if (screen)
-            _gdk_x11_screen_process_monitors_change (screen);
+            _gdk_x11_screen_size_changed (screen, xevent);
 	}
       else
 #endif

Modified: trunk/gdk/x11/gdkscreen-x11.c
==============================================================================
--- trunk/gdk/x11/gdkscreen-x11.c	(original)
+++ trunk/gdk/x11/gdkscreen-x11.c	Tue Feb 24 05:09:13 2009
@@ -1,4 +1,4 @@
-/*
+ /*
  * gdkscreen-x11.c
  * 
  * Copyright 2001 Sun Microsystems Inc. 
@@ -857,33 +857,78 @@
 }
 
 static void
-deinit_multihead (GdkScreen *screen)
+free_monitors (GdkX11Monitor *monitors,
+               gint           n_monitors)
 {
-  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
   int i;
 
-  for (i = 0; i < screen_x11->n_monitors; ++i)
+  for (i = 0; i < n_monitors; ++i)
     {
-      GdkX11Monitor *monitor = get_monitor (screen, i);
-
-      g_free (monitor->output_name);
-      g_free (monitor->manufacturer);
+      g_free (monitors[i].output_name);
+      g_free (monitors[i].manufacturer);
     }
 
-  g_free (screen_x11->monitors);
+  g_free (monitors);
+}
+
+static void
+deinit_multihead (GdkScreen *screen)
+{
+  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
+
+  free_monitors (screen_x11->monitors, screen_x11->n_monitors);
 
   screen_x11->n_monitors = 0;
   screen_x11->monitors = NULL;
 }
 
+static gboolean
+compare_monitor (GdkX11Monitor *m1,
+                 GdkX11Monitor *m2)
+{
+  if (m1->geometry.x != m2->geometry.x ||
+      m1->geometry.y != m2->geometry.y ||
+      m1->geometry.width != m2->geometry.width ||
+      m1->geometry.height != m2->geometry.height)
+    return FALSE;
+
+  if (m1->width_mm != m2->width_mm ||
+      m1->height_mm != m2->height_mm)
+    return FALSE;
+
+  if (g_strcmp0 (m1->output_name, m2->output_name) != 0)
+    return FALSE;
+
+  if (g_strcmp0 (m1->manufacturer, m2->manufacturer) != 0)
+    return FALSE;
+
+  return TRUE;
+}
+
+static gboolean
+compare_monitors (GdkX11Monitor *monitors1, gint n_monitors1,
+                  GdkX11Monitor *monitors2, gint n_monitors2)
+{
+  gint i;
+
+  if (n_monitors1 != n_monitors2)
+    return FALSE;
+
+  for (i = 0; i < n_monitors1; i++)
+    {
+      if (!compare_monitor (monitors1 + i, monitors2 + i))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
 static void
 init_multihead (GdkScreen *screen)
 {
   GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
   int opcode, firstevent, firsterror;
 
-  deinit_multihead (screen);
-  
   /* There are four different implementations of multihead support: 
    *
    *  1. Fake Xinerama for debugging purposes
@@ -995,18 +1040,49 @@
 #endif
 }
 
+static void
+process_monitors_change (GdkScreen *screen)
+{
+  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
+  gint		 n_monitors;
+  GdkX11Monitor	*monitors;
+  gboolean changed;
+
+  n_monitors = screen_x11->n_monitors;
+  monitors = screen_x11->monitors;
+
+  screen_x11->n_monitors = 0;
+  screen_x11->monitors = NULL;
+
+  init_multihead (screen);
+
+  changed = !compare_monitors (monitors, n_monitors,
+                               screen_x11->monitors, screen_x11->n_monitors);
+
+  free_monitors (monitors, n_monitors);
+
+  if (changed)
+    g_signal_emit_by_name (screen, "monitors-changed");
+}
+
 void
 _gdk_x11_screen_size_changed (GdkScreen *screen,
 			      XEvent    *event)
 {
   gint width, height;
+  GdkDisplayX11 *display_x11;
+  gboolean monitors_changed;
 
   width = gdk_screen_get_width (screen);
   height = gdk_screen_get_height (screen);
 
 #ifdef HAVE_RANDR
-  if (!XRRUpdateConfiguration (event))
+  display_x11 = GDK_DISPLAY_X11 (gdk_screen_get_display (screen));
+
+  if (display_x11->have_randr13 && event->type == ConfigureNotify)
     return;
+
+  XRRUpdateConfiguration (event);
 #else
   if (event->type == ConfigureNotify)
     {
@@ -1020,21 +1096,11 @@
     return;
 #endif
 
-  if (width == gdk_screen_get_width (screen) && 
-      height == gdk_screen_get_height (screen))
-    return;
-
-  _gdk_x11_screen_process_monitors_change (screen);
-
-  g_signal_emit_by_name (screen, "size-changed");
-}
-
-void
-_gdk_x11_screen_process_monitors_change (GdkScreen *screen)
-{
-  init_multihead (screen);
+  process_monitors_change (screen);
 
-  g_signal_emit_by_name (screen, "monitors-changed");
+  if (width != gdk_screen_get_width (screen) ||
+      height != gdk_screen_get_height (screen))
+    g_signal_emit_by_name (screen, "size-changed");
 }
 
 void
@@ -1061,7 +1127,7 @@
 	{
 	  screen_x11->is_composited = composited;
 
-	  g_signal_emit_by_name (screen, "composited_changed");
+	  g_signal_emit_by_name (screen, "composited-changed");
 	}
     }
 #endif

Modified: trunk/gdk/x11/gdkscreen-x11.h
==============================================================================
--- trunk/gdk/x11/gdkscreen-x11.h	(original)
+++ trunk/gdk/x11/gdkscreen-x11.h	Tue Feb 24 05:09:13 2009
@@ -125,9 +125,8 @@
 void _gdk_x11_screen_window_manager_changed (GdkScreen *screen);
 void _gdk_x11_screen_size_changed           (GdkScreen *screen,
 					     XEvent    *event);
-void _gdk_x11_screen_process_owner_change (GdkScreen *screen,
-					   XEvent    *event);
-void _gdk_x11_screen_process_monitors_change (GdkScreen *screen);
+void _gdk_x11_screen_process_owner_change   (GdkScreen *screen,
+					     XEvent    *event);
 
 G_END_DECLS
 



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