[maemo-commits] [maemo-commits] r18561 - in projects/haf/trunk/libmatchbox2: . matchbox/comp-mgr
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Mon Jun 1 13:33:13 EEST 2009
- Previous message: [maemo-commits] r18560 - in projects/haf/trunk/hildon-thumbnail: . daemon
- Next message: [maemo-commits] r18562 - in projects/haf/trunk/clutter0.8: debian tests
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: kihamala
Date: 2009-06-01 13:33:02 +0300 (Mon, 01 Jun 2009)
New Revision: 18561
Modified:
projects/haf/trunk/libmatchbox2/ChangeLog
projects/haf/trunk/libmatchbox2/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c
projects/haf/trunk/libmatchbox2/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.h
Log:
fixes for non-composited mode: now we don't listen to damage events and
consume CPU...
Modified: projects/haf/trunk/libmatchbox2/ChangeLog
===================================================================
--- projects/haf/trunk/libmatchbox2/ChangeLog 2009-06-01 09:00:11 UTC (rev 18560)
+++ projects/haf/trunk/libmatchbox2/ChangeLog 2009-06-01 10:33:02 UTC (rev 18561)
@@ -3,6 +3,17 @@
* matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c
(mb_wm_comp_mgr_clutter_handle_damage): Don't handle damage in
non-composited mode.
+ (mb_wm_comp_mgr_clutter_client_track_damage): New function to toggle
+ damage event subscription on/off.
+ (mb_wm_comp_mgr_clutter_map_notify_real): Call
+ mb_wm_comp_mgr_clutter_client_track_damage to setup damage tracking.
+ Tries to handle the case when damage tracking is re-enabled after a
+ pause in the tracking.
+ (mb_wm_comp_mgr_clutter_client_destroy): Call
+ mb_wm_comp_mgr_clutter_client_track_damage to tear down damage
+ tracking.
+ (mb_wm_comp_mgr_clutter_fetch_texture): Set bound=FALSE if the window
+ is invalid (allows the caller to check for success).
Release 0.2.41
Modified: projects/haf/trunk/libmatchbox2/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c 2009-06-01 09:00:11 UTC (rev 18560)
+++ projects/haf/trunk/libmatchbox2/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c 2009-06-01 10:33:02 UTC (rev 18561)
@@ -207,6 +207,7 @@
{
g_debug ("%s: BadDrawable for %lx", __FUNCTION__,
client->wm_client->window->xwindow);
+ cclient->priv->bound = FALSE;
return;
}
@@ -282,9 +283,7 @@
static void
mb_wm_comp_mgr_clutter_client_destroy (MBWMObject* obj)
{
- MBWMCompMgrClient * c = MB_WM_COMP_MGR_CLIENT (obj);
- MBWMCompMgrClutterClient * cclient = MB_WM_COMP_MGR_CLUTTER_CLIENT (obj);
- MBWindowManager * wm = c->wm;
+ MBWMCompMgrClutterClient *cclient = MB_WM_COMP_MGR_CLUTTER_CLIENT (obj);
/* We just unref our actors here and clutter will free them if required */
if (cclient->priv->actor)
@@ -330,19 +329,8 @@
}
if (cclient->priv->window_damage)
- {
- int err;
+ mb_wm_comp_mgr_clutter_client_track_damage (cclient, False);
- /* Sing after me: "untrap" without XSync() is un*re*li*ab*le! */
- mb_wm_util_trap_x_errors();
- XDamageDestroy (wm->xdpy, cclient->priv->window_damage);
- XSync (wm->xdpy, False);
- if ((err = mb_wm_util_untrap_x_errors()) != 0)
- g_debug ("XDamageDestroy(0x%lx) for %p: %d",
- cclient->priv->window_damage, c, err);
- cclient->priv->window_damage = 0;
- }
-
free (cclient->priv);
cclient->priv = NULL;
}
@@ -809,8 +797,7 @@
Damage damage;
if (wm->non_redirection)
- /* TODO: remember to refresh the client when we return to
- * composited mode */
+ /* avoid some Clutter/EGL errors when in non-composited mode */
return False;
c = mb_wm_managed_client_from_frame (wm, de->drawable);
@@ -992,6 +979,59 @@
}
}
+/* Enable/disable damage tracking for a client */
+void
+mb_wm_comp_mgr_clutter_client_track_damage (MBWMCompMgrClutterClient *cclient,
+ Bool track_damage)
+{
+ MBWindowManager *wm = MB_WM_COMP_MGR_CLIENT (cclient)->wm;
+ MBWindowManagerClient *c = MB_WM_COMP_MGR_CLIENT (cclient)->wm_client;
+
+ /* printf ("%s: client win %lx\n", __func__,
+ c && c->window ? c->window->xwindow : 0); */
+
+ if (track_damage)
+ {
+ if (!cclient->priv->window_damage)
+ {
+ cclient->priv->window_damage = XDamageCreate (wm->xdpy,
+ c->window->xwindow,
+ XDamageReportNonEmpty);
+
+ /* re-fetch the texture if there was an old texture, because it has
+ * probably missed damage events */
+ if (cclient->priv->texture)
+ {
+ guint w, h;
+
+ mb_wm_comp_mgr_clutter_fetch_texture (
+ MB_WM_COMP_MGR_CLIENT (cclient));
+
+ if (cclient->priv->bound)
+ {
+ clutter_actor_get_size (cclient->priv->texture, &w, &h);
+ clutter_x11_texture_pixmap_update_area (
+ CLUTTER_X11_TEXTURE_PIXMAP (cclient->priv->texture),
+ 0, 0, w, h);
+ }
+ }
+ }
+ }
+ else if (cclient->priv->window_damage)
+ {
+ int err;
+
+ /* Sing after me: "untrap" without XSync() is un*re*li*ab*le! */
+ mb_wm_util_trap_x_errors();
+ XDamageDestroy (wm->xdpy, cclient->priv->window_damage);
+ XSync (wm->xdpy, False);
+ if ((err = mb_wm_util_untrap_x_errors()) != 0)
+ g_debug ("XDamageDestroy(0x%lx) for %p: %d",
+ cclient->priv->window_damage, c, err);
+ cclient->priv->window_damage = 0;
+ }
+}
+
static void
mb_wm_comp_mgr_clutter_map_notify_real (MBWMCompMgr *mgr,
MBWindowManagerClient *c)
@@ -999,7 +1039,6 @@
MBWMCompMgrClutter * cmgr = MB_WM_COMP_MGR_CLUTTER (mgr);
MBWMCompMgrClient * client = c->cm_client;
MBWMCompMgrClutterClient * cclient = MB_WM_COMP_MGR_CLUTTER_CLIENT(client);
- MBWindowManager * wm = client->wm;
ClutterActor * texture;
#if SGX_CORRUPTION_WORKAROUND
MBWMClientType ctype = MB_WM_CLIENT_CLIENT_TYPE (c);
@@ -1032,9 +1071,7 @@
cclient->priv->flags |= MBWMCompMgrClutterClientMapped;
- cclient->priv->window_damage = XDamageCreate (wm->xdpy,
- c->window->xwindow,
- XDamageReportNonEmpty);
+ mb_wm_comp_mgr_clutter_client_track_damage (cclient, True);
g_snprintf(actor_name, 64, "window_0x%lx", c->window->xwindow);
clutter_actor_set_name(cclient->priv->actor, actor_name);
@@ -1079,7 +1116,8 @@
clutter_actor_set_visibility_detect(texture, TRUE);
clutter_actor_show (texture);
- clutter_container_add_actor (CLUTTER_CONTAINER (cclient->priv->actor), texture);
+ clutter_container_add_actor (CLUTTER_CONTAINER (cclient->priv->actor),
+ texture);
/* We want to lower this below any decor */
clutter_actor_lower_bottom(texture);
Modified: projects/haf/trunk/libmatchbox2/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.h
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.h 2009-06-01 09:00:11 UTC (rev 18560)
+++ projects/haf/trunk/libmatchbox2/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.h 2009-06-01 10:33:02 UTC (rev 18561)
@@ -107,6 +107,10 @@
mb_wm_comp_mgr_clutter_client_unset_flags (MBWMCompMgrClutterClient *cclient,
MBWMCompMgrClutterClientFlags flags);
+void
+mb_wm_comp_mgr_clutter_client_track_damage (MBWMCompMgrClutterClient *cclient,
+ Bool track_damage);
+
MBWMCompMgrClutterClientFlags
mb_wm_comp_mgr_clutter_client_get_flags (MBWMCompMgrClutterClient *cclient);
- Previous message: [maemo-commits] r18560 - in projects/haf/trunk/hildon-thumbnail: . daemon
- Next message: [maemo-commits] r18562 - in projects/haf/trunk/clutter0.8: debian tests
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
