From 598c01588ecea3f6f5b3b49cf3e6dcf1d091fd99 Mon Sep 17 00:00:00 2001 From: Filippo Argiolas Date: Tue, 21 Apr 2009 09:14:49 +0200 Subject: Forward useful x11 events to clutter Turns out I completely missed clutter_x11_handle_event function. This way I can forward structure and damage events to clutterx11tfp to make it manually handle them. This way automatic-updates works again. Btw, it seems that it works correctly even if autoupdates is FALSE but I still have to figure out why. --- src/cheese-texture.c | 67 ++++++++++------------------------------------------ 1 file changed, 12 insertions(+), 55 deletions(-) diff --git a/src/cheese-texture.c b/src/cheese-texture.c index e61d26f..89b08a7 100644 --- a/src/cheese-texture.c +++ b/src/cheese-texture.c @@ -43,8 +43,6 @@ struct _CheeseTexturePrivate /* stuff */ Window parent; GdkWindow *gdk_window; - Damage damage; - Drawable damage_drawable; }; static int _damage_event_base = 0; @@ -57,6 +55,7 @@ gdk_filter (GdkXEvent *xevent, GdkEvent *event, gpointer data) CheeseTexturePrivate *priv = self->priv = CHEESE_TEXTURE_GET_PRIVATE (self); Display *dpy; Window win, toplevel; + ClutterX11FilterReturn ret; dpy = clutter_x11_get_default_display(); win = GDK_WINDOW_XID (priv->gdk_window); @@ -64,53 +63,18 @@ gdk_filter (GdkXEvent *xevent, GdkEvent *event, gpointer data) if (xev->xany.window == win) { switch (xev->type) { - case ConfigureNotify: - case MapNotify: - clutter_x11_texture_pixmap_sync_window (CLUTTER_X11_TEXTURE_PIXMAP (self)); - break; - case UnmapNotify: - break; + case ConfigureNotify: + case MapNotify: + case UnmapNotify: + case DestroyNotify: + ret = clutter_x11_handle_event (xev); + if (ret == CLUTTER_X11_FILTER_REMOVE) return GDK_FILTER_REMOVE; + break; } - if (xev->type == _damage_event_base + XDamageNotify) + if (xev->type == _damage_event_base + XDamageNotify) /* switch doesn't allow non-constant case labels */ { - XserverRegion parts; - gint i, r_count; - XRectangle *r_damage; - XRectangle r_bounds; - XDamageNotifyEvent *dev = (XDamageNotifyEvent*)xev; - - if (dev->drawable != priv->damage_drawable) - return GDK_FILTER_CONTINUE; - - clutter_x11_trap_x_errors (); - /* - * Retrieve the damaged region and break it down into individual - * rectangles so we do not have to update the whole shebang. - */ - parts = XFixesCreateRegion (dpy, 0, 0); - XDamageSubtract (dpy, priv->damage, None, parts); - - r_damage = XFixesFetchRegionAndBounds (dpy, - parts, - &r_count, - &r_bounds); - - clutter_x11_untrap_x_errors (); - - if (r_damage) - { - for (i = 0; i < r_count; ++i) - clutter_x11_texture_pixmap_update_area (CLUTTER_X11_TEXTURE_PIXMAP (self), - r_damage[i].x, - r_damage[i].y, - r_damage[i].width, - r_damage[i].height); - XFree (r_damage); - XSync (dpy, FALSE); - } - - XFixesDestroyRegion (dpy, parts); - return GDK_FILTER_REMOVE; + ret = clutter_x11_handle_event (xev); + if (ret == CLUTTER_X11_FILTER_REMOVE) return GDK_FILTER_REMOVE; } } else if (xev->xany.window == toplevel) { @@ -253,17 +217,10 @@ cheese_texture_init (CheeseTexture * self) } // else g_message ("event base: %d", _damage_event_base); - priv->damage_drawable = GDK_WINDOW_XID (window); - priv->damage = XDamageCreate (disp, - priv->damage_drawable, - XDamageReportNonEmpty); - - XSync (disp, FALSE); - gdk_window_add_filter (NULL, gdk_filter, self); // g_message ("toplevel is %d", GDK_WINDOW_XID (gdk_window_get_toplevel (window))); - g_object_set (self, "window", GDK_WINDOW_XID (window), NULL); + g_object_set (self, "window", GDK_WINDOW_XID (window), "automatic-updates", TRUE, NULL); } ClutterActor * -- cgit v1.2.3