summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippo Argiolas <filippo.argiolas@gmail.com>2009-04-21 09:14:49 +0200
committerFilippo Argiolas <filippo.argiolas@gmail.com>2009-04-21 16:28:39 +0200
commit598c01588ecea3f6f5b3b49cf3e6dcf1d091fd99 (patch)
tree8897deb9fa458db535f6644e327491abd76b6795
parent9928fce7e98218e9f04abc18d04d0958382fe6e8 (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.c67
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 *