summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLionel Landwerlin <llandwerlin@gmail.com>2012-03-17 23:03:51 +0000
committerLionel Landwerlin <llandwerlin@gmail.com>2012-03-17 23:38:08 +0000
commit3cf4c9980ffcc9ef1bf63d8eed255d1634c4a2f6 (patch)
treea517a29638f3e8eccd79dcd0dcc56dfda8527fde
parent5209a8a59b2c4c17ef6cbb78cc407e7854c4d566 (diff)
downloadclutter-3cf4c9980ffcc9ef1bf63d8eed255d1634c4a2f6.tar.gz
x11/stage: fix multi-stage support
When handling Configure events from the X server we update the internal copy of the window size. Unfortunately we may be updating the wrong stage implementation because we use the one related to the event translator (which is the first created stage). This patch fix flickering/redrawning issues with multi-stage by looking for the right stage implementation associated with an XEvent. Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@linux.intel.com>
-rw-r--r--clutter/x11/clutter-stage-x11.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/clutter/x11/clutter-stage-x11.c b/clutter/x11/clutter-stage-x11.c
index 457cf9ddb..2d438290a 100644
--- a/clutter/x11/clutter-stage-x11.c
+++ b/clutter/x11/clutter-stage-x11.c
@@ -54,6 +54,8 @@
static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface);
static void clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface);
+static ClutterStageX11 *clutter_x11_get_stage_window_from_window (Window win);
+
static GHashTable *clutter_stages_by_xid = NULL;
#define clutter_stage_x11_get_type _clutter_stage_x11_get_type
@@ -868,17 +870,21 @@ clutter_stage_x11_translate_event (ClutterEventTranslator *translator,
gpointer native,
ClutterEvent *event)
{
- ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (translator);
+ ClutterStageX11 *stage_x11;
ClutterTranslateReturn res = CLUTTER_TRANSLATE_CONTINUE;
- ClutterBackendX11 *backend_x11 = stage_x11->backend;
- Window stage_xwindow = stage_x11->xwin;
+ ClutterBackendX11 *backend_x11;
+ Window stage_xwindow;
XEvent *xevent = native;
ClutterStage *stage;
- stage = clutter_x11_get_stage_from_window (xevent->xany.window);
- if (stage == NULL)
+ stage_x11 = clutter_x11_get_stage_window_from_window (xevent->xany.window);
+ if (stage_x11 == NULL)
return CLUTTER_TRANSLATE_CONTINUE;
+ stage = stage_x11->wrapper;
+ backend_x11 = stage_x11->backend;
+ stage_xwindow = stage_x11->xwin;
+
switch (xevent->type)
{
case ConfigureNotify:
@@ -1164,11 +1170,21 @@ clutter_x11_get_stage_window (ClutterStage *stage)
return CLUTTER_STAGE_X11 (impl)->xwin;
}
+static ClutterStageX11 *
+clutter_x11_get_stage_window_from_window (Window win)
+{
+ if (clutter_stages_by_xid == NULL)
+ return NULL;
+
+ return g_hash_table_lookup (clutter_stages_by_xid,
+ GINT_TO_POINTER (win));
+}
+
/**
* clutter_x11_get_stage_from_window:
* @win: an X Window ID
*
- * Gets the stage for a particular X window.
+ * Gets the stage for a particular X window.
*
* Return value: (transfer none): A #ClutterStage, or% NULL if a stage
* does not exist for the window
@@ -1180,11 +1196,7 @@ clutter_x11_get_stage_from_window (Window win)
{
ClutterStageX11 *stage_x11;
- if (clutter_stages_by_xid == NULL)
- return NULL;
-
- stage_x11 = g_hash_table_lookup (clutter_stages_by_xid,
- GINT_TO_POINTER (win));
+ stage_x11 = clutter_x11_get_stage_window_from_window (win);
if (stage_x11 != NULL)
return stage_x11->wrapper;