summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/effects.c43
-rw-r--r--src/core/effects.h1
-rw-r--r--src/core/window-private.h4
-rw-r--r--src/core/window.c183
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