Mailing List Archive

r19486 - in projects/haf/trunk/gtk+: . gdk/x11
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@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@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@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

_______________________________________________
maemo-commits mailing list
maemo-commits@maemo.org
https://lists.maemo.org/mailman/listinfo/maemo-commits