[mutter/wip/mult-window-actors: 4/9] default: Fix up for latest Clutter deprecations
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/mult-window-actors: 4/9] default: Fix up for latest Clutter deprecations
- Date: Mon, 25 Jun 2012 18:15:08 +0000 (UTC)
commit aefc985e59712fa3c749cb2f0c0c96ca75c8e4e7
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Tue Jan 17 09:32:41 2012 -0500
default: Fix up for latest Clutter deprecations
src/compositor/plugins/default.c | 380 +++++++++++---------------------------
1 files changed, 106 insertions(+), 274 deletions(-)
---
diff --git a/src/compositor/plugins/default.c b/src/compositor/plugins/default.c
index 71839c2..430a9e1 100644
--- a/src/compositor/plugins/default.c
+++ b/src/compositor/plugins/default.c
@@ -38,7 +38,7 @@
#define MAP_TIMEOUT 250
#define SWITCH_TIMEOUT 500
-#define ACTOR_DATA_KEY "MCCP-Default-actor-data"
+#define ORIG_PARENT_KEY "MCCP-original-parent"
#define META_TYPE_DEFAULT_PLUGIN (meta_default_plugin_get_type ())
#define META_DEFAULT_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEFAULT_PLUGIN, MetaDefaultPlugin))
@@ -66,8 +66,6 @@ struct _MetaDefaultPluginClass
MetaPluginClass parent_class;
};
-static GQuark actor_data_quark = 0;
-
static void minimize (MetaPlugin *plugin,
MetaWindowActor *actor);
static void map (MetaPlugin *plugin,
@@ -106,38 +104,12 @@ META_PLUGIN_DECLARE(MetaDefaultPlugin, meta_default_plugin);
struct _MetaDefaultPluginPrivate
{
/* Valid only when switch_workspace effect is in progress */
- ClutterTimeline *tml_switch_workspace1;
- ClutterTimeline *tml_switch_workspace2;
ClutterActor *desktop1;
ClutterActor *desktop2;
MetaPluginInfo info;
};
-/*
- * Per actor private data we attach to each actor.
- */
-typedef struct _ActorPrivate
-{
- ClutterActor *orig_parent;
-
- ClutterTimeline *tml_minimize;
- ClutterTimeline *tml_maximize;
- ClutterTimeline *tml_destroy;
- ClutterTimeline *tml_map;
-
- gboolean is_minimized : 1;
- gboolean is_maximized : 1;
-} ActorPrivate;
-
-/* callback data for when animations complete */
-typedef struct
-{
- ClutterActor *actor;
- MetaPlugin *plugin;
-} EffectCompleteData;
-
-
static void
meta_default_plugin_dispose (GObject *object)
{
@@ -218,66 +190,35 @@ meta_default_plugin_init (MetaDefaultPlugin *self)
priv->info.description = "This is an example of a plugin implementation.";
}
-/*
- * Actor private data accessor
- */
static void
-free_actor_private (gpointer data)
+on_switch_workspace_effect_complete (ClutterActor *actor,
+ gpointer data)
{
- if (G_LIKELY (data != NULL))
- g_slice_free (ActorPrivate, data);
-}
-
-static ActorPrivate *
-get_actor_private (MetaWindowActor *actor)
-{
- ActorPrivate *priv = g_object_get_qdata (G_OBJECT (actor), actor_data_quark);
-
- if (G_UNLIKELY (actor_data_quark == 0))
- actor_data_quark = g_quark_from_static_string (ACTOR_DATA_KEY);
-
- if (G_UNLIKELY (!priv))
- {
- priv = g_slice_new0 (ActorPrivate);
-
- g_object_set_qdata_full (G_OBJECT (actor),
- actor_data_quark, priv,
- free_actor_private);
- }
-
- return priv;
-}
-
-static void
-on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data)
-{
- MetaPlugin *plugin = META_PLUGIN (data);
+ MetaPlugin *plugin = META_PLUGIN (data);
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
- MetaScreen *screen = meta_plugin_get_screen (plugin);
- GList *l = meta_get_window_actors (screen);
+ ClutterActorIter iter;
+ ClutterActor *child;
- while (l)
+ clutter_actor_iter_init (&iter, actor);
+ while (clutter_actor_iter_next (&iter, &child))
{
- ClutterActor *a = l->data;
- MetaWindowActor *window_actor = META_WINDOW_ACTOR (a);
- ActorPrivate *apriv = get_actor_private (window_actor);
+ ClutterActor *orig_parent = g_object_get_data (G_OBJECT (actor), ORIG_PARENT_KEY);
- if (apriv->orig_parent)
+ if (orig_parent != NULL)
{
- clutter_actor_reparent (a, apriv->orig_parent);
- apriv->orig_parent = NULL;
+ clutter_actor_remove_child (actor, child);
+ clutter_actor_add_child (child, orig_parent);
+ g_object_set_data (G_OBJECT (actor), ORIG_PARENT_KEY, NULL);
}
-
- l = l->next;
}
- clutter_actor_destroy (priv->desktop1);
- clutter_actor_destroy (priv->desktop2);
+ if (actor == priv->desktop1)
+ priv->desktop1 = NULL;
+
+ if (actor == priv->desktop2)
+ priv->desktop2 = NULL;
- priv->tml_switch_workspace1 = NULL;
- priv->tml_switch_workspace2 = NULL;
- priv->desktop1 = NULL;
- priv->desktop2 = NULL;
+ clutter_actor_destroy (actor);
meta_plugin_switch_workspace_completed (plugin);
}
@@ -290,11 +231,10 @@ switch_workspace (MetaPlugin *plugin,
MetaScreen *screen;
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
GList *l;
- ClutterActor *workspace0 = clutter_group_new ();
- ClutterActor *workspace1 = clutter_group_new ();
+ ClutterActor *workspace0 = clutter_actor_new ();
+ ClutterActor *workspace1 = clutter_actor_new ();
ClutterActor *stage;
int screen_width, screen_height;
- ClutterAnimation *animation;
screen = meta_plugin_get_screen (plugin);
stage = meta_get_stage_for_screen (screen);
@@ -312,8 +252,8 @@ switch_workspace (MetaPlugin *plugin,
clutter_actor_set_scale (workspace1, 0.0, 0.0);
- clutter_container_add_actor (CLUTTER_CONTAINER (stage), workspace1);
- clutter_container_add_actor (CLUTTER_CONTAINER (stage), workspace0);
+ clutter_actor_add_child (stage, workspace1);
+ clutter_actor_add_child (stage, workspace0);
if (from == to)
{
@@ -326,7 +266,6 @@ switch_workspace (MetaPlugin *plugin,
while (l)
{
MetaWindowActor *window_actor = l->data;
- ActorPrivate *apriv = get_actor_private (window_actor);
ClutterActor *actor = CLUTTER_ACTOR (window_actor);
gint win_workspace;
@@ -334,23 +273,23 @@ switch_workspace (MetaPlugin *plugin,
if (win_workspace == to || win_workspace == from)
{
- apriv->orig_parent = clutter_actor_get_parent (actor);
-
- clutter_actor_reparent (actor,
- win_workspace == to ? workspace1 : workspace0);
- clutter_actor_show_all (actor);
- clutter_actor_raise_top (actor);
- }
- else if (win_workspace < 0)
- {
- /* Sticky window */
- apriv->orig_parent = NULL;
+ ClutterActor *old_parent, *new_parent;
+
+ old_parent = clutter_actor_get_parent (actor);
+ g_object_set_data_full (G_OBJECT (actor), ORIG_PARENT_KEY,
+ g_object_ref (old_parent),
+ (GDestroyNotify) g_object_unref);
+
+ clutter_actor_remove_child (old_parent, actor);
+ new_parent = win_workspace == to ? workspace1 : workspace0;
+ clutter_actor_add_child (new_parent, actor);
+ clutter_actor_show (actor);
+ clutter_actor_set_child_above_sibling (new_parent, actor, NULL);
}
else
{
/* Window on some other desktop */
clutter_actor_hide (actor);
- apriv->orig_parent = NULL;
}
l = l->prev;
@@ -359,23 +298,23 @@ switch_workspace (MetaPlugin *plugin,
priv->desktop1 = workspace0;
priv->desktop2 = workspace1;
- animation = clutter_actor_animate (workspace0, CLUTTER_EASE_IN_SINE,
- SWITCH_TIMEOUT,
- "scale-x", 1.0,
- "scale-y", 1.0,
- NULL);
- priv->tml_switch_workspace1 = clutter_animation_get_timeline (animation);
- g_signal_connect (priv->tml_switch_workspace1,
- "completed",
+ clutter_actor_save_easing_state (workspace0);
+ clutter_actor_set_easing_mode (workspace0, CLUTTER_EASE_IN_SINE);
+ clutter_actor_set_easing_duration (workspace0, SWITCH_TIMEOUT);
+ clutter_actor_set_scale (workspace0, 1.0, 1.0);
+ g_signal_connect (workspace0, "transitions-completed",
G_CALLBACK (on_switch_workspace_effect_complete),
plugin);
+ clutter_actor_restore_easing_state (workspace0);
- animation = clutter_actor_animate (workspace1, CLUTTER_EASE_IN_SINE,
- SWITCH_TIMEOUT,
- "scale-x", 0.0,
- "scale-y", 0.0,
- NULL);
- priv->tml_switch_workspace2 = clutter_animation_get_timeline (animation);
+ clutter_actor_save_easing_state (workspace1);
+ clutter_actor_set_easing_mode (workspace1, CLUTTER_EASE_IN_SINE);
+ clutter_actor_set_easing_duration (workspace1, SWITCH_TIMEOUT);
+ clutter_actor_set_scale (workspace1, 0.0, 0.0);
+ g_signal_connect (workspace1, "transitions-completed",
+ G_CALLBACK (on_switch_workspace_effect_complete),
+ plugin);
+ clutter_actor_restore_easing_state (workspace1);
}
@@ -384,31 +323,21 @@ switch_workspace (MetaPlugin *plugin,
* calls the manager callback function.
*/
static void
-on_minimize_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data)
+on_minimize_effect_complete (ClutterActor *actor,
+ MetaPlugin *plugin)
{
- /*
- * Must reverse the effect of the effect; must hide it first to ensure
- * that the restoration will not be visible.
- */
- MetaPlugin *plugin = data->plugin;
- ActorPrivate *apriv;
- MetaWindowActor *window_actor = META_WINDOW_ACTOR (data->actor);
+ MetaWindowActor *window_actor = META_WINDOW_ACTOR (actor);
- apriv = get_actor_private (META_WINDOW_ACTOR (data->actor));
- apriv->tml_minimize = NULL;
-
- clutter_actor_hide (data->actor);
+ clutter_actor_hide (actor);
/* FIXME - we shouldn't assume the original scale, it should be saved
* at the start of the effect */
- clutter_actor_set_scale (data->actor, 1.0, 1.0);
- clutter_actor_move_anchor_point_from_gravity (data->actor,
+ clutter_actor_set_scale (actor, 1.0, 1.0);
+ clutter_actor_move_anchor_point_from_gravity (actor,
CLUTTER_GRAVITY_NORTH_WEST);
/* Now notify the manager that we are done with this effect */
meta_plugin_minimize_completed (plugin, window_actor);
-
- g_free (data);
}
/*
@@ -434,29 +363,19 @@ minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
if (type == META_WINDOW_NORMAL)
{
- ClutterAnimation *animation;
- EffectCompleteData *data = g_new0 (EffectCompleteData, 1);
- ActorPrivate *apriv = get_actor_private (window_actor);
-
- apriv->is_minimized = TRUE;
-
clutter_actor_move_anchor_point_from_gravity (actor,
CLUTTER_GRAVITY_CENTER);
- animation = clutter_actor_animate (actor,
- CLUTTER_EASE_IN_SINE,
- MINIMIZE_TIMEOUT,
- "scale-x", 0.0,
- "scale-y", 0.0,
- "x", (double)icon_geometry.x,
- "y", (double)icon_geometry.y,
- NULL);
- apriv->tml_minimize = clutter_animation_get_timeline (animation);
- data->plugin = plugin;
- data->actor = actor;
- g_signal_connect (apriv->tml_minimize, "completed",
+ clutter_actor_save_easing_state (actor);
+ clutter_actor_set_easing_mode (actor, CLUTTER_EASE_IN_SINE);
+ clutter_actor_set_easing_duration (actor, MINIMIZE_TIMEOUT);
+ clutter_actor_set_scale (actor, 0.0, 0.0);
+ clutter_actor_set_position (actor, icon_geometry.x, icon_geometry.y);
+ clutter_actor_restore_easing_state (actor);
+
+ g_signal_connect (actor, "transitions-completed",
G_CALLBACK (on_minimize_effect_complete),
- data);
+ plugin);
}
else
@@ -468,26 +387,18 @@ minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
* calls the manager callback function.
*/
static void
-on_maximize_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data)
+on_maximize_effect_complete (ClutterActor *actor,
+ MetaPlugin *plugin)
{
- /*
- * Must reverse the effect of the effect.
- */
- MetaPlugin *plugin = data->plugin;
- MetaWindowActor *window_actor = META_WINDOW_ACTOR (data->actor);
- ActorPrivate *apriv = get_actor_private (window_actor);
-
- apriv->tml_maximize = NULL;
+ MetaWindowActor *window_actor = META_WINDOW_ACTOR (actor);
/* FIXME - don't assume the original scale was 1.0 */
- clutter_actor_set_scale (data->actor, 1.0, 1.0);
- clutter_actor_move_anchor_point_from_gravity (data->actor,
+ clutter_actor_set_scale (actor, 1.0, 1.0);
+ clutter_actor_move_anchor_point_from_gravity (actor,
CLUTTER_GRAVITY_NORTH_WEST);
/* Now notify the manager that we are done with this effect */
meta_plugin_maximize_completed (plugin, window_actor);
-
- g_free (data);
}
/*
@@ -516,14 +427,9 @@ maximize (MetaPlugin *plugin,
if (type == META_WINDOW_NORMAL)
{
- ClutterAnimation *animation;
- EffectCompleteData *data = g_new0 (EffectCompleteData, 1);
- ActorPrivate *apriv = get_actor_private (window_actor);
gfloat width, height;
gfloat x, y;
- apriv->is_maximized = TRUE;
-
clutter_actor_get_size (actor, &width, &height);
clutter_actor_get_position (actor, &x, &y);
@@ -541,22 +447,18 @@ maximize (MetaPlugin *plugin,
clutter_actor_move_anchor_point (actor, anchor_x, anchor_y);
- animation = clutter_actor_animate (actor,
- CLUTTER_EASE_IN_SINE,
- MAXIMIZE_TIMEOUT,
- "scale-x", scale_x,
- "scale-y", scale_y,
- NULL);
- apriv->tml_maximize = clutter_animation_get_timeline (animation);
- data->plugin = plugin;
- data->actor = actor;
- g_signal_connect (apriv->tml_maximize, "completed",
+ clutter_actor_save_easing_state (actor);
+ clutter_actor_set_easing_mode (actor, CLUTTER_EASE_IN_SINE);
+ clutter_actor_set_easing_duration (actor, MAXIMIZE_TIMEOUT);
+ clutter_actor_set_scale (actor, scale_x, scale_y);
+ clutter_actor_restore_easing_state (actor);
+
+ g_signal_connect (actor, "transitions-completed",
G_CALLBACK (on_maximize_effect_complete),
- data);
- return;
+ plugin);
}
-
- meta_plugin_maximize_completed (plugin, window_actor);
+ else
+ meta_plugin_maximize_completed (plugin, window_actor);
}
/*
@@ -569,39 +471,19 @@ unmaximize (MetaPlugin *plugin,
MetaWindowActor *window_actor,
gint end_x, gint end_y, gint end_width, gint end_height)
{
- MetaWindow *meta_window = meta_window_actor_get_meta_window (window_actor);
- MetaWindowType type = meta_window_get_window_type (meta_window);
-
- if (type == META_WINDOW_NORMAL)
- {
- ActorPrivate *apriv = get_actor_private (window_actor);
-
- apriv->is_maximized = FALSE;
- }
-
- /* Do this conditionally, if the effect requires completion callback. */
meta_plugin_unmaximize_completed (plugin, window_actor);
}
static void
-on_map_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data)
+on_map_effect_complete (ClutterActor *actor,
+ MetaPlugin *plugin)
{
- /*
- * Must reverse the effect of the effect.
- */
- MetaPlugin *plugin = data->plugin;
- MetaWindowActor *window_actor = META_WINDOW_ACTOR (data->actor);
- ActorPrivate *apriv = get_actor_private (window_actor);
-
- apriv->tml_map = NULL;
+ MetaWindowActor *window_actor = META_WINDOW_ACTOR (actor);
- clutter_actor_move_anchor_point_from_gravity (data->actor,
- CLUTTER_GRAVITY_NORTH_WEST);
+ clutter_actor_move_anchor_point_from_gravity (actor, CLUTTER_GRAVITY_NORTH_WEST);
/* Now notify the manager that we are done with this effect */
meta_plugin_map_completed (plugin, window_actor);
-
- g_free (data);
}
/*
@@ -619,31 +501,21 @@ map (MetaPlugin *plugin, MetaWindowActor *window_actor)
if (type == META_WINDOW_NORMAL)
{
- ClutterAnimation *animation;
- EffectCompleteData *data = g_new0 (EffectCompleteData, 1);
- ActorPrivate *apriv = get_actor_private (window_actor);
-
clutter_actor_move_anchor_point_from_gravity (actor,
CLUTTER_GRAVITY_CENTER);
clutter_actor_set_scale (actor, 0.0, 0.0);
clutter_actor_show (actor);
- animation = clutter_actor_animate (actor,
- CLUTTER_EASE_IN_SINE,
- MAP_TIMEOUT,
- "scale-x", 1.0,
- "scale-y", 1.0,
- NULL);
- apriv->tml_map = clutter_animation_get_timeline (animation);
- data->actor = actor;
- data->plugin = plugin;
- g_signal_connect (apriv->tml_map, "completed",
- G_CALLBACK (on_map_effect_complete),
- data);
-
- apriv->is_minimized = FALSE;
+ clutter_actor_save_easing_state (actor);
+ clutter_actor_set_easing_mode (actor, CLUTTER_EASE_IN_SINE);
+ clutter_actor_set_easing_duration (actor, MAP_TIMEOUT);
+ clutter_actor_set_scale (actor, 1.0, 1.0);
+ clutter_actor_restore_easing_state (actor);
+ g_signal_connect (actor, "transitions-completed",
+ G_CALLBACK (on_map_effect_complete),
+ plugin);
}
else
meta_plugin_map_completed (plugin, window_actor);
@@ -654,13 +526,10 @@ map (MetaPlugin *plugin, MetaWindowActor *window_actor)
* further action than notifying the manager that the effect is completed.
*/
static void
-on_destroy_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data)
+on_destroy_effect_complete (ClutterActor *actor,
+ MetaPlugin *plugin)
{
- MetaPlugin *plugin = data->plugin;
- MetaWindowActor *window_actor = META_WINDOW_ACTOR (data->actor);
- ActorPrivate *apriv = get_actor_private (window_actor);
-
- apriv->tml_destroy = NULL;
+ MetaWindowActor *window_actor = META_WINDOW_ACTOR (actor);
meta_plugin_destroy_completed (plugin, window_actor);
}
@@ -679,74 +548,37 @@ destroy (MetaPlugin *plugin, MetaWindowActor *window_actor)
if (type == META_WINDOW_NORMAL)
{
- ClutterAnimation *animation;
- EffectCompleteData *data = g_new0 (EffectCompleteData, 1);
- ActorPrivate *apriv = get_actor_private (window_actor);
-
clutter_actor_move_anchor_point_from_gravity (actor,
CLUTTER_GRAVITY_CENTER);
- animation = clutter_actor_animate (actor,
- CLUTTER_EASE_IN_SINE,
- DESTROY_TIMEOUT,
- "scale-x", 0.0,
- "scale-y", 1.0,
- NULL);
- apriv->tml_destroy = clutter_animation_get_timeline (animation);
- data->plugin = plugin;
- data->actor = actor;
- g_signal_connect (apriv->tml_destroy, "completed",
+
+ clutter_actor_save_easing_state (actor);
+ clutter_actor_set_easing_mode (actor, CLUTTER_EASE_IN_SINE);
+ clutter_actor_set_easing_duration (actor, DESTROY_TIMEOUT);
+ clutter_actor_set_scale (actor, 1.0, 1.0);
+
+ g_signal_connect (actor, "transitions-completed",
G_CALLBACK (on_destroy_effect_complete),
- data);
+ plugin);
}
else
meta_plugin_destroy_completed (plugin, window_actor);
}
static void
-kill_switch_workspace (MetaPlugin *plugin)
+kill_switch_workspace (MetaPlugin *plugin)
{
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
- if (priv->tml_switch_workspace1)
- {
- clutter_timeline_stop (priv->tml_switch_workspace1);
- clutter_timeline_stop (priv->tml_switch_workspace2);
- g_signal_emit_by_name (priv->tml_switch_workspace1, "completed", NULL);
- }
+ clutter_actor_remove_all_transitions (priv->desktop1);
+ clutter_actor_remove_all_transitions (priv->desktop2);
}
static void
kill_window_effects (MetaPlugin *plugin,
MetaWindowActor *window_actor)
{
- ActorPrivate *apriv;
-
- apriv = get_actor_private (window_actor);
-
- if (apriv->tml_minimize)
- {
- clutter_timeline_stop (apriv->tml_minimize);
- g_signal_emit_by_name (apriv->tml_minimize, "completed", NULL);
- }
-
- if (apriv->tml_maximize)
- {
- clutter_timeline_stop (apriv->tml_maximize);
- g_signal_emit_by_name (apriv->tml_maximize, "completed", NULL);
- }
-
- if (apriv->tml_map)
- {
- clutter_timeline_stop (apriv->tml_map);
- g_signal_emit_by_name (apriv->tml_map, "completed", NULL);
- }
-
- if (apriv->tml_destroy)
- {
- clutter_timeline_stop (apriv->tml_destroy);
- g_signal_emit_by_name (apriv->tml_destroy, "completed", NULL);
- }
+ clutter_actor_remove_all_transitions (CLUTTER_ACTOR (window_actor));
}
static const MetaPluginInfo *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]