diff options
author | Filippo Argiolas <filippo.argiolas@gmail.com> | 2009-04-21 09:14:49 +0200 |
---|---|---|
committer | Filippo Argiolas <filippo.argiolas@gmail.com> | 2009-04-21 16:28:39 +0200 |
commit | 598c01588ecea3f6f5b3b49cf3e6dcf1d091fd99 (patch) | |
tree | 8897deb9fa458db535f6644e327491abd76b6795 | |
parent | 9928fce7e98218e9f04abc18d04d0958382fe6e8 (diff) |
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.
-rw-r--r-- | src/cheese-texture.c | 67 |
1 files 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 * |