From 30cce735ea1636d00785c522889fcce6e70e0988 Mon Sep 17 00:00:00 2001 From: Tomas Frydrych Date: Wed, 5 Mar 2008 13:58:13 +0000 Subject: [PATCH] 2008-03-05 Tomas Frydrych * matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c: * matchbox/comp-mgr/mb-wm-comp-mgr-clutter.h: * matchbox/comp-mgr/mb-wm-comp-mgr.c: * matchbox/comp-mgr/mb-wm-comp-mgr.h: * matchbox/core/mb-wm-client.c: * matchbox/core/mb-wm-types.h: * matchbox/theme-engines/mb-wm-theme-xml.c: * matchbox/theme-engines/mb-wm-theme-xml.h: * matchbox/theme-engines/mb-wm-theme.c: * matchbox/theme-engines/mb-wm-theme.h: Simplified effect framework (effect are no longer themeable). --- ChangeLog | 14 + matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c | 718 ++++++--------------- matchbox/comp-mgr/mb-wm-comp-mgr-clutter.h | 13 - matchbox/comp-mgr/mb-wm-comp-mgr.c | 291 +-------- matchbox/comp-mgr/mb-wm-comp-mgr.h | 58 +- matchbox/core/mb-wm-client.c | 4 +- matchbox/core/mb-wm-types.h | 33 - matchbox/theme-engines/mb-wm-theme-xml.c | 24 - matchbox/theme-engines/mb-wm-theme-xml.h | 5 - matchbox/theme-engines/mb-wm-theme.c | 306 --------- matchbox/theme-engines/mb-wm-theme.h | 26 - 11 files changed, 256 insertions(+), 1236 deletions(-) diff --git a/ChangeLog b/ChangeLog index 773dc75..c56cbfc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2008-03-05 Tomas Frydrych + + * matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c: + * matchbox/comp-mgr/mb-wm-comp-mgr-clutter.h: + * matchbox/comp-mgr/mb-wm-comp-mgr.c: + * matchbox/comp-mgr/mb-wm-comp-mgr.h: + * matchbox/core/mb-wm-client.c: + * matchbox/core/mb-wm-types.h: + * matchbox/theme-engines/mb-wm-theme-xml.c: + * matchbox/theme-engines/mb-wm-theme-xml.h: + * matchbox/theme-engines/mb-wm-theme.c: + * matchbox/theme-engines/mb-wm-theme.h: + Simplified effect framework (effect are no longer themeable). + 2008-03-04 Tomas Frydrych * matchbox/core/mb-window-manager.c: diff --git a/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c b/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c index 399713c..9d22542 100644 --- a/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c +++ b/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c @@ -94,13 +94,6 @@ mb_wm_comp_mgr_clutter_client_repair_real (MBWMCompMgrClient * client); static void mb_wm_comp_mgr_clutter_client_configure_real (MBWMCompMgrClient * client); -static MBWMCompMgrEffect * -mb_wm_comp_mgr_clutter_client_effect_new_real (MBWMCompMgrClient *client, - MBWMCompMgrEffectEvent event, - MBWMCompMgrEffectType type, - unsigned long duration, - MBWMGravity gravity); - static void mb_wm_comp_mgr_clutter_client_class_init (MBWMObjectClass *klass) { @@ -110,7 +103,6 @@ mb_wm_comp_mgr_clutter_client_class_init (MBWMObjectClass *klass) c_klass->hide = mb_wm_comp_mgr_clutter_client_hide_real; c_klass->repair = mb_wm_comp_mgr_clutter_client_repair_real; c_klass->configure = mb_wm_comp_mgr_clutter_client_configure_real; - c_klass->effect_new = mb_wm_comp_mgr_clutter_client_effect_new_real; #ifdef MBWM_WANT_DEBUG klass->klass_name = "MBWMCompMgrClutterClient"; @@ -360,12 +352,21 @@ mb_wm_comp_mgr_clutter_client_show_real (MBWMCompMgrClient * client) clutter_actor_show_all (cclient->actor); } -static MBWMCompMgrEffect * -mb_wm_comp_mgr_clutter_effect_new (MBWMCompMgrEffectType type, - unsigned long duration, - MBWMGravity gravity, - ClutterTimeline * timeline, - ClutterBehaviour * behaviour); +/* + * MBWMCompMgrClutterEffect + */ +typedef struct MBWMCompMgrClutterEffect +{ + ClutterTimeline *timeline; + ClutterBehaviour *behaviour; /* can be either behaviour or effect */ +} MBWMCompMgrClutterEffect; + +struct completed_cb_data +{ + gulong my_id; + MBWMCompMgrClutterClient * cclient; + MBWMCompMgrEffectEvent event; +}; /* * Helper method to get a timeline for given event (all effects associated @@ -390,17 +391,12 @@ mb_wm_comp_mgr_clutter_client_get_timeline (MBWMCompMgrClient *client, return cclient->timelines[event-1]; } -/* - * Implementation of the MBWMCompMgrClient->effect_new() method. - */ -static MBWMCompMgrEffect * -mb_wm_comp_mgr_clutter_client_effect_new_real (MBWMCompMgrClient *client, - MBWMCompMgrEffectEvent event, - MBWMCompMgrEffectType type, - unsigned long duration, - MBWMGravity gravity) +static MBWMCompMgrClutterEffect * +mb_wm_comp_mgr_clutter_effect_new (MBWMCompMgrClient * client, + MBWMCompMgrEffectEvent event, + unsigned long duration) { - MBWMCompMgrEffect * eff; + MBWMCompMgrClutterEffect * eff; ClutterTimeline * timeline; ClutterBehaviour * behaviour; ClutterAlpha * alpha; @@ -421,196 +417,29 @@ mb_wm_comp_mgr_clutter_client_effect_new_real (MBWMCompMgrClient *client, mb_wm_client_get_coverage (wm_client, &geom); - switch (type) + switch (event) { - case MBWMCompMgrEffectScaleUp: - behaviour = - clutter_behaviour_scale_newx (alpha, 0, 0, CFX_ONE, CFX_ONE); - break; - case MBWMCompMgrEffectScaleDown: + case MBWMCompMgrEffectEventMinimize: behaviour = clutter_behaviour_scale_newx (alpha, CFX_ONE, CFX_ONE, 0, 0); break; - case MBWMCompMgrEffectSpinXCW: - behaviour = clutter_behaviour_rotate_newx (alpha, - CLUTTER_X_AXIS, - CLUTTER_ROTATE_CW, - 0, - CLUTTER_INT_TO_FIXED (360)); - break; - case MBWMCompMgrEffectSpinXCCW: - behaviour = clutter_behaviour_rotate_newx (alpha, - CLUTTER_X_AXIS, - CLUTTER_ROTATE_CCW, - 0, - CLUTTER_INT_TO_FIXED (360)); - break; - case MBWMCompMgrEffectSpinYCW: - behaviour = clutter_behaviour_rotate_newx (alpha, - CLUTTER_Y_AXIS, - CLUTTER_ROTATE_CW, - 0, - CLUTTER_INT_TO_FIXED (360)); - break; - case MBWMCompMgrEffectSpinYCCW: - behaviour = clutter_behaviour_rotate_newx (alpha, - CLUTTER_Y_AXIS, - CLUTTER_ROTATE_CCW, - 0, - CLUTTER_INT_TO_FIXED (360)); - break; - case MBWMCompMgrEffectSpinZCW: - behaviour = clutter_behaviour_rotate_newx (alpha, - CLUTTER_Z_AXIS, - CLUTTER_ROTATE_CW, - 0, - CLUTTER_INT_TO_FIXED (360)); - break; - case MBWMCompMgrEffectSpinZCCW: - behaviour = clutter_behaviour_rotate_newx (alpha, - CLUTTER_Z_AXIS, - CLUTTER_ROTATE_CCW, - 0, - CLUTTER_INT_TO_FIXED (360)); - break; - case MBWMCompMgrEffectFade: + case MBWMCompMgrEffectEventUnmap: behaviour = clutter_behaviour_opacity_new (alpha, 0xff, 0); break; - case MBWMCompMgrEffectUnfade: - behaviour = clutter_behaviour_opacity_new (alpha, 0, 0xff); - break; - - /* - * Currently ClutterBehaviourPath does not handle negative coords, - * so anything here that needs them is broken. - */ - case MBWMCompMgrEffectSlideIn: - switch (gravity) - { - case MBWMGravityNorth: - knots[0].x = geom.x; - knots[0].y = wm->xdpy_height; - knots[1].x = geom.x; - knots[1].y = geom.y; - break; - case MBWMGravitySouth: - knots[0].x = geom.x; - knots[0].y = -geom.height; - knots[1].x = geom.x; - knots[1].y = geom.y; - break; - case MBWMGravityWest: - knots[0].x = wm->xdpy_width; - knots[0].y = geom.y; - knots[1].x = geom.x; - knots[1].y = geom.y; - break; - case MBWMGravityEast: - knots[0].x = -geom.width; - knots[0].y = geom.y; - knots[1].x = geom.x; - knots[1].y = geom.y; - break; - case MBWMGravityNorthWest: - case MBWMGravityNone: - default: - knots[0].x = wm->xdpy_width; - knots[0].y = wm->xdpy_height; - knots[1].x = geom.x; - knots[1].y = geom.y; - break; - case MBWMGravityNorthEast: - knots[0].x = -geom.width; - knots[0].y = wm->xdpy_height; - knots[1].x = geom.x; - knots[1].y = geom.y; - break; - case MBWMGravitySouthWest: - knots[0].x = wm->xdpy_width; - knots[0].y = -geom.height; - knots[1].x = geom.x; - knots[1].y = geom.y; - break; - case MBWMGravitySouthEast: - knots[0].x = -geom.width; - knots[0].y = -geom.height; - knots[1].x = geom.x; - knots[1].y = geom.y; - break; - } - + case MBWMCompMgrEffectEventMap: + knots[0].x = -wm->xdpy_width; + knots[0].y = geom.y; + knots[1].x = geom.x; + knots[1].y = geom.y; behaviour = clutter_behaviour_path_new (alpha, &knots[0], 2); break; - case MBWMCompMgrEffectSlideOut: - switch (gravity) - { - case MBWMGravityNorth: - knots[0].x = geom.x; - knots[0].y = geom.y; - knots[1].x = geom.x; - knots[1].y = -(geom.y + geom.height); - break; - case MBWMGravitySouth: - knots[0].x = geom.x; - knots[0].y = geom.y; - knots[1].x = geom.x; - knots[1].y = wm->xdpy_height; - break; - case MBWMGravityEast: - knots[0].x = geom.x; - knots[0].y = geom.y; - knots[1].x = wm->xdpy_width; - knots[1].y = geom.y; - break; - case MBWMGravityWest: - knots[0].x = geom.x; - knots[0].y = geom.y; - knots[1].x = -(geom.x + geom.width); - knots[1].y = geom.y; - break; - case MBWMGravityNorthWest: - case MBWMGravityNone: - default: - knots[0].x = geom.x; - knots[0].y = geom.y; - knots[1].x = -(geom.x + geom.width); - knots[1].y = -(geom.y + geom.height); - break; - case MBWMGravityNorthEast: - knots[0].x = geom.x; - knots[0].y = geom.y; - knots[1].x = wm->xdpy_width; - knots[1].y = -(geom.y + geom.height); - break; - case MBWMGravitySouthWest: - knots[0].x = geom.x; - knots[0].y = geom.y; - knots[1].x = -(geom.x + geom.width); - knots[1].y = wm->xdpy_height; - break; - case MBWMGravitySouthEast: - knots[0].x = geom.x; - knots[0].y = geom.y; - knots[1].x = wm->xdpy_width; - knots[1].y = wm->xdpy_height; - break; - } - - behaviour = clutter_behaviour_path_new (alpha, &knots[0], 2); } - eff = - mb_wm_comp_mgr_clutter_effect_new (type, duration, gravity, - timeline, behaviour); + eff = mb_wm_util_malloc0 (sizeof (MBWMCompMgrClutterEffect)); + eff->timeline = timeline; + eff->behaviour = behaviour; - if (eff) - { - /* - * We assume that the actor already exists -- if not, clutter will - * issue a warning here - */ - clutter_behaviour_apply (behaviour, cclient->actor); - } + clutter_behaviour_apply (behaviour, cclient->actor); return eff; } @@ -672,6 +501,11 @@ mb_wm_comp_mgr_clutter_transition_real (MBWMCompMgr * mgr, MBWindowManagerClient *c2, Bool reverse); +static void +mb_wm_comp_mgr_clutter_effect_real (MBWMCompMgr * mgr, + MBWindowManagerClient * client, + MBWMCompMgrEffectEvent event); + static void mb_wm_comp_mgr_clutter_restack_real (MBWMCompMgr *mgr); @@ -698,6 +532,7 @@ mb_wm_comp_mgr_clutter_class_init (MBWMObjectClass *klass) cm_klass->handle_events = mb_wm_comp_mgr_clutter_handle_events_real; cm_klass->my_window = mb_wm_comp_mgr_is_my_window_real; cm_klass->transition = mb_wm_comp_mgr_clutter_transition_real; + cm_klass->effect = mb_wm_comp_mgr_clutter_effect_real; cm_klass->restack = mb_wm_comp_mgr_clutter_restack_real; } @@ -1160,25 +995,6 @@ mb_wm_comp_mgr_clutter_map_notify_real (MBWMCompMgr *mgr, cclient->actor = actor; cclient->texture = texture; - l = - mb_wm_theme_get_client_effects (wm->theme, c); - - while (l) - { - MBWMThemeEffects * t_effects = l->data; - MBWMList * m_effects; - - m_effects = mb_wm_comp_mgr_client_get_effects (client, - t_effects->event, - t_effects->type, - t_effects->duration, - t_effects->gravity); - - mb_wm_comp_mgr_client_add_effects (client, t_effects->event, m_effects); - l = l->next; - } - - g_object_set_data (G_OBJECT (actor), "MBWMCompMgrClutterClient", cclient); clutter_actor_set_position (actor, geom.x, geom.y); @@ -1206,6 +1022,9 @@ mb_wm_comp_mgr_clutter_transtion_fade_cb (ClutterTimeline * t, void * data) d->c1->flags &= ~MBWMCompMgrClutterClientEffectRunning; d->c2->flags &= ~MBWMCompMgrClutterClientEffectRunning; + mb_wm_object_unref (MB_WM_OBJECT (d->c1)); + mb_wm_object_unref (MB_WM_OBJECT (d->c2)); + g_object_unref (d->timeline); g_object_unref (d->beh); } @@ -1252,8 +1071,8 @@ mb_wm_comp_mgr_clutter_transition_fade (MBWMCompMgrClutterClient *c1, b = clutter_behaviour_opacity_new (alpha, 0xff, 0); - cb_data.c1 = c1; - cb_data.c2 = c2; + cb_data.c1 = mb_wm_object_ref (MB_WM_OBJECT (c1)); + cb_data.c2 = mb_wm_object_ref (MB_WM_OBJECT (c2)); cb_data.timeline = timeline; cb_data.beh = b; @@ -1283,21 +1102,180 @@ mb_wm_comp_mgr_clutter_transition_real (MBWMCompMgr * mgr, MBWMCompMgrClutterClient * cc2 = MB_WM_COMP_MGR_CLUTTER_CLIENT (c2->cm_client); - MBWMThemeTransition * trs = - mb_wm_theme_get_client_transition (c1->wmref->theme, c1); + mb_wm_comp_mgr_clutter_transition_fade (cc1, + cc2, + 100); +} - if (!trs) +/* + * Callback for ClutterTimeline::completed signal. + * + * One-off; get connected when the timeline is started, and disconnected + * again when it finishes. + */ +static void +mb_wm_comp_mgr_clutter_effect_completed_cb (ClutterTimeline * t, void * data) +{ + struct completed_cb_data * d = data; + + d->cclient->flags &= ~MBWMCompMgrClutterClientEffectRunning; + + g_signal_handler_disconnect (t, d->my_id); + + switch (d->event) + { + case MBWMCompMgrEffectEventUnmap: + case MBWMCompMgrEffectEventMinimize: + clutter_actor_hide (d->cclient->actor); + break; + + default: + break; + } + + /* + * Release the extra reference on the CM client that was added for the sake + * of the effect + */ + mb_wm_object_unref (MB_WM_OBJECT (d->cclient)); + + free (d); +} + +static void +mb_wm_comp_mgr_clutter_effect_real (MBWMCompMgr * mgr, + MBWindowManagerClient * client, + MBWMCompMgrEffectEvent event) +{ + static MBWMCompMgrClutterEffect * eff_map = NULL; + static MBWMCompMgrClutterEffect * eff_unmap = NULL; + static MBWMCompMgrClutterEffect * eff_minimize = NULL; + + MBWMCompMgrClutterEffect * eff; + MBWMCompMgrClutterClient * cclient = + MB_WM_COMP_MGR_CLUTTER_CLIENT (client->cm_client); + + if (MB_WM_CLIENT_CLIENT_TYPE (client) != MBWMClientTypeApp) return; - switch (trs->type) + switch (event) { - case MBWMCompMgrTransitionFade: - mb_wm_comp_mgr_clutter_transition_fade (cc1, - cc2, - trs->duration); + case MBWMCompMgrEffectEventMap: + if (!eff_map) + eff_map = mb_wm_comp_mgr_clutter_effect_new (client->cm_client, + event, + 200); + eff = eff_map; + break; + case MBWMCompMgrEffectEventUnmap: + if (!eff_unmap) + eff_unmap = mb_wm_comp_mgr_clutter_effect_new (client->cm_client, + event, 200); + eff = eff_unmap; + break; + case MBWMCompMgrEffectEventMinimize: + if (!eff_minimize) + eff_minimize = mb_wm_comp_mgr_clutter_effect_new (client->cm_client, + event, 200); + eff = eff_minimize; break; default: - MBWM_DBG ("Unimplemented transition type %d", trs->type); + ; + } + + /* + * Don't attempt to start the timeline if it is already playing + */ + if (eff->timeline && + !clutter_timeline_is_playing (eff->timeline)) + { + GSList * actors; + ClutterActor *a; + Bool dont_run = False; + + struct completed_cb_data * d; + + d = mb_wm_util_malloc0 (sizeof (struct completed_cb_data)); + + d->cclient = mb_wm_object_ref (MB_WM_OBJECT (cclient)); + d->event = event; + + d->my_id = g_signal_connect (eff->timeline, "completed", + G_CALLBACK (mb_wm_comp_mgr_clutter_effect_completed_cb), + d); + + /* + * This is bit of a pain; we know that our actor is attached to + * a single actor, but the current API only provides us with a copy + * of the actor list; ideally, we would like to be able to access + * the first actor directly. + */ + actors = clutter_behaviour_get_actors (eff->behaviour); + a = actors->data; + + if (CLUTTER_IS_BEHAVIOUR_PATH (eff->behaviour) && + !CLUTTER_ACTOR_IS_VISIBLE (a)) + { + /* + * At this stage, if the actor is not yet visible, move it to + * the starting point of the path (this is mostly because of + * 'map' effects, where the clutter_actor_show () is delayed + * until this point, so that the actor can be positioned in the + * correct location without visible artefacts). + * + * FIXME -- this is very clumsy; we need clutter API to query + * the first knot of the path to avoid messing about with copies + * of the list. + */ + + GSList * knots = + clutter_behaviour_path_get_knots ( + CLUTTER_BEHAVIOUR_PATH (eff->behaviour)); + + if (knots) + { + ClutterKnot * k = knots->data; + + clutter_actor_set_position (a, k->x, k->y); + + g_slist_free (knots); + } + } + + if (event == MBWMCompMgrEffectEventUnmap) + { + cclient->flags |= MBWMCompMgrClutterClientDontUpdate; + + if (cclient->flags & MBWMCompMgrClutterClientDone) + dont_run = True; + else + cclient->flags |= MBWMCompMgrClutterClientDone; + } + else if (event == MBWMCompMgrEffectEventMinimize) + { + /* + * This is tied specifically to the unmap scale effect (the + * themable version of effects allowed to handle this is a nice + * generic fashion. :-( + */ + clutter_actor_move_anchor_point_from_gravity (a, + CLUTTER_GRAVITY_SOUTH_EAST); + } + + /* + * Make sure the actor is showing (for example with 'map' effects, + * the show() is delayed until the effect had chance to + * set up the actor postion). + */ + if (!dont_run) + { + cclient->flags |= MBWMCompMgrClutterClientEffectRunning; + clutter_actor_show (a); + clutter_timeline_start (eff->timeline); + } + + g_slist_free (actors); + } } @@ -1351,280 +1329,6 @@ mb_wm_comp_mgr_clutter_new (MBWindowManager *wm) return MB_WM_COMP_MGR (mgr); } -/* - * MBWMCompMgrClutterEffect - */ -struct MBWMCompMgrClutterEffect -{ - MBWMCompMgrEffect parent; - ClutterTimeline *timeline; - ClutterBehaviour *behaviour; /* can be either behaviour or effect */ -}; - -struct completed_cb_data -{ - gulong my_id; - MBWMCompMgrClutterClient * cclient; - MBWMCompMgrEffectEvent event; -}; - - -/* - * Callback for ClutterTimeline::completed signal. - * - * One-off; get connected when the timeline is started, and disconnected - * again when it finishes. - */ -static void -mb_wm_comp_mgr_clutter_effect_completed_cb (ClutterTimeline * t, void * data) -{ - struct completed_cb_data * d = data; - - d->cclient->flags &= ~MBWMCompMgrClutterClientEffectRunning; - - g_signal_handler_disconnect (t, d->my_id); - - switch (d->event) - { - case MBWMCompMgrEffectEventUnmap: - case MBWMCompMgrEffectEventMinimize: - clutter_actor_hide (d->cclient->actor); - break; - - default: - break; - } - - /* - * Release the extra reference on the CM client that was added for the sake - * of the effect - */ - mb_wm_object_unref (MB_WM_OBJECT (d->cclient)); - - free (d); -} - -static void -mb_wm_comp_mgr_clutter_effect_run_real (MBWMList * effects, - MBWMCompMgrClient * cm_client, - MBWMCompMgrEffectEvent event) -{ - MBWMCompMgrClutterClient *cclient = - MB_WM_COMP_MGR_CLUTTER_CLIENT (cm_client); - - /* - * Since the entire effect group for a single event type shares - * a timeline, we just need to start it for one of the behaviours. - * - * TODO -- there is no need for the effect objects to carry the timeline - * pointer, so remove it. - */ - if (effects && effects->data) - { - MBWMCompMgrEffect * eff = effects->data; - MBWMCompMgrClutterEffect * ceff = MB_WM_COMP_MGR_CLUTTER_EFFECT (eff); - - /* - * Don't attempt to start the timeline if it is already playing - */ - if (ceff->timeline && - !clutter_timeline_is_playing (ceff->timeline)) - { - GSList * actors; - ClutterActor *a; - Bool dont_run = False; - - struct completed_cb_data * d; - - d = mb_wm_util_malloc0 (sizeof (struct completed_cb_data)); - - d->cclient = cclient; - d->event = event; - - d->my_id = g_signal_connect (ceff->timeline, "completed", - G_CALLBACK (mb_wm_comp_mgr_clutter_effect_completed_cb), - d); - - /* - * This is bit of a pain; we know that our actor is attached to - * a single actor, but the current API only provides us with a copy - * of the actor list; ideally, we would like to be able to access - * the first actor directly. - */ - actors = clutter_behaviour_get_actors (ceff->behaviour); - a = actors->data; - - /* - * Deal with gravity, but not for path behaviours (there the - * gravity translates into the path itself, and is already - * set up). - */ - if (eff->gravity != CLUTTER_GRAVITY_NONE && - !CLUTTER_IS_BEHAVIOUR_PATH (ceff->behaviour)) - { - clutter_actor_move_anchor_point_from_gravity (a, eff->gravity); - } - else if (CLUTTER_IS_BEHAVIOUR_PATH (ceff->behaviour) && - !CLUTTER_ACTOR_IS_VISIBLE (a)) - { - /* - * At this stage, if the actor is not yet visible, move it to - * the starting point of the path (this is mostly because of - * 'map' effects, where the clutter_actor_show () is delayed - * until this point, so that the actor can be positioned in the - * correct location without visible artefacts). - * - * FIXME -- this is very clumsy; we need clutter API to query - * the first knot of the path to avoid messing about with copies - * of the list. - */ - - GSList * knots = - clutter_behaviour_path_get_knots ( - CLUTTER_BEHAVIOUR_PATH (ceff->behaviour)); - - if (knots) - { - ClutterKnot * k = knots->data; - - clutter_actor_set_position (a, k->x, k->y); - - g_slist_free (knots); - } - } - - if (event == MBWMCompMgrEffectEventUnmap) - { - cclient->flags |= MBWMCompMgrClutterClientDontUpdate; - - if (cclient->flags & MBWMCompMgrClutterClientDone) - dont_run = True; - else - cclient->flags |= MBWMCompMgrClutterClientDone; - } - - /* - * Make sure the actor is showing (for example with 'map' effects, - * the show() is delayed until the effect had chance to - * set up the actor postion). - */ - if (!dont_run) - { - cclient->flags |= MBWMCompMgrClutterClientEffectRunning; - clutter_actor_show (a); - clutter_timeline_start (ceff->timeline); - } - - g_slist_free (actors); - - } - } -} - -static void -mb_wm_comp_mgr_clutter_effect_class_init (MBWMObjectClass *klass) -{ - MBWMCompMgrEffectClass *c_klass = MB_WM_COMP_MGR_EFFECT_CLASS (klass); - - c_klass->run = mb_wm_comp_mgr_clutter_effect_run_real; - -#ifdef MBWM_WANT_DEBUG - klass->klass_name = "MBWMCompMgrClutterEffect"; -#endif -} - -static int -mb_wm_comp_mgr_clutter_effect_init (MBWMObject *obj, va_list vap) -{ - MBWMObjectProp prop; - ClutterTimeline *timeline; - ClutterBehaviour *behaviour; - - prop = va_arg(vap, MBWMObjectProp); - while (prop) - { - switch (prop) - { - case MBWMObjectPropCompMgrClutterEffectTimeline: - timeline = va_arg(vap, ClutterTimeline *); - break; - case MBWMObjectPropCompMgrClutterEffectBehaviour: - behaviour = va_arg(vap, ClutterBehaviour *); - break; - default: - MBWMO_PROP_EAT (vap, prop); - } - - prop = va_arg(vap, MBWMObjectProp); - } - - if (!timeline || !behaviour) - return 0; - - MB_WM_COMP_MGR_CLUTTER_EFFECT (obj)->timeline = timeline; - MB_WM_COMP_MGR_CLUTTER_EFFECT (obj)->behaviour = behaviour; - - return 1; -} - -static void -mb_wm_comp_mgr_clutter_effect_destroy (MBWMObject* obj) -{ - MBWMCompMgrClutterEffect * e = MB_WM_COMP_MGR_CLUTTER_EFFECT (obj); - - if (!e || !e->behaviour) - return; - - g_object_unref (e->behaviour); - g_object_unref (e->timeline); -} - -int -mb_wm_comp_mgr_clutter_effect_class_type () -{ - static int type = 0; - - if (UNLIKELY(type == 0)) - { - static MBWMObjectClassInfo info = { - sizeof (MBWMCompMgrClutterEffectClass), - sizeof (MBWMCompMgrClutterEffect), - mb_wm_comp_mgr_clutter_effect_init, - mb_wm_comp_mgr_clutter_effect_destroy, - mb_wm_comp_mgr_clutter_effect_class_init - }; - - type = - mb_wm_object_register_class (&info, MB_WM_TYPE_COMP_MGR_EFFECT, 0); - } - - return type; -} - -/* - * This is private method for use by the manager, hence static. - */ -static MBWMCompMgrEffect * -mb_wm_comp_mgr_clutter_effect_new (MBWMCompMgrEffectType type, - unsigned long duration, - MBWMGravity gravity, - ClutterTimeline * timeline, - ClutterBehaviour * behaviour) -{ - MBWMObject *e; - - e = - mb_wm_object_new (MB_WM_TYPE_COMP_MGR_CLUTTER_EFFECT, - MBWMObjectPropCompMgrEffectType, type, - MBWMObjectPropCompMgrEffectDuration, duration, - MBWMObjectPropCompMgrEffectGravity, gravity, - MBWMObjectPropCompMgrClutterEffectTimeline, timeline, - MBWMObjectPropCompMgrClutterEffectBehaviour, behaviour, - NULL); - - return MB_WM_COMP_MGR_EFFECT (e); -} - /* ------------------------------- */ /* Shadow Generation */ diff --git a/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.h b/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.h index 0e9df19..a5f988b 100644 --- a/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.h +++ b/matchbox/comp-mgr/mb-wm-comp-mgr-clutter.h @@ -32,11 +32,6 @@ #define MB_WM_COMP_MGR_CLUTTER_CLIENT_CLASS(c) ((MBWMCompMgrClutterClientClass*)(c)) #define MB_WM_TYPE_COMP_MGR_CLUTTER_CLIENT (mb_wm_comp_mgr_clutter_client_class_type ()) -#define MB_WM_COMP_MGR_CLUTTER_EFFECT(c) ((MBWMCompMgrClutterEffect*)(c)) -#define MB_WM_COMP_MGR_CLUTTER_EFFECT_CLASS(c) ((MBWMCompMgrClutterEffectClass*)(c)) -#define MB_WM_TYPE_COMP_MGR_CLUTTER_EFFECT (mb_wm_comp_mgr_clutter_effect_class_type ()) - - struct MBWMCompMgrClutter { MBWMCompMgr parent; @@ -65,12 +60,4 @@ struct MBWMCompMgrClutterClientClass int mb_wm_comp_mgr_clutter_client_class_type (); -struct MBWMCompMgrClutterEffectClass -{ - MBWMCompMgrEffectClass parent; -}; - -int -mb_wm_comp_mgr_clutter_effect_class_type (); - #endif diff --git a/matchbox/comp-mgr/mb-wm-comp-mgr.c b/matchbox/comp-mgr/mb-wm-comp-mgr.c index 0a314e5..bbd3cdc 100644 --- a/matchbox/comp-mgr/mb-wm-comp-mgr.c +++ b/matchbox/comp-mgr/mb-wm-comp-mgr.c @@ -28,24 +28,6 @@ #include #include -typedef struct _MBWMCompMgrEffectAssociation MBWMCompMgrEffectAssociation; - -/* - * A helper object used to translate the event-effect association defined - * by theme into a list of effect instances. - */ -struct _MBWMCompMgrEffectAssociation -{ - MBWMCompMgrEffectEvent event; - MBWMList * effects; -}; - -static MBWMCompMgrEffectAssociation * -mb_wm_comp_mgr_effect_association_new (); - -static void -mb_wm_comp_mgr_effect_association_free (MBWMCompMgrEffectAssociation * a); - static void mb_wm_comp_mgr_client_class_init (MBWMObjectClass *klass) { @@ -97,15 +79,6 @@ mb_wm_comp_mgr_client_init (MBWMObject *obj, va_list vap) static void mb_wm_comp_mgr_client_destroy (MBWMObject* obj) { - MBWMList * l = MB_WM_COMP_MGR_CLIENT (obj)->effects; - - while (l) - { - MBWMCompMgrEffectAssociation * a = l->data; - mb_wm_comp_mgr_effect_association_free (a); - - l = l->next; - } } int @@ -173,82 +146,6 @@ mb_wm_comp_mgr_client_repair (MBWMCompMgrClient * client) klass->repair (client); } -/* - * Method for sub-classes to add effects to the (private) list - */ -void -mb_wm_comp_mgr_client_add_effects (MBWMCompMgrClient * client, - MBWMCompMgrEffectEvent event, - MBWMList * effects) -{ - MBWMCompMgr * mgr = client->wm_client->wmref->comp_mgr; - MBWMCompMgrEffectAssociation * a; - - MBWM_ASSERT (mgr); - - a = mb_wm_comp_mgr_effect_association_new (); - - a->effects = effects; - a->event = event; - - client->effects = mb_wm_util_list_prepend (client->effects, a); -} - -/* - * Runs all effects associated with this client for the given events. - * - * completed_cb is a callback function that will get called when the effect - * execution is completed (can be NULL), data is user data that will be passed - * to the callback function. - * - * For exmaple of use see mb_wm_client_iconize().w - */ -void -mb_wm_comp_mgr_client_run_effect (MBWMCompMgrClient * client, - MBWMCompMgrEffectEvent event) -{ - MBWMList * l = client->effects; - Bool done_effect = False; - MBWMCompMgrEffectClass * eklass; - - if (!client) - return; - - /* - * Take a reference to the CM client object, so that it does not disappear - * underneath us while the effect is running; it is the responsibility - * of the subclassed run() to release this reference when it is done. - */ - mb_wm_object_ref (MB_WM_OBJECT (client)); - - while (l) - { - MBWMCompMgrEffectAssociation * a = l->data; - - if (a->event == event) - { - MBWMList * el = a->effects; - MBWMCompMgrEffect * eff = el->data; - - eklass = MB_WM_COMP_MGR_EFFECT_CLASS (MB_WM_OBJECT_GET_CLASS (eff)); - - if (!eklass) - continue; - - eklass->run (el, client, event); - done_effect = True; - } - - l = l->next; - } - - /* - * If there were no effects to run for this event, release the - * temporary reference on the client object. - */ - if (!done_effect) - mb_wm_object_unref (MB_WM_OBJECT (client)); -} /* * MBWMCompMgr object @@ -417,8 +314,7 @@ mb_wm_comp_mgr_map_notify (MBWMCompMgr *mgr, MBWindowManagerClient *c) * (the effect will take care of showing the actor, and if not, show() gets * called by mb_wm_comp_mgr_map_notify()). */ - mb_wm_comp_mgr_client_run_effect (c->cm_client, - MBWMCompMgrEffectEventMap); + mb_wm_comp_mgr_do_effect (mgr, c, MBWMCompMgrEffectEventMap); if (c->cm_client) mb_wm_comp_mgr_client_show (c->cm_client); @@ -434,8 +330,7 @@ mb_wm_comp_mgr_unmap_notify (MBWMCompMgr *mgr, MBWindowManagerClient *c) klass = MB_WM_COMP_MGR_CLASS (MB_WM_OBJECT_GET_CLASS (mgr)); - mb_wm_comp_mgr_client_run_effect (c->cm_client, - MBWMCompMgrEffectEventUnmap); + mb_wm_comp_mgr_do_effect (mgr, c, MBWMCompMgrEffectEventUnmap); if (klass->unmap_notify) klass->unmap_notify (mgr, c); @@ -473,6 +368,25 @@ mb_wm_comp_mgr_do_transition (MBWMCompMgr * mgr, klass->transition (mgr, c1, c2, reverse); } +void +mb_wm_comp_mgr_do_effect (MBWMCompMgr * mgr, + MBWindowManagerClient * client, + MBWMCompMgrEffectEvent event) +{ + MBWMCompMgrClass *klass; + + /* + * Transitions can only be done for clients of the same type, so + * check the types here. + */ + if (!mgr || !client) + return; + + klass = MB_WM_COMP_MGR_CLASS (MB_WM_OBJECT_GET_CLASS (mgr)); + + if (klass->effect) + klass->effect (mgr, client, event); +} void mb_wm_comp_mgr_turn_on (MBWMCompMgr *mgr) @@ -525,166 +439,3 @@ mb_wm_comp_mgr_is_my_window (MBWMCompMgr * mgr, Window xwin) return False; } -/* - * Returns a list of MBWMCompMgrEffect objects of given type that are to be - * associated with the given client for the given event. The type parameter - * can be made up of more that one MBWMComMgrEffectType value, or-ed. - * - * This function provides a public API to translate the effects specified - * by theme into actual effect instances. - */ -MBWMList * -mb_wm_comp_mgr_client_get_effects (MBWMCompMgrClient * client, - MBWMCompMgrEffectEvent event, - MBWMCompMgrEffectType type, - unsigned long duration, - MBWMGravity gravity) -{ - MBWMList *l = NULL; - MBWMCompMgrEffectType t = (MBWMCompMgrEffectType) 1; - MBWMCompMgrClientClass *klass = - MB_WM_COMP_MGR_CLIENT_CLASS (MB_WM_OBJECT_GET_CLASS (client)); - - if (!klass->effect_new) - return NULL; - - while (t < _MBWMCompMgrEffectLast) - { - MBWMCompMgrEffect *e = NULL; - - if (t & type) - e = klass->effect_new (client, event, t, duration, gravity); - - if (e) - l = mb_wm_util_list_prepend (l, e); - - t <<= 1; - } - - return l; -} - - -/* - * Effect - * - * Effects are simple one-off transformations carried out on the client in - * response to some trigger event. The possible events are given by the - * MBWMCompMgrEffectEvent enum, while the nature effect is defined by - * MBWMCompMgrEffectType enum; effects are specified per window manager client - * type by the theme. - * - * Events and effect types form a one to many association (and the type - * enumeration is or-able). - * - * The base MBWMCompMgrEffect class provides some common infrastructure, - * notably the virtual run() method that needs to be implemented by - * the derrived classes. - * - * NB: the base class does not automatically associate effects with clients; - * this is the responsibility of the subclasses, mostly because the sub classes - * might want to allocate the effect objects at different times (for example, - * the MBWMCompMgrClutterEffect objects cannot be allocated until the - * the associated client has created its ClutterActor, which only happens when - * the client window maps). - */ -static MBWMCompMgrEffectAssociation * -mb_wm_comp_mgr_effect_association_new () -{ - void * a; - - a = mb_wm_util_malloc0 (sizeof (MBWMCompMgrEffectAssociation)); - - return (MBWMCompMgrEffectAssociation*) a; -} - -static void -mb_wm_comp_mgr_effect_association_free (MBWMCompMgrEffectAssociation * a) -{ - MBWMList * l = a->effects; - - while (l) - { - MBWMCompMgrEffect * e = l->data; - mb_wm_object_unref (MB_WM_OBJECT (e)); - - l = l->next; - } - - free (a); -} - -static void -mb_wm_comp_mgr_effect_class_init (MBWMObjectClass *klass) -{ - MBWMCompMgrEffectClass *c_klass = MB_WM_COMP_MGR_EFFECT_CLASS (klass); - -#ifdef MBWM_WANT_DEBUG - klass->klass_name = "MBWMCompMgrEffect"; -#endif -} - -static int -mb_wm_comp_mgr_effect_init (MBWMObject *obj, va_list vap) -{ - MBWMObjectProp prop; - MBWMCompMgrEffectType type = 0; - unsigned long duration = 0; - MBWMGravity gravity = MBWMGravityNone; - - prop = va_arg(vap, MBWMObjectProp); - while (prop) - { - switch (prop) - { - case MBWMObjectPropCompMgrEffectType: - type = va_arg(vap, MBWMCompMgrEffectType); - break; - case MBWMObjectPropCompMgrEffectDuration: - duration = va_arg(vap, unsigned long); - break; - case MBWMObjectPropCompMgrEffectGravity: - gravity = va_arg(vap, MBWMGravity); - break; - default: - MBWMO_PROP_EAT (vap, prop); - } - - prop = va_arg(vap, MBWMObjectProp); - } - - if (!type) - return 0; - - MB_WM_COMP_MGR_EFFECT (obj)->type = type; - MB_WM_COMP_MGR_EFFECT (obj)->duration = duration; - MB_WM_COMP_MGR_EFFECT (obj)->gravity = gravity; - - return 1; -} - -static void -mb_wm_comp_mgr_effect_destroy (MBWMObject* obj) -{ -} - -int -mb_wm_comp_mgr_effect_class_type () -{ - static int type = 0; - - if (UNLIKELY(type == 0)) - { - static MBWMObjectClassInfo info = { - sizeof (MBWMCompMgrEffectClass), - sizeof (MBWMCompMgrEffect), - mb_wm_comp_mgr_effect_init, - mb_wm_comp_mgr_effect_destroy, - mb_wm_comp_mgr_effect_class_init - }; - - type = mb_wm_object_register_class (&info, MB_WM_TYPE_OBJECT, 0); - } - - return type; -} diff --git a/matchbox/comp-mgr/mb-wm-comp-mgr.h b/matchbox/comp-mgr/mb-wm-comp-mgr.h index df0f3d7..04f62e8 100644 --- a/matchbox/comp-mgr/mb-wm-comp-mgr.h +++ b/matchbox/comp-mgr/mb-wm-comp-mgr.h @@ -31,10 +31,6 @@ #define MB_WM_COMP_MGR_CLIENT_CLASS(c) ((MBWMCompMgrClientClass*)(c)) #define MB_WM_TYPE_COMP_MGR_CLIENT (mb_wm_comp_mgr_client_class_type ()) -#define MB_WM_COMP_MGR_EFFECT(c) ((MBWMCompMgrEffect*)(c)) -#define MB_WM_COMP_MGR_EFFECT_CLASS(c) ((MBWMCompMgrEffectClass*)(c)) -#define MB_WM_TYPE_COMP_MGR_EFFECT (mb_wm_comp_mgr_effect_class_type ()) - struct MBWMCompMgr { MBWMObject parent; @@ -57,6 +53,9 @@ struct MBWMCompMgrClass void (*unmap_notify) (MBWMCompMgr * mgr, MBWindowManagerClient *c); Bool (*handle_events) (MBWMCompMgr * mgr, XEvent *ev); Bool (*my_window) (MBWMCompMgr * mgr, Window xwin); + void (*effect) (MBWMCompMgr * mgr, + MBWindowManagerClient *c1, + MBWMCompMgrEffectEvent event); void (*transition) (MBWMCompMgr * mgr, MBWindowManagerClient *c1, MBWindowManagerClient *c2, @@ -106,6 +105,11 @@ mb_wm_comp_mgr_do_transition (MBWMCompMgr * mgr, MBWindowManagerClient * c2, Bool reverse); +void +mb_wm_comp_mgr_do_effect (MBWMCompMgr * mgr, + MBWindowManagerClient * client, + MBWMCompMgrEffectEvent event); + struct MBWMCompMgrClient { MBWMObject parent; @@ -113,7 +117,6 @@ struct MBWMCompMgrClient MBWindowManagerClient * wm_client; /* Make private ? */ - MBWMList * effects; /* List of MBWMCompMgrEffectAssociation */ Bool is_argb32; }; @@ -125,13 +128,6 @@ struct MBWMCompMgrClientClass void (*hide) (MBWMCompMgrClient * client); void (*repair) (MBWMCompMgrClient * client); void (*configure) (MBWMCompMgrClient * client); - - MBWMCompMgrEffect * (*effect_new) (MBWMCompMgrClient * client, - MBWMCompMgrEffectEvent event, - MBWMCompMgrEffectType type, - unsigned long duration, - MBWMGravity gravity); - }; int @@ -149,43 +145,5 @@ mb_wm_comp_mgr_client_repair (MBWMCompMgrClient * client); void mb_wm_comp_mgr_client_configure (MBWMCompMgrClient * client); -void -mb_wm_comp_mgr_client_add_effects (MBWMCompMgrClient * client, - MBWMCompMgrEffectEvent event, - MBWMList * effects); - -void -mb_wm_comp_mgr_client_run_effect (MBWMCompMgrClient * client, - MBWMCompMgrEffectEvent event); - -MBWMList * -mb_wm_comp_mgr_client_get_effects (MBWMCompMgrClient * client, - MBWMCompMgrEffectEvent event, - MBWMCompMgrEffectType type, - unsigned long duration, - MBWMGravity gravity); - -/* - * Generic effect that can applied to a client - */ -struct MBWMCompMgrEffect -{ - MBWMObject parent; - MBWMCompMgrEffectType type; - unsigned long duration; - MBWMGravity gravity; -}; - -struct MBWMCompMgrEffectClass -{ - MBWMObjectClass parent; - - void (*run) (MBWMList * effects, - MBWMCompMgrClient * cm_client, - MBWMCompMgrEffectEvent event); -}; - -int -mb_wm_comp_mgr_effect_class_type (); #endif diff --git a/matchbox/core/mb-wm-client.c b/matchbox/core/mb-wm-client.c index efa7c11..a8a09e9 100644 --- a/matchbox/core/mb-wm-client.c +++ b/matchbox/core/mb-wm-client.c @@ -969,8 +969,8 @@ mb_wm_client_iconize (MBWindowManagerClient *client) */ if (mb_wm_compositing_enabled (client->wmref)) { - mb_wm_comp_mgr_client_run_effect (client->cm_client, - MBWMCompMgrEffectEventMinimize); + mb_wm_comp_mgr_do_effect (client->wmref->comp_mgr, client, + MBWMCompMgrEffectEventMinimize); } #endif diff --git a/matchbox/core/mb-wm-types.h b/matchbox/core/mb-wm-types.h index 8e35479..5231e3d 100644 --- a/matchbox/core/mb-wm-types.h +++ b/matchbox/core/mb-wm-types.h @@ -122,10 +122,6 @@ typedef struct MBWMCompMgrClutterClass MBWMCompMgrClutterClass; typedef struct MBWMCompMgrClutterClient MBWMCompMgrClutterClient; typedef struct MBWMCompMgrClutterClientClass MBWMCompMgrClutterClientClass; typedef struct MBWMCompMgrClutterClentPrivate MBWMCompMgrClutterClientPrivate; -typedef struct MBWMCompMgrEffect MBWMCompMgrEffect; -typedef struct MBWMCompMgrEffectClass MBWMCompMgrEffectClass; -typedef struct MBWMCompMgrClutterEffect MBWMCompMgrClutterEffect; -typedef struct MBWMCompMgrClutterEffectClass MBWMCompMgrClutterEffectClass; typedef enum MBWMClientType { @@ -151,35 +147,6 @@ typedef enum _MBWMCompMgrEffectEvent _MBWMCompMgrEffectEventLast, } MBWMCompMgrEffectEvent; -typedef enum _MBWMCompMgrEffectType -{ - MBWMCompMgrEffectScaleUp = (1<<0), /* 0 reserved for unknown */ - MBWMCompMgrEffectScaleDown = (1<<1), - MBWMCompMgrEffectSpinXCW = (1<<2), - MBWMCompMgrEffectSpinXCCW = (1<<3), - MBWMCompMgrEffectSpinYCW = (1<<4), - MBWMCompMgrEffectSpinYCCW = (1<<5), - MBWMCompMgrEffectSpinZCW = (1<<6), - MBWMCompMgrEffectSpinZCCW = (1<<7), - MBWMCompMgrEffectFade = (1<<8), - MBWMCompMgrEffectUnfade = (1<<9), - MBWMCompMgrEffectSlideIn = (1<<10), - MBWMCompMgrEffectSlideOut = (1<<11), - - _MBWMCompMgrEffectLast, -} MBWMCompMgrEffectType; - -typedef enum _MBWMCompMgrTransitionType -{ - MBWMCompMgrTransitionFade = 1, /* 0 reserved for unknown */ - MBWMCompMgrTransitionSlide, - - _MBWMCompMgrTransitionLast, -} MBWMCompMgrTransitionType; - - -typedef void (*MBWMCompMgrEffectCallback) (void * data); - typedef enum _MBWMGravity { MBWMGravityNone = 0, diff --git a/matchbox/theme-engines/mb-wm-theme-xml.c b/matchbox/theme-engines/mb-wm-theme-xml.c index 8d42ca4..e075b7b 100644 --- a/matchbox/theme-engines/mb-wm-theme-xml.c +++ b/matchbox/theme-engines/mb-wm-theme-xml.c @@ -77,14 +77,6 @@ mb_wm_xml_decor_free (MBWMXmlDecor * d) free (d); } -#if ENABLE_COMPOSITE -static void -mb_wm_theme_effects_free (MBWMThemeEffects *e) -{ - free (e); -} -#endif - MBWMXmlClient * mb_wm_xml_client_new () { @@ -117,22 +109,6 @@ mb_wm_xml_client_free (MBWMXmlClient * c) l = n; } -#if ENABLE_COMPOSITE - l = c->effects; - while (l) - { - MBWMThemeEffects * e = l->data; - MBWMList * n = l->next; - mb_wm_theme_effects_free (e); - free (l); - - l = n; - } - - if (c->transition) - free (c->transition); -#endif - free (c); } diff --git a/matchbox/theme-engines/mb-wm-theme-xml.h b/matchbox/theme-engines/mb-wm-theme-xml.h index 7691d1f..4ed1f19 100644 --- a/matchbox/theme-engines/mb-wm-theme-xml.h +++ b/matchbox/theme-engines/mb-wm-theme-xml.h @@ -64,11 +64,6 @@ typedef struct Client MBWMList *decors; MBWMClientLayoutHints layout_hints; - -#if ENABLE_COMPOSITE - MBWMList *effects; - MBWMThemeTransition *transition; -#endif }MBWMXmlClient; MBWMXmlButton * diff --git a/matchbox/theme-engines/mb-wm-theme.c b/matchbox/theme-engines/mb-wm-theme.c index 72e1962..4753c29 100644 --- a/matchbox/theme-engines/mb-wm-theme.c +++ b/matchbox/theme-engines/mb-wm-theme.c @@ -314,8 +314,6 @@ typedef enum XML_CTX_DECOR, XML_CTX_BUTTON, XML_CTX_IMG, - XML_CTX_EFFECT, - XML_CTX_TRANSITION, } XmlCtx; struct stack_data @@ -587,50 +585,6 @@ mb_wm_theme_get_client_layout_hints (MBWMTheme * theme, return c->layout_hints; } -#if ENABLE_COMPOSITE -const MBWMList * -mb_wm_theme_get_client_effects (MBWMTheme * theme, - MBWindowManagerClient * client) -{ - MBWMXmlClient * c; - MBWMClientType c_type; - - if (!client || !theme) - return NULL; - - c_type = MB_WM_CLIENT_CLIENT_TYPE (client); - - if (!theme->xml_clients || - !(c = mb_wm_xml_client_find_by_type (theme->xml_clients, c_type))) - { - return NULL; - } - - return c->effects; -} - -MBWMThemeTransition * -mb_wm_theme_get_client_transition (MBWMTheme * theme, - MBWindowManagerClient * client) -{ - MBWMXmlClient * c; - MBWMClientType c_type; - - if (!client || !theme) - return NULL; - - c_type = MB_WM_CLIENT_CLIENT_TYPE (client); - - if (!theme->xml_clients || - !(c = mb_wm_xml_client_find_by_type (theme->xml_clients, c_type))) - { - return NULL; - } - - return c->transition; -} -#endif - /* * Returns True if the theme prescribes at least one value for the geometry */ @@ -1078,248 +1032,6 @@ xml_element_start_cb (void *data, const char *tag, const char **expat_attr) return; } -#if ENABLE_COMPOSITE - if (!strcmp (tag, "effect")) - { - MBWMThemeEffects *eff = mb_wm_util_malloc0 (sizeof (MBWMThemeEffects)); - const char **p = expat_attr; - XmlCtx ctx = xml_stack_top_ctx (exd->stack); - MBWMXmlClient *c = xml_stack_top_data (exd->stack); - - xml_stack_push (&exd->stack, XML_CTX_EFFECT); - - if (ctx != XML_CTX_CLIENT || !c) - { - MBWM_DBG ("Expected context client"); - return; - } - - while (*p) - { - if (!strcmp (*p, "event")) - { - if (!strcmp (*(p+1), "minimize")) - eff->event = MBWMCompMgrEffectEventMinimize; - else if (!strcmp (*(p+1), "map")) - eff->event = MBWMCompMgrEffectEventMap; - else if (!strcmp (*(p+1), "unmap")) - eff->event = MBWMCompMgrEffectEventUnmap; - } - else if (!strcmp (*p, "duration")) - eff->duration = atoi (*(p+1)); - else if (!strcmp (*p, "gravity")) - { - const char * g = *(p+1); - - if (!strncmp (g, "none", 2)) - eff->gravity = MBWMGravityNone; - else if (!strncmp (g, "nw", 2)) - eff->gravity = MBWMGravityNorthWest; - else if (!strncmp (g, "ne", 2)) - eff->gravity = MBWMGravityNorthEast; - else if (!strncmp (g, "sw", 2)) - eff->gravity = MBWMGravitySouthWest; - else if (!strncmp (g, "se", 2)) - eff->gravity = MBWMGravitySouthEast; - else - { - switch (*g) - { - case 'n': - eff->gravity = MBWMGravityNorth; break; - case 's': - eff->gravity = MBWMGravitySouth; break; - case 'w': - eff->gravity = MBWMGravityWest; break; - case 'e': - eff->gravity = MBWMGravityEast; break; - default: - eff->gravity = MBWMGravityNone; - } - } - } - else if (!strcmp (*p, "type")) - { - const char *e = *(p+1); - - while (e && *e) - { - char *bar; - - if (!strncmp (e, "scale-up", 8)) - { - eff->type |= MBWMCompMgrEffectScaleUp; - } - else if (!strncmp (e, "scale-down", 12)) - { - eff->type |= MBWMCompMgrEffectScaleDown; - } - else if (!strncmp (e, "scale-down", 12)) - { - eff->type |= MBWMCompMgrEffectScaleDown; - } - else if (!strncmp (e, "spin-xcw", 8)) - { - eff->type |= MBWMCompMgrEffectSpinXCW; - } - else if (!strncmp (e, "spin-xccw", 9)) - { - eff->type |= MBWMCompMgrEffectSpinXCCW; - } - else if (!strncmp (e, "spin-ycw", 8)) - { - eff->type |= MBWMCompMgrEffectSpinYCW; - } - else if (!strncmp (e, "spin-yccw", 9)) - { - eff->type |= MBWMCompMgrEffectSpinYCCW; - } - else if (!strncmp (e, "spin-zcw", 8)) - { - eff->type |= MBWMCompMgrEffectSpinZCW; - } - else if (!strncmp (e, "spin-zccw", 9)) - { - eff->type |= MBWMCompMgrEffectSpinZCCW; - } - else if (!strncmp (e, "fade", 4)) - { - eff->type |= MBWMCompMgrEffectFade; - } - else if (!strncmp (e, "unfade", 4)) - { - eff->type |= MBWMCompMgrEffectUnfade; - } - else if (!strncmp (e, "slide-in", 8)) - { - eff->type |= MBWMCompMgrEffectSlideIn; - } - else if (!strncmp (e, "slide-out", 9)) - { - eff->type |= MBWMCompMgrEffectSlideOut; - } - - bar = strchr (e, '|'); - - if (bar) - e = bar + 1; - else - break; - } - } - - p += 2; - } - - if (!eff->event || !eff->type) - { - free (eff); - return; - } - - /* - * Default to sensible value when no duration set - */ - if (!eff->duration) - eff->duration = 200; - - c->effects = mb_wm_util_list_prepend (c->effects, eff); - - xml_stack_top_set_data (exd->stack, eff); - - return; - } - - if (!strcmp (tag, "transition")) - { - MBWMThemeTransition *trs; - XmlCtx ctx = xml_stack_top_ctx (exd->stack); - MBWMXmlClient *c = xml_stack_top_data (exd->stack); - const char **p = expat_attr; - - trs = mb_wm_util_malloc0 (sizeof (MBWMThemeTransition)); - - xml_stack_push (&exd->stack, XML_CTX_TRANSITION); - - if (ctx != XML_CTX_CLIENT || !c) - { - MBWM_DBG ("Expected context client"); - return; - } - - while (*p) - { - if (!strcmp (*p, "type")) - { - const char *e = *(p+1); - - if (!strncmp (e, "fade", 4)) - { - trs->type = MBWMCompMgrTransitionFade; - } - else if (!strncmp (e, "slide", 5)) - { - trs->type = MBWMCompMgrTransitionSlide; - } - else if (!strcmp (*p, "gravity")) - { - const char * g = *(p+1); - - if (!strncmp (g, "none", 2)) - trs->gravity = MBWMGravityNone; - else if (!strncmp (g, "nw", 2)) - trs->gravity = MBWMGravityNorthWest; - else if (!strncmp (g, "ne", 2)) - trs->gravity = MBWMGravityNorthEast; - else if (!strncmp (g, "sw", 2)) - trs->gravity = MBWMGravitySouthWest; - else if (!strncmp (g, "se", 2)) - trs->gravity = MBWMGravitySouthEast; - else - { - switch (*g) - { - case 'n': - trs->gravity = MBWMGravityNorth; break; - case 's': - trs->gravity = MBWMGravitySouth; break; - case 'w': - trs->gravity = MBWMGravityWest; break; - case 'e': - trs->gravity = MBWMGravityEast; break; - default: - trs->gravity = MBWMGravityNone; - } - } - } - } - else if (!strcmp (*p, "duration")) - trs->duration = atoi (*(p+1)); - - p += 2; - } - - if (!trs->type) - { - free (trs); - return; - } - - /* - * Default to sensible value when no duration set - */ - if (!trs->duration) - trs->duration = 200; - - c->transition = trs; - - xml_stack_top_set_data (exd->stack, trs); - - return; - } - -#endif - if (!strcmp (tag, "decor")) { MBWMXmlDecor * d = mb_wm_xml_decor_new (); @@ -1548,24 +1260,6 @@ xml_element_end_cb (void *data, const char *tag) else MBWM_DBG ("Expected client on the top of the stack!"); } - else if (!strcmp (tag, "effect")) - { - if (ctx == XML_CTX_EFFECT) - { - xml_stack_pop (&exd->stack); - } - else - MBWM_DBG ("Expected effect on the top of the stack!"); - } - else if (!strcmp (tag, "transition")) - { - if (ctx == XML_CTX_TRANSITION) - { - xml_stack_pop (&exd->stack); - } - else - MBWM_DBG ("Expected transition on the top of the stack!"); - } else if (!strcmp (tag, "decor")) { if (ctx == XML_CTX_DECOR) diff --git a/matchbox/theme-engines/mb-wm-theme.h b/matchbox/theme-engines/mb-wm-theme.h index 73311d2..fc9b03a 100644 --- a/matchbox/theme-engines/mb-wm-theme.h +++ b/matchbox/theme-engines/mb-wm-theme.h @@ -40,23 +40,6 @@ #define MB_WM_THEME_PNG_CLASS(c) ((MBWMThemePngClass*)(c)) #define MB_WM_TYPE_THEME_PNG (mb_wm_theme_png_class_type ()) -#if ENABLE_COMPOSITE -typedef struct _MBWMThemeEffects -{ - MBWMCompMgrEffectEvent event; - MBWMCompMgrEffectType type; - unsigned long duration; - MBWMGravity gravity; -} MBWMThemeEffects; - -typedef struct _MBWMThemeTransition -{ - MBWMCompMgrTransitionType type; - unsigned long duration; - MBWMGravity gravity; -} MBWMThemeTransition; -#endif - enum MBWMThemeCaps { MBWMThemeCapsFrameMainButtonActionAccept = (1<<0), @@ -185,15 +168,6 @@ MBWMClientLayoutHints mb_wm_theme_get_client_layout_hints (MBWMTheme * theme, MBWindowManagerClient * client); -#if ENABLE_COMPOSITE -const MBWMList * -mb_wm_theme_get_client_effects (MBWMTheme * theme, - MBWindowManagerClient * client); -MBWMThemeTransition * -mb_wm_theme_get_client_transition (MBWMTheme * theme, - MBWindowManagerClient * client); -#endif - Bool mb_wm_theme_is_client_shaped (MBWMTheme * theme, MBWindowManagerClient * client);