diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/effects.c | 43 | ||||
-rw-r--r-- | src/core/effects.h | 1 | ||||
-rw-r--r-- | src/core/window-private.h | 4 | ||||
-rw-r--r-- | src/core/window.c | 183 |
4 files changed, 83 insertions, 148 deletions
diff --git a/src/core/effects.c b/src/core/effects.c index 163ec054..2866246f 100644 --- a/src/core/effects.c +++ b/src/core/effects.c @@ -67,7 +67,6 @@ #endif #define META_MINIMIZE_ANIMATION_LENGTH 0.25 -#define META_UNMINIMIZE_ANIMATION_LENGTH 0.25 #define META_SHADE_ANIMATION_LENGTH 0.2 #include <string.h> @@ -99,9 +98,6 @@ typedef struct MetaRectangle start_rect; MetaRectangle end_rect; - MetaEffectFinished finished; - gpointer finished_data; - } BoxAnimationContext; /** @@ -153,9 +149,7 @@ static void draw_box_animation (MetaScreen *screen, MetaRectangle *initial_rect, MetaRectangle *destination_rect, - double seconds_duration, - MetaEffectFinished finished, - gpointer finished_data); + double seconds_duration); /** * Creates an effect. @@ -179,13 +173,17 @@ create_effect (MetaEffectType type, } /** - * Destroys an effect. + * Destroys an effect. If the effect has a "finished" hook, it will be + * called before cleanup. * * \param effect The effect. */ static void effect_free (MetaEffect *effect) { + if (effect->priv->finished) + effect->priv->finished (effect->priv->finished_data); + g_free (effect->priv); g_free (effect); } @@ -366,8 +364,6 @@ effects_draw_box_animation_timeout (BoxAnimationContext *context) context->gc); #endif /* !HAVE_SHAPE */ - context->finished(context->finished_data); - g_free (context); return FALSE; } @@ -415,9 +411,7 @@ void draw_box_animation (MetaScreen *screen, MetaRectangle *initial_rect, MetaRectangle *destination_rect, - double seconds_duration, - MetaEffectFinished finished, - gpointer finished_data) + double seconds_duration) { BoxAnimationContext *context; @@ -442,9 +436,6 @@ draw_box_animation (MetaScreen *screen, context->start_rect = *initial_rect; context->end_rect = *destination_rect; - context->finished = finished; - context->finished_data = finished_data; - #ifdef HAVE_SHAPE attrs.override_redirect = True; @@ -707,17 +698,7 @@ run_default_effect_handler (MetaEffect *effect) draw_box_animation (effect->window->screen, &(effect->u.minimize.window_rect), &(effect->u.minimize.icon_rect), - META_MINIMIZE_ANIMATION_LENGTH, - effect->priv->finished, - effect->priv->finished_data); - break; - case META_EFFECT_UNMINIMIZE: - draw_box_animation (effect->window->screen, - &(effect->u.minimize.icon_rect), - &(effect->u.minimize.window_rect), - META_UNMINIMIZE_ANIMATION_LENGTH, - effect->priv->finished, - effect->priv->finished_data); + META_MINIMIZE_ANIMATION_LENGTH); break; default: @@ -728,16 +709,8 @@ run_default_effect_handler (MetaEffect *effect) static void run_handler (MetaEffect *effect) { - /* If effects are disabled just run the finished function */ if (meta_prefs_get_mate_animations ()) - { run_default_effect_handler (effect); - } - else - { - if (effect->priv->finished) - effect->priv->finished(effect->priv->finished_data); - } effect_free (effect); } diff --git a/src/core/effects.h b/src/core/effects.h index e0025ff6..ca25aa88 100644 --- a/src/core/effects.h +++ b/src/core/effects.h @@ -50,7 +50,6 @@ typedef enum { - META_EFFECT_NONE = 0, META_EFFECT_MINIMIZE, META_EFFECT_UNMINIMIZE, META_EFFECT_FOCUS, diff --git a/src/core/window-private.h b/src/core/window-private.h index 0b3cf594..88713101 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -36,7 +36,6 @@ #include <config.h> #include "window.h" -#include "effects.h" #include "screen-private.h" #include "util.h" #include "stack.h" @@ -187,9 +186,6 @@ struct _MetaWindow guint was_minimized : 1; guint tab_unminimized : 1; - /* Whether there is a pending effect */ - MetaEffectType effect_pending; - /* Whether the window is mapped; actual server-side state * see also unmaps_pending */ diff --git a/src/core/window.c b/src/core/window.c index 08bf58ac..461d38fb 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -483,7 +483,6 @@ meta_window_new_with_attrs (MetaDisplay *display, window->minimized = FALSE; window->was_minimized = FALSE; window->tab_unminimized = FALSE; - window->effect_pending = META_EFFECT_NONE; window->iconic = FALSE; window->mapped = attrs->map_state != IsUnmapped; /* if already mapped, no need to worry about focus-on-first-time-showing */ @@ -1460,119 +1459,80 @@ static void finish_minimize (gpointer data) { MetaWindow *window = data; + /* FIXME: It really sucks to put timestamp pinging here; it'd + * probably make more sense in implement_showing() so that it's at + * least not duplicated in meta_window_show; but since + * finish_minimize is a callback making things just slightly icky, I + * haven't done that yet. + */ + guint32 timestamp = meta_display_get_current_time_roundtrip (window->display); - window->effect_pending = META_EFFECT_NONE; -} - -static void -finish_unminimize (gpointer data) -{ - MetaWindow *window = data; - - meta_window_show (window); - window->was_minimized = FALSE; - window->effect_pending = META_EFFECT_NONE; -} - -static void -meta_window_animate_minimize (MetaWindow *window) -{ - MetaRectangle icon_rect, window_rect; - gboolean result; - - /* Check if the window has an icon geometry */ - result = meta_window_get_icon_geometry (window, &icon_rect); - - if (!result) + meta_window_hide (window); + if (window->has_focus) { - /* just animate into the corner somehow - maybe - * not a good idea... - */ - icon_rect.x = window->screen->rect.width; - icon_rect.y = window->screen->rect.height; - icon_rect.width = 1; - icon_rect.height = 1; + meta_workspace_focus_default_window (window->screen->active_workspace, + window, + timestamp); } - - meta_window_get_outer_rect (window, &window_rect); - - meta_effect_run_minimize (window, - &window_rect, - &icon_rect, - finish_minimize, - window); } static void -meta_window_animate_unminimize (MetaWindow *window) +implement_showing (MetaWindow *window, + gboolean showing) { - MetaRectangle icon_rect, window_rect; - gboolean result; - - /* Check if the window has an icon geometry */ - result = meta_window_get_icon_geometry (window, &icon_rect); + /* Actually show/hide the window */ + meta_verbose ("Implement showing = %d for window %s\n", + showing, window->desc); - if (!result) + if (!showing) { - /* just animate into the corner somehow - maybe - * not a good idea... + gboolean on_workspace; + + on_workspace = meta_window_located_on_workspace (window, + window->screen->active_workspace); + + /* Really this effects code should probably + * be in meta_window_hide so the window->mapped + * test isn't duplicated here. Anyhow, we animate + * if we are mapped now, we are supposed to + * be minimized, and we are on the current workspace. */ - icon_rect.x = window->screen->rect.width; - icon_rect.y = window->screen->rect.height; - icon_rect.width = 1; - icon_rect.height = 1; - } + if (on_workspace && window->minimized && window->mapped && + !meta_prefs_get_reduced_resources ()) + { + MetaRectangle icon_rect, window_rect; + gboolean result; - meta_window_get_outer_rect (window, &window_rect); + /* Check if the window has an icon geometry */ + result = meta_window_get_icon_geometry (window, &icon_rect); - meta_effect_run_unminimize (window, - &window_rect, - &icon_rect, - finish_unminimize, - window); -} + if (!result) + { + /* just animate into the corner somehow - maybe + * not a good idea... + */ + icon_rect.x = window->screen->rect.width; + icon_rect.y = window->screen->rect.height; + icon_rect.width = 1; + icon_rect.height = 1; + } -static void -implement_showing (MetaWindow *window, - gboolean showing) -{ - /* Actually show/hide the window */ - meta_verbose ("Implement showing = %d for window %s with effect pending %i\n", - showing, window->desc, window->effect_pending); + meta_window_get_outer_rect (window, &window_rect); - if (!showing) - { - /* Handle pending effects */ - switch(window->effect_pending) - { - case META_EFFECT_MINIMIZE: - /* First hide the window and then animate */ - meta_window_hide(window); - meta_window_animate_minimize (window); - break; - case META_EFFECT_UNMINIMIZE: - case META_EFFECT_NONE: - default: - meta_window_hide(window); - break; - } + meta_effect_run_minimize (window, + &window_rect, + &icon_rect, + finish_minimize, + window); + } + else + { + finish_minimize (window); + } } else { - /* Handle pending effects */ - switch(window->effect_pending) - { - case META_EFFECT_MINIMIZE: - break; - case META_EFFECT_UNMINIMIZE: - /* First animate then show the window */ - meta_window_animate_unminimize (window); - break; - case META_EFFECT_NONE: - default: - meta_window_show (window); - break; - } + meta_window_show (window); } } @@ -2335,6 +2295,24 @@ meta_window_show (MetaWindow *window) XMapWindow (window->display->xdisplay, window->xwindow); meta_error_trap_pop (window->display, FALSE); did_show = TRUE; + + if (window->was_minimized) + { + MetaRectangle window_rect; + MetaRectangle icon_rect; + + window->was_minimized = FALSE; + + if (meta_window_get_icon_geometry (window, &icon_rect)) + { + meta_window_get_outer_rect (window, &window_rect); + + meta_effect_run_unminimize (window, + &window_rect, + &icon_rect, + NULL, NULL); + } + } } if (window->iconic) @@ -2373,10 +2351,6 @@ meta_window_show (MetaWindow *window) meta_display_increment_focus_sentinel (window->display); } } - else if (window->was_minimized) - { - meta_window_focus(window, timestamp); - } set_net_wm_state (window); @@ -2463,8 +2437,6 @@ meta_window_minimize (MetaWindow *window) if (!window->minimized) { window->minimized = TRUE; - /* Flag minimize effect pending */ - window->effect_pending = META_EFFECT_MINIMIZE; meta_window_queue(window, META_QUEUE_CALC_SHOWING); meta_window_foreach_transient (window, @@ -2484,8 +2456,6 @@ meta_window_minimize (MetaWindow *window) window->desc); } } - - /* Should insert minimize effect here? */ } void @@ -2495,15 +2465,12 @@ meta_window_unminimize (MetaWindow *window) { window->minimized = FALSE; window->was_minimized = TRUE; - window->effect_pending = META_EFFECT_UNMINIMIZE; meta_window_queue(window, META_QUEUE_CALC_SHOWING); meta_window_foreach_transient (window, queue_calc_showing_func, NULL); } - - /* Should insert unminimize effect here? */ } static void |