mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
Move shrink effect code from compositor.c to c-window.c. Stubs for
restore effect. Notes in various places for where to hook in other effects.
This commit is contained in:
parent
7592470dab
commit
22bc36eb3b
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
||||
2006-05-23 Adam Jackson <ajax@freedesktop.org>
|
||||
|
||||
* src/c-window.c:
|
||||
* src/c-window.h:
|
||||
* src/compositor.c:
|
||||
* src/effects.c:
|
||||
* src/effects.h:
|
||||
* src/window.c:
|
||||
Move shrink effect code from compositor.c to c-window.c. Stubs for
|
||||
restore effect. Notes in various places for where to hook in
|
||||
other effects.
|
||||
|
||||
Tue May 23 16:36:04 2006 Søren Sandmann <sandmann@redhat.com>
|
||||
|
||||
* src/compositor.c (do_effect): Also use explode when windows close.
|
||||
|
348
src/c-window.c
348
src/c-window.c
@ -634,3 +634,351 @@ meta_comp_window_explode (MetaCompWindow *comp_window,
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* new shrinkydink code */
|
||||
|
||||
#define SHRINK_TIME 1.0
|
||||
|
||||
typedef struct
|
||||
{
|
||||
MetaEffect *effect;
|
||||
MetaCompWindow *window;
|
||||
gdouble elapsed;
|
||||
GTimer * timer;
|
||||
} ShrinkInfo;
|
||||
|
||||
static gboolean
|
||||
update_shrink (gpointer data)
|
||||
{
|
||||
ShrinkInfo *info = data;
|
||||
CmDrawableNode *node = (CmDrawableNode *)info->window->node;
|
||||
gdouble elapsed = g_timer_elapsed (info->timer, NULL);
|
||||
|
||||
if (elapsed > SHRINK_TIME)
|
||||
{
|
||||
meta_effect_end (info->effect);
|
||||
|
||||
cm_drawable_node_set_viewable (node, FALSE);
|
||||
// cm_drawable_node_set_explosion_level (node, 0.0);
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
gdouble t = elapsed / SHRINK_TIME;
|
||||
|
||||
// cm_drawable_node_set_explosion_level (node, transform (t));
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_window_shrink (MetaCompWindow *comp_window,
|
||||
MetaEffect *effect)
|
||||
{
|
||||
ShrinkInfo *info = g_new0 (ShrinkInfo, 1);
|
||||
|
||||
info->window = comp_window;
|
||||
info->effect = effect;
|
||||
info->timer = g_timer_new ();
|
||||
|
||||
g_idle_add (update_shrink, info);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* old shrinkydink minimize effect */
|
||||
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
|
||||
static gdouble
|
||||
interpolate (gdouble t, gdouble begin, gdouble end, double power)
|
||||
{
|
||||
return (begin + (end - begin) * pow (t, power));
|
||||
}
|
||||
|
||||
static void
|
||||
interpolate_rectangle (gdouble t,
|
||||
WsRectangle * from,
|
||||
WsRectangle * to,
|
||||
WsRectangle * result)
|
||||
{
|
||||
if (!result)
|
||||
return;
|
||||
|
||||
result->x = interpolate (t, from->x, to->x, 2);
|
||||
result->y = interpolate (t, from->y, to->y, 0.5);
|
||||
result->width = interpolate (t, from->width, to->width, 0.7);
|
||||
result->height = interpolate (t, from->height, to->height, 0.7);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
MetaWindow *window;
|
||||
GTimer *timer;
|
||||
|
||||
MetaCompositor *compositor;
|
||||
MetaCompScreen *scr_info;
|
||||
|
||||
MetaAnimationFinishedFunc finished_func;
|
||||
gpointer finished_data;
|
||||
|
||||
gdouble aspect_ratio;
|
||||
|
||||
WsRectangle current_geometry;
|
||||
WsRectangle target_geometry;
|
||||
gdouble current_alpha;
|
||||
gdouble target_alpha;
|
||||
|
||||
int button_x;
|
||||
int button_y;
|
||||
int button_width;
|
||||
int button_height;
|
||||
|
||||
/* FIXME: maybe would be simpler if all of this was an array */
|
||||
gboolean phase_1_started;
|
||||
gboolean phase_2_started;
|
||||
gboolean phase_3_started;
|
||||
gboolean phase_4_started;
|
||||
gboolean phase_5_started;
|
||||
} MiniInfo;
|
||||
|
||||
static void
|
||||
set_geometry (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
WsRectangle rect;
|
||||
|
||||
interpolate_rectangle (elapsed, &info->current_geometry, &info->target_geometry, &rect);
|
||||
|
||||
g_print ("y: %d %d (%f => %d)\n", info->current_geometry.y, info->target_geometry.y,
|
||||
elapsed, rect.y);
|
||||
|
||||
g_print ("setting: %d %d %d %d\n", rect.x, rect.y, rect.width, rect.height);
|
||||
|
||||
meta_comp_screen_set_target_rect (info->scr_info,
|
||||
get_xid (info->window), &rect);
|
||||
}
|
||||
|
||||
static int
|
||||
center (gdouble what, gdouble in)
|
||||
{
|
||||
return (in - what) / 2.0 + 0.5;
|
||||
}
|
||||
|
||||
static void
|
||||
run_phase_1 (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
if (!info->phase_1_started)
|
||||
{
|
||||
#if 0
|
||||
g_print ("starting phase 1\n");
|
||||
#endif
|
||||
info->phase_1_started = TRUE;
|
||||
|
||||
meta_comp_screen_get_real_size (info->scr_info, get_xid (info->window),
|
||||
&info->current_geometry);
|
||||
|
||||
#if 0
|
||||
info->current_geometry.x = info->node->real_x;
|
||||
info->current_geometry.y = info->node->real_y;
|
||||
info->current_geometry.width = info->node->real_width;
|
||||
info->current_geometry.height = info->node->real_height;
|
||||
#endif
|
||||
|
||||
info->target_geometry.height = info->button_height;
|
||||
info->target_geometry.width = info->button_height * info->aspect_ratio;
|
||||
info->target_geometry.x = info->button_x + center (info->target_geometry.width, info->button_width);
|
||||
info->target_geometry.y = info->current_geometry.y + center (info->button_height, info->current_geometry.height);
|
||||
}
|
||||
|
||||
set_geometry (info, elapsed);
|
||||
}
|
||||
|
||||
static void
|
||||
run_phase_2 (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
#define WOBBLE_FACTOR 3
|
||||
|
||||
if (!info->phase_2_started)
|
||||
{
|
||||
WsRectangle cur = info->target_geometry;
|
||||
|
||||
g_print ("starting phase 2\n");
|
||||
|
||||
info->phase_2_started = TRUE;
|
||||
|
||||
info->current_geometry = cur;
|
||||
|
||||
info->target_geometry.x = cur.x + center (WOBBLE_FACTOR * cur.width, cur.width);
|
||||
info->target_geometry.y = cur.y + center (WOBBLE_FACTOR * cur.height, cur.height);
|
||||
info->target_geometry.width = cur.width * WOBBLE_FACTOR;
|
||||
info->target_geometry.height = cur.height * WOBBLE_FACTOR;
|
||||
}
|
||||
|
||||
set_geometry (info, elapsed);
|
||||
}
|
||||
|
||||
static void
|
||||
run_phase_3 (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
if (!info->phase_3_started)
|
||||
{
|
||||
WsRectangle cur = info->target_geometry;
|
||||
WsRectangle real;
|
||||
|
||||
meta_comp_screen_get_real_size (info->scr_info, get_xid (info->window),
|
||||
&real);
|
||||
|
||||
g_print ("starting phase 3\n");
|
||||
info->phase_3_started = TRUE;
|
||||
|
||||
info->current_geometry = cur;
|
||||
|
||||
info->target_geometry.height = info->button_height;
|
||||
info->target_geometry.width = info->button_height * info->aspect_ratio;
|
||||
info->target_geometry.x = info->button_x + center (info->target_geometry.width, info->button_width);
|
||||
info->target_geometry.y = real.y + center (info->button_height, real.height);
|
||||
}
|
||||
|
||||
set_geometry (info, elapsed);
|
||||
}
|
||||
|
||||
static void
|
||||
run_phase_4 (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
if (!info->phase_4_started)
|
||||
{
|
||||
WsRectangle cur = info->target_geometry;
|
||||
|
||||
g_print ("starting phase 4\n");
|
||||
info->phase_4_started = TRUE;
|
||||
|
||||
info->current_geometry = cur;
|
||||
|
||||
info->target_geometry.height = info->button_height;
|
||||
info->target_geometry.width = info->button_height * info->aspect_ratio;
|
||||
info->target_geometry.x = cur.x;
|
||||
g_print ("button y: %d\n", info->button_y);
|
||||
info->target_geometry.y = info->button_y;
|
||||
}
|
||||
|
||||
set_geometry (info, elapsed);
|
||||
}
|
||||
|
||||
static void
|
||||
run_phase_5 (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
if (!info->phase_5_started)
|
||||
{
|
||||
WsRectangle cur = info->target_geometry;
|
||||
|
||||
g_print ("starting phase 5\n");
|
||||
info->phase_5_started = TRUE;
|
||||
|
||||
info->current_geometry = cur;
|
||||
info->target_geometry.x = info->button_x;
|
||||
info->target_geometry.y = info->button_y;
|
||||
info->target_geometry.width = info->button_width;
|
||||
info->target_geometry.height = info->button_height;
|
||||
}
|
||||
|
||||
set_geometry (info, elapsed);
|
||||
|
||||
meta_comp_screen_set_alpha (info->scr_info,
|
||||
get_xid (info->window), 1 - elapsed);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
run_animation_01 (gpointer data)
|
||||
{
|
||||
MiniInfo *info = data;
|
||||
gdouble elapsed;
|
||||
|
||||
elapsed = g_timer_elapsed (info->timer, NULL);
|
||||
|
||||
#define PHASE_0 0.0
|
||||
#define PHASE_1 0.225 /* scale to size of button */
|
||||
#define PHASE_2 0.325 /* scale up a little */
|
||||
#define PHASE_3 0.425 /* scale back a little */
|
||||
#define PHASE_4 0.650 /* move to button */
|
||||
#define PHASE_5 1.0 /* fade out */
|
||||
|
||||
if (elapsed < PHASE_1)
|
||||
{
|
||||
/* phase one */
|
||||
run_phase_1 (info, (elapsed - PHASE_0)/(PHASE_1 - PHASE_0));
|
||||
}
|
||||
else if (elapsed < PHASE_2)
|
||||
{
|
||||
/* phase two */
|
||||
run_phase_2 (info, (elapsed - PHASE_1)/(PHASE_2 - PHASE_1));
|
||||
}
|
||||
else if (elapsed < PHASE_3)
|
||||
{
|
||||
/* phase three */
|
||||
run_phase_3 (info, (elapsed - PHASE_2)/(PHASE_3 - PHASE_2));
|
||||
}
|
||||
else if (elapsed < PHASE_4)
|
||||
{
|
||||
/* phase four */
|
||||
run_phase_4 (info, (elapsed - PHASE_3)/(PHASE_4 - PHASE_3));
|
||||
}
|
||||
else if (elapsed < PHASE_5)
|
||||
{
|
||||
/* phase five */
|
||||
run_phase_5 (info, (elapsed - PHASE_4)/(PHASE_5 - PHASE_4));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (info->finished_func)
|
||||
info->finished_func (info->finished_data);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_minimize (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
MetaAnimationFinishedFunc finished,
|
||||
gpointer data)
|
||||
{
|
||||
MiniInfo *info = g_new (MiniInfo, 1);
|
||||
WsRectangle start;
|
||||
MetaScreen *screen = window->screen;
|
||||
|
||||
info->window = window;
|
||||
info->timer = g_timer_new ();
|
||||
|
||||
info->finished_func = finished;
|
||||
info->finished_data = data;
|
||||
|
||||
info->phase_1_started = FALSE;
|
||||
info->phase_2_started = FALSE;
|
||||
info->phase_3_started = FALSE;
|
||||
info->phase_4_started = FALSE;
|
||||
info->phase_5_started = FALSE;
|
||||
|
||||
info->button_x = x;
|
||||
info->button_y = y;
|
||||
info->button_width = width;
|
||||
info->button_height = height;
|
||||
|
||||
info->compositor = compositor;
|
||||
info->scr_info = screen->compositor_data;
|
||||
|
||||
#if 0
|
||||
cm_drawable_node_set_deformation_func (node, minimize_deformation, info);
|
||||
#endif
|
||||
|
||||
info->aspect_ratio = 1.3;
|
||||
|
||||
g_idle_add (run_animation_01, info);
|
||||
}
|
||||
#endif
|
||||
|
@ -39,6 +39,10 @@ void meta_comp_window_set_updates (MetaCompWindow *comp_window,
|
||||
|
||||
void meta_comp_window_explode (MetaCompWindow *comp_window,
|
||||
MetaEffect *effect);
|
||||
void meta_comp_window_shrink (MetaCompWindow *comp_window,
|
||||
MetaEffect *effect);
|
||||
void meta_comp_window_unshrink (MetaCompWindow *comp_window,
|
||||
MetaEffect *effect);
|
||||
|
||||
#if 0
|
||||
void meta_comp_window_set_explode (MetaCompWindow *comp_window,
|
||||
|
337
src/compositor.c
337
src/compositor.c
@ -109,6 +109,7 @@ static void
|
||||
do_effect (MetaEffect *effect,
|
||||
gpointer data)
|
||||
{
|
||||
/* XXX screen and window should be easier to get than this... */
|
||||
switch (effect->type)
|
||||
{
|
||||
case META_EFFECT_MINIMIZE:
|
||||
@ -118,9 +119,21 @@ do_effect (MetaEffect *effect,
|
||||
MetaCompWindow *window =
|
||||
meta_comp_screen_lookup_window (screen, effect->u.minimize.window->frame->xwindow);
|
||||
|
||||
/* meta_comp_window_shrink (window, effect); */
|
||||
meta_comp_window_explode (window, effect);
|
||||
break;
|
||||
}
|
||||
#if 0
|
||||
case META_EFFECT_RESTORE:
|
||||
{
|
||||
MetaCompScreen *screen = meta_comp_screen_get_by_xwindow (
|
||||
get_xid (effect->u.restore.window));
|
||||
MetaCompWindow *window = meta_comp_screen_lookup_window (
|
||||
screen, effect->u.restore.window->frame->xwindow);
|
||||
meta_comp_window_unshrink (window, effect);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
case META_EFFECT_CLOSE:
|
||||
{
|
||||
MetaCompScreen *screen = meta_comp_screen_get_by_xwindow (
|
||||
@ -690,330 +703,6 @@ minimize_deformation (gdouble time,
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
|
||||
static gdouble
|
||||
interpolate (gdouble t, gdouble begin, gdouble end, double power)
|
||||
{
|
||||
return (begin + (end - begin) * pow (t, power));
|
||||
}
|
||||
|
||||
static void
|
||||
interpolate_rectangle (gdouble t,
|
||||
WsRectangle * from,
|
||||
WsRectangle * to,
|
||||
WsRectangle * result)
|
||||
{
|
||||
if (!result)
|
||||
return;
|
||||
|
||||
result->x = interpolate (t, from->x, to->x, 1);
|
||||
result->y = interpolate (t, from->y, to->y, 1);
|
||||
result->width = interpolate (t, from->width, to->width, 1);
|
||||
result->height = interpolate (t, from->height, to->height, 1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#define MINIMIZE_STYLE 1
|
||||
|
||||
#ifndef HAVE_COMPOSITE_EXTENSIONS
|
||||
#undef MINIMIZE_STYLE
|
||||
#define MINIMIZE_STYLE 0
|
||||
#endif
|
||||
|
||||
#if MINIMIZE_STYLE == 0
|
||||
|
||||
#if 0
|
||||
void
|
||||
meta_compositor_minimize (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
MetaAnimationFinishedFunc finished,
|
||||
gpointer data)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#elif MINIMIZE_STYLE == 1
|
||||
|
||||
typedef struct
|
||||
{
|
||||
MetaWindow *window;
|
||||
GTimer *timer;
|
||||
|
||||
MetaCompositor *compositor;
|
||||
MetaCompScreen *scr_info;
|
||||
|
||||
MetaAnimationFinishedFunc finished_func;
|
||||
gpointer finished_data;
|
||||
|
||||
gdouble aspect_ratio;
|
||||
|
||||
WsRectangle current_geometry;
|
||||
WsRectangle target_geometry;
|
||||
gdouble current_alpha;
|
||||
gdouble target_alpha;
|
||||
|
||||
int button_x;
|
||||
int button_y;
|
||||
int button_width;
|
||||
int button_height;
|
||||
|
||||
/* FIXME: maybe would be simpler if all of this was an array */
|
||||
gboolean phase_1_started;
|
||||
gboolean phase_2_started;
|
||||
gboolean phase_3_started;
|
||||
gboolean phase_4_started;
|
||||
gboolean phase_5_started;
|
||||
} MiniInfo;
|
||||
|
||||
static void
|
||||
set_geometry (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
WsRectangle rect;
|
||||
|
||||
interpolate_rectangle (elapsed, &info->current_geometry, &info->target_geometry, &rect);
|
||||
|
||||
g_print ("y: %d %d (%f => %d)\n", info->current_geometry.y, info->target_geometry.y,
|
||||
elapsed, rect.y);
|
||||
|
||||
g_print ("setting: %d %d %d %d\n", rect.x, rect.y, rect.width, rect.height);
|
||||
|
||||
meta_comp_screen_set_target_rect (info->scr_info,
|
||||
get_xid (info->window), &rect);
|
||||
}
|
||||
|
||||
static int
|
||||
center (gdouble what, gdouble in)
|
||||
{
|
||||
return (in - what) / 2.0 + 0.5;
|
||||
}
|
||||
|
||||
static void
|
||||
run_phase_1 (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
if (!info->phase_1_started)
|
||||
{
|
||||
#if 0
|
||||
g_print ("starting phase 1\n");
|
||||
#endif
|
||||
info->phase_1_started = TRUE;
|
||||
|
||||
meta_comp_screen_get_real_size (info->scr_info, get_xid (info->window),
|
||||
&info->current_geometry);
|
||||
|
||||
#if 0
|
||||
info->current_geometry.x = info->node->real_x;
|
||||
info->current_geometry.y = info->node->real_y;
|
||||
info->current_geometry.width = info->node->real_width;
|
||||
info->current_geometry.height = info->node->real_height;
|
||||
#endif
|
||||
|
||||
info->target_geometry.height = info->button_height;
|
||||
info->target_geometry.width = info->button_height * info->aspect_ratio;
|
||||
info->target_geometry.x = info->button_x + center (info->target_geometry.width, info->button_width);
|
||||
info->target_geometry.y = info->current_geometry.y + center (info->button_height, info->current_geometry.height);
|
||||
}
|
||||
|
||||
set_geometry (info, elapsed);
|
||||
}
|
||||
|
||||
static void
|
||||
run_phase_2 (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
#define WOBBLE_FACTOR 3
|
||||
|
||||
if (!info->phase_2_started)
|
||||
{
|
||||
WsRectangle cur = info->target_geometry;
|
||||
|
||||
g_print ("starting phase 2\n");
|
||||
|
||||
info->phase_2_started = TRUE;
|
||||
|
||||
info->current_geometry = cur;
|
||||
|
||||
info->target_geometry.x = cur.x + center (WOBBLE_FACTOR * cur.width, cur.width);
|
||||
info->target_geometry.y = cur.y + center (WOBBLE_FACTOR * cur.height, cur.height);
|
||||
info->target_geometry.width = cur.width * WOBBLE_FACTOR;
|
||||
info->target_geometry.height = cur.height * WOBBLE_FACTOR;
|
||||
}
|
||||
|
||||
set_geometry (info, elapsed);
|
||||
}
|
||||
|
||||
static void
|
||||
run_phase_3 (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
if (!info->phase_3_started)
|
||||
{
|
||||
WsRectangle cur = info->target_geometry;
|
||||
WsRectangle real;
|
||||
|
||||
meta_comp_screen_get_real_size (info->scr_info, get_xid (info->window),
|
||||
&real);
|
||||
|
||||
g_print ("starting phase 3\n");
|
||||
info->phase_3_started = TRUE;
|
||||
|
||||
info->current_geometry = cur;
|
||||
|
||||
info->target_geometry.height = info->button_height;
|
||||
info->target_geometry.width = info->button_height * info->aspect_ratio;
|
||||
info->target_geometry.x = info->button_x + center (info->target_geometry.width, info->button_width);
|
||||
info->target_geometry.y = real.y + center (info->button_height, real.height);
|
||||
}
|
||||
|
||||
set_geometry (info, elapsed);
|
||||
}
|
||||
|
||||
static void
|
||||
run_phase_4 (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
if (!info->phase_4_started)
|
||||
{
|
||||
WsRectangle cur = info->target_geometry;
|
||||
|
||||
g_print ("starting phase 4\n");
|
||||
info->phase_4_started = TRUE;
|
||||
|
||||
info->current_geometry = cur;
|
||||
|
||||
info->target_geometry.height = info->button_height;
|
||||
info->target_geometry.width = info->button_height * info->aspect_ratio;
|
||||
info->target_geometry.x = cur.x;
|
||||
g_print ("button y: %d\n", info->button_y);
|
||||
info->target_geometry.y = info->button_y;
|
||||
}
|
||||
|
||||
set_geometry (info, elapsed);
|
||||
}
|
||||
|
||||
static void
|
||||
run_phase_5 (MiniInfo *info, gdouble elapsed)
|
||||
{
|
||||
if (!info->phase_5_started)
|
||||
{
|
||||
WsRectangle cur = info->target_geometry;
|
||||
|
||||
g_print ("starting phase 5\n");
|
||||
info->phase_5_started = TRUE;
|
||||
|
||||
info->current_geometry = cur;
|
||||
info->target_geometry.x = info->button_x;
|
||||
info->target_geometry.y = info->button_y;
|
||||
info->target_geometry.width = info->button_width;
|
||||
info->target_geometry.height = info->button_height;
|
||||
}
|
||||
|
||||
set_geometry (info, elapsed);
|
||||
|
||||
meta_comp_screen_set_alpha (info->scr_info,
|
||||
get_xid (info->window), 1 - elapsed);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
run_animation_01 (gpointer data)
|
||||
{
|
||||
MiniInfo *info = data;
|
||||
gdouble elapsed;
|
||||
|
||||
elapsed = g_timer_elapsed (info->timer, NULL);
|
||||
|
||||
#define PHASE_0 0.0
|
||||
#define PHASE_1 0.225 /* scale to size of button */
|
||||
#define PHASE_2 0.325 /* scale up a little */
|
||||
#define PHASE_3 0.425 /* scale back a little */
|
||||
#define PHASE_4 0.650 /* move to button */
|
||||
#define PHASE_5 1.0 /* fade out */
|
||||
|
||||
if (elapsed < PHASE_1)
|
||||
{
|
||||
/* phase one */
|
||||
run_phase_1 (info, (elapsed - PHASE_0)/(PHASE_1 - PHASE_0));
|
||||
}
|
||||
else if (elapsed < PHASE_2)
|
||||
{
|
||||
/* phase two */
|
||||
run_phase_2 (info, (elapsed - PHASE_1)/(PHASE_2 - PHASE_1));
|
||||
}
|
||||
else if (elapsed < PHASE_3)
|
||||
{
|
||||
/* phase three */
|
||||
run_phase_3 (info, (elapsed - PHASE_2)/(PHASE_3 - PHASE_2));
|
||||
}
|
||||
else if (elapsed < PHASE_4)
|
||||
{
|
||||
/* phase four */
|
||||
run_phase_4 (info, (elapsed - PHASE_3)/(PHASE_4 - PHASE_3));
|
||||
}
|
||||
else if (elapsed < PHASE_5)
|
||||
{
|
||||
/* phase five */
|
||||
run_phase_5 (info, (elapsed - PHASE_4)/(PHASE_5 - PHASE_4));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (info->finished_func)
|
||||
info->finished_func (info->finished_data);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#if 0
|
||||
void
|
||||
meta_compositor_minimize (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
MetaAnimationFinishedFunc finished,
|
||||
gpointer data)
|
||||
{
|
||||
MiniInfo *info = g_new (MiniInfo, 1);
|
||||
WsRectangle start;
|
||||
MetaScreen *screen = window->screen;
|
||||
|
||||
info->window = window;
|
||||
info->timer = g_timer_new ();
|
||||
|
||||
info->finished_func = finished;
|
||||
info->finished_data = data;
|
||||
|
||||
info->phase_1_started = FALSE;
|
||||
info->phase_2_started = FALSE;
|
||||
info->phase_3_started = FALSE;
|
||||
info->phase_4_started = FALSE;
|
||||
info->phase_5_started = FALSE;
|
||||
|
||||
info->button_x = x;
|
||||
info->button_y = y;
|
||||
info->button_width = width;
|
||||
info->button_height = height;
|
||||
|
||||
info->compositor = compositor;
|
||||
info->scr_info = screen->compositor_data;
|
||||
|
||||
#if 0
|
||||
cm_drawable_node_set_deformation_func (node, minimize_deformation, info);
|
||||
#endif
|
||||
|
||||
info->aspect_ratio = 1.3;
|
||||
|
||||
g_idle_add (run_animation_01, info);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
meta_compositor_set_updates (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
|
@ -115,6 +115,16 @@ create_effect (MetaEffectType type,
|
||||
return effect;
|
||||
}
|
||||
|
||||
void
|
||||
meta_effect_end (MetaEffect *effect)
|
||||
{
|
||||
if (effect->priv->finished)
|
||||
effect->priv->finished (effect, effect->priv->finished_data);
|
||||
|
||||
g_free (effect->priv);
|
||||
g_free (effect);
|
||||
}
|
||||
|
||||
void
|
||||
meta_effect_run_minimize (MetaWindow *window,
|
||||
MetaRectangle *window_rect,
|
||||
@ -127,8 +137,7 @@ meta_effect_run_minimize (MetaWindow *window,
|
||||
g_return_if_fail (window != NULL);
|
||||
g_return_if_fail (icon_rect != NULL);
|
||||
|
||||
effect = create_effect (META_EFFECT_MINIMIZE,
|
||||
finished, data);
|
||||
effect = create_effect (META_EFFECT_MINIMIZE, finished, data);
|
||||
|
||||
effect->u.minimize.window = window;
|
||||
effect->u.minimize.window_rect = *window_rect;
|
||||
@ -137,6 +146,27 @@ meta_effect_run_minimize (MetaWindow *window,
|
||||
run_handler (effect);
|
||||
}
|
||||
|
||||
void
|
||||
meta_effect_run_restore (MetaWindow *window,
|
||||
MetaRectangle *window_rect,
|
||||
MetaRectangle *icon_rect,
|
||||
MetaEffectFinished finished,
|
||||
gpointer data)
|
||||
{
|
||||
MetaEffect *effect;
|
||||
|
||||
g_return_if_fail (window != NULL);
|
||||
g_return_if_fail (icon_rect != NULL);
|
||||
|
||||
effect = create_effect (META_EFFECT_RESTORE, finished, data);
|
||||
|
||||
effect->u.restore.window = window;
|
||||
effect->u.restore.window_rect = *window_rect;
|
||||
effect->u.restore.icon_rect = *icon_rect;
|
||||
|
||||
run_handler (effect);
|
||||
}
|
||||
|
||||
void
|
||||
meta_effect_run_close (MetaWindow *window,
|
||||
MetaEffectFinished finished,
|
||||
@ -154,15 +184,8 @@ meta_effect_run_close (MetaWindow *window,
|
||||
run_handler (effect);
|
||||
}
|
||||
|
||||
void
|
||||
meta_effect_end (MetaEffect *effect)
|
||||
{
|
||||
if (effect->priv->finished)
|
||||
effect->priv->finished (effect, effect->priv->finished_data);
|
||||
|
||||
g_free (effect->priv);
|
||||
g_free (effect);
|
||||
}
|
||||
|
||||
/* old ugly minimization effect */
|
||||
|
||||
static void
|
||||
update_wireframe_window (MetaDisplay *display,
|
||||
|
@ -48,9 +48,12 @@ typedef enum
|
||||
META_EFFECT_DIALOG_UNMAP,
|
||||
META_EFFECT_TOPLEVEL_MAP,
|
||||
META_EFFECT_TOPLEVEL_UNMAP,
|
||||
META_EFFECT_ALT_TAB,
|
||||
META_EFFECT_WIREFRAME_BEGIN,
|
||||
META_EFFECT_WIREFRAME_UPDATE,
|
||||
META_EFFECT_WIREFRAME_END,
|
||||
META_EFFECT_FOCUS,
|
||||
META_EFFECT_CLOSE,
|
||||
META_NUM_EFFECTS
|
||||
} MetaEffectType;
|
||||
|
||||
typedef void (* MetaEffectHandler) (MetaEffect *effect,
|
||||
@ -63,7 +66,7 @@ typedef struct
|
||||
MetaWindow *window;
|
||||
MetaRectangle window_rect;
|
||||
MetaRectangle icon_rect;
|
||||
} MetaMinimizeEffect;
|
||||
} MetaMinimizeEffect, MetaRestoreEffect; /* same data for both */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@ -77,8 +80,9 @@ struct MetaEffect
|
||||
|
||||
union
|
||||
{
|
||||
MetaMinimizeEffect minimize;
|
||||
MetaCloseEffect close;
|
||||
MetaMinimizeEffect minimize;
|
||||
MetaRestoreEffect restore;
|
||||
MetaCloseEffect close;
|
||||
} u;
|
||||
|
||||
MetaEffectPriv *priv;
|
||||
|
@ -1821,6 +1821,7 @@ windows_overlap (const MetaWindow *w1, const MetaWindow *w2)
|
||||
return meta_rectangle_overlap (&w1rect, &w2rect);
|
||||
}
|
||||
|
||||
/* XXX META_EFFECT_*_MAP */
|
||||
void
|
||||
meta_window_show (MetaWindow *window)
|
||||
{
|
||||
@ -2030,6 +2031,7 @@ meta_window_show (MetaWindow *window)
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX META_EFFECT_*_UNMAP */
|
||||
static void
|
||||
meta_window_hide (MetaWindow *window)
|
||||
{
|
||||
@ -3544,6 +3546,7 @@ meta_window_get_wireframe_geometry (MetaWindow *window,
|
||||
*height /= window->display->grab_window->size_hints.height_inc;
|
||||
}
|
||||
|
||||
/* XXX META_EFFECT_ALT_TAB, well, this and others */
|
||||
void
|
||||
meta_window_begin_wireframe (MetaWindow *window)
|
||||
{
|
||||
@ -3662,6 +3665,7 @@ get_modal_transient (MetaWindow *window)
|
||||
return modal_transient;
|
||||
}
|
||||
|
||||
/* XXX META_EFFECT_FOCUS */
|
||||
void
|
||||
meta_window_focus (MetaWindow *window,
|
||||
Time timestamp)
|
||||
|
Loading…
Reference in New Issue
Block a user