[maemo-commits] [maemo-commits] r19486 - in projects/haf/trunk/gtk+: . gdk/x11

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Nov 5 16:26:17 EET 2009
Author: kalikiana
Date: 2009-11-05 16:26:12 +0200 (Thu, 05 Nov 2009)
New Revision: 19486

Modified:
   projects/haf/trunk/gtk+/ChangeLog
   projects/haf/trunk/gtk+/gdk/x11/gdkevents-x11.c
   projects/haf/trunk/gtk+/gdk/x11/gdkscreen-x11.c
Log:
2009-11-05  Christian Dywan  <christian at lanedo.com>

	Fixes: NB#140339 - Unnecessary wake-ups in application due to XAtoms

	* gdk/x11/gdkevents-x11.c (_gdk_events_init),
	(gdk_event_translate), (check_net_wm_check_window),
	(fetch_net_wm_check_window):
	* gdk/x11/gdkscreen-x11.c (_gdk_x11_screen_size_changed): Monitor
	_MAEMO_SCREEN_SIZEwhich is an array on the WM window instead of the
	separate properties on the root window. Based on a patch by Adam Endroi.

Modified: projects/haf/trunk/gtk+/ChangeLog
===================================================================
--- projects/haf/trunk/gtk+/ChangeLog	2009-10-30 10:02:22 UTC (rev 19485)
+++ projects/haf/trunk/gtk+/ChangeLog	2009-11-05 14:26:12 UTC (rev 19486)
@@ -1,3 +1,14 @@
+2009-11-05  Christian Dywan  <christian at lanedo.com>
+
+	Fixes: NB#140339 - Unnecessary wake-ups in application due to XAtoms
+
+	* gdk/x11/gdkevents-x11.c (_gdk_events_init),
+	(gdk_event_translate), (check_net_wm_check_window),
+	(fetch_net_wm_check_window):
+	* gdk/x11/gdkscreen-x11.c (_gdk_x11_screen_size_changed): Monitor
+	_MAEMO_SCREEN_SIZEwhich is an array on the WM window instead of the
+	separate properties on the root window. Based on a patch by Adam Endroi.
+
 2009-10-26  Christian Dywan  <christian at lanedo.com>
 
 	Fixes: NB#128673 - Virtual keypad opened when not

Modified: projects/haf/trunk/gtk+/gdk/x11/gdkevents-x11.c
===================================================================
--- projects/haf/trunk/gtk+/gdk/x11/gdkevents-x11.c	2009-10-30 10:02:22 UTC (rev 19485)
+++ projects/haf/trunk/gtk+/gdk/x11/gdkevents-x11.c	2009-11-05 14:26:12 UTC (rev 19486)
@@ -125,6 +125,9 @@
 				     XSettingsSetting *setting,
 				     void             *data);
 
+static gboolean check_net_wm_check_window (GdkScreenX11 *screen_x11);
+static void fetch_net_wm_check_window     (GdkScreen *screen);
+
 /* Private variable declarations
  */
 
@@ -232,6 +235,13 @@
 					 gdk_atom_intern_static_string ("WM_PROTOCOLS"), 
 					 gdk_wm_protocols_filter,   
 					 NULL);
+
+  /* GdkScreenX11 need this in order to see some properties. */
+  fetch_net_wm_check_window (display_x11->default_screen);
+  if (GDK_SCREEN_X11(display_x11->default_screen)->wmspec_check_window == None)
+    /* No WM, poll for the wm_check window. */
+    g_timeout_add_seconds (10, (GSourceFunc)check_net_wm_check_window,
+                           display_x11->default_screen);
 }
 
 void
@@ -1009,6 +1019,10 @@
 
           /* careful, reentrancy */
           _gdk_x11_screen_window_manager_changed (GDK_SCREEN (screen_x11));
+
+          /* Rediscover the WM window. */
+          g_timeout_add_seconds (10, (GSourceFunc)check_net_wm_check_window,
+                                 screen);
         }
       
       /* Eat events on this window unless someone had wrapped
@@ -1912,13 +1926,11 @@
 			   "\""));
 
 #ifdef MAEMO_CHANGES
-      /* Check for maemo specific width/height change. Height is always
-       * changed last, so we only check on that. This allows us to relayout
-       * apps that depend on GdkScreen for orientation, *before* we do the
-       * real XRandR rotate.
+      /* Check for maemo specific size change. This allows us to relayout apps
+       * that depend on GdkScreen for orientation, *before* real XRandR rotate.
        */
       if (xevent->xproperty.atom ==
-          gdk_x11_get_xatom_by_name_for_display (display, "_MAEMO_SCREEN_HEIGHT"))
+          gdk_x11_get_xatom_by_name_for_display (display, "_MAEMO_SCREEN_SIZE"))
         {
           _gdk_x11_screen_size_changed (screen, xevent);
         }
@@ -2616,6 +2628,14 @@
   return xevent.xproperty.time;
 }
 
+static gboolean
+check_net_wm_check_window (GdkScreenX11 *screen_x11)
+{
+  if (screen_x11->wmspec_check_window == None)
+    fetch_net_wm_check_window (GDK_SCREEN (screen_x11));
+  return screen_x11->wmspec_check_window == None;
+}
+
 static void
 fetch_net_wm_check_window (GdkScreen *screen)
 {
@@ -2670,9 +2690,14 @@
 
   if (gdk_error_trap_pop () == Success)
     {
+      GdkWindow *window;
+
+      /* We need to create a Gdkwindow in order to notice its destruction. */
       screen_x11->wmspec_check_window = *xwindow;
       screen_x11->need_refetch_net_supported = TRUE;
       screen_x11->need_refetch_wm_name = TRUE;
+      window = gdk_window_foreign_new_for_display (display, *xwindow);
+      gdk_window_set_events (window, GDK_PROPERTY_CHANGE_MASK);
       
       /* Careful, reentrancy */
       _gdk_x11_screen_window_manager_changed (GDK_SCREEN (screen_x11));

Modified: projects/haf/trunk/gtk+/gdk/x11/gdkscreen-x11.c
===================================================================
--- projects/haf/trunk/gtk+/gdk/x11/gdkscreen-x11.c	2009-10-30 10:02:22 UTC (rev 19485)
+++ projects/haf/trunk/gtk+/gdk/x11/gdkscreen-x11.c	2009-11-05 14:26:12 UTC (rev 19486)
@@ -896,39 +896,37 @@
 {
   gint width, height;
 #ifdef MAEMO_CHANGES
-  GdkWindow *root_window;
-  GdkAtom type;
-  guchar *rwidth = NULL, *rheight = NULL;
-  gboolean has_props = FALSE;
+  GdkDisplay *display;
+  GdkWindow *window;
+  gint32 *maemo_screen_size = NULL;
 #endif /* MAEMO_CHANGES */
 
   width = gdk_screen_get_width (screen);
   height = gdk_screen_get_height (screen);
 
 #ifdef MAEMO_CHANGES
-  /* The SCREEN_WIDTH/SCREEN_HEIGHT properties allow hildon-desktop to
+  /* The _MAEMO_SCREEN_SIZE property allows hildon-desktop to
    * resize/relayout applications to the correct orientation before
    * XRandR rotation actually happens.
    */
 
-  root_window = gdk_screen_get_root_window (screen);
-  type = gdk_atom_intern ("CARDINAL", FALSE);
+  if (GDK_SCREEN_X11 (screen)->wmspec_check_window == None)
+    return;
 
-  gdk_property_get (root_window,
-                    gdk_atom_intern_static_string ("_MAEMO_SCREEN_WIDTH"),
-                    type,
-                    0, 32, FALSE, 0, 0, 0, (guchar **) &rwidth);
-  gdk_property_get (root_window,
-                    gdk_atom_intern_static_string ("_MAEMO_SCREEN_HEIGHT"),
-                    type,
-                    0, 32, FALSE, 0, 0, 0, (guchar **) &rheight);
+  display = gdk_screen_get_display (screen);
+  if (!(window = gdk_window_lookup_for_display (display,
+                          GDK_SCREEN_X11 (screen)->wmspec_check_window)))
+    return;
 
-  if (rwidth && rheight)
+  if (gdk_property_get (window,
+                    gdk_atom_intern_static_string ("_MAEMO_SCREEN_SIZE"),
+                    gdk_atom_intern ("CARDINAL", FALSE),
+                    0, 8, FALSE, 0, 0, 0, (guchar **) &maemo_screen_size))
     {
       gint prop_width, prop_height;
 
-      prop_width = *(gint *)rwidth;
-      prop_height = *(gint *)rheight;
+      prop_width = maemo_screen_size[0];
+      prop_height = maemo_screen_size[1];
 
       if (prop_width != width || prop_height != height)
         {
@@ -940,18 +938,10 @@
           g_signal_emit_by_name (screen, "size_changed");
         }
 
-      has_props = TRUE;
+      g_free (maemo_screen_size);
+      /* Ignore XRandR */
+      return;
     }
-
-  if (rwidth)
-    g_free (rwidth);
-
-  if (rheight)
-    g_free (rheight);
-
-  /* If we had properties, return and ignore XRandR */
-  if (has_props)
-    return;
 #endif /* MAEMO_CHANGES */
 
 #ifdef HAVE_RANDR

More information about the maemo-commits mailing list