summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2014-09-16 21:56:05 -0700
committerCosimo Cecchi <cosimoc@gnome.org>2014-10-17 12:40:04 -0700
commit1f18e1f8cebe8d491b76f039d21717010688b7c3 (patch)
tree77b0a2149f678cba07a4e39c025e5fae31903529
parent17061d58d126077a26dd44595c321ee134f5747c (diff)
downloadnautilus-1f18e1f8cebe8d491b76f039d21717010688b7c3.tar.gz
selection-canvas-item: use GdkFrameClock for rubberband animation
Make it a bit smoother.
-rw-r--r--libnautilus-private/nautilus-selection-canvas-item.c57
1 files changed, 33 insertions, 24 deletions
diff --git a/libnautilus-private/nautilus-selection-canvas-item.c b/libnautilus-private/nautilus-selection-canvas-item.c
index 52c12a6c9..b1ebea6b0 100644
--- a/libnautilus-private/nautilus-selection-canvas-item.c
+++ b/libnautilus-private/nautilus-selection-canvas-item.c
@@ -68,10 +68,10 @@ struct _NautilusSelectionCanvasItemDetails {
double fade_out_fill_alpha;
double fade_out_outline_alpha;
- double fade_out_fill_delta;
- double fade_out_outline_delta;
+ gint64 fade_out_start_time;
+ gint64 fade_out_end_time;
- guint fade_out_handler_id;
+ guint fade_out_tick_id;
};
G_DEFINE_TYPE (NautilusSelectionCanvasItem, nautilus_selection_canvas_item, EEL_TYPE_CANVAS_ITEM);
@@ -114,7 +114,7 @@ nautilus_selection_canvas_item_draw (EelCanvasItem *item,
actual_fill = self->priv->fill_color;
- if (self->priv->fade_out_handler_id != 0) {
+ if (self->priv->fade_out_tick_id != 0) {
actual_fill.alpha = self->priv->fade_out_fill_alpha;
}
@@ -131,7 +131,7 @@ nautilus_selection_canvas_item_draw (EelCanvasItem *item,
actual_outline = self->priv->outline_color;
- if (self->priv->fade_out_handler_id != 0) {
+ if (self->priv->fade_out_tick_id != 0) {
actual_outline.alpha = self->priv->fade_out_outline_alpha;
}
@@ -434,43 +434,52 @@ nautilus_selection_canvas_item_bounds (EelCanvasItem *item,
*y2 = self->priv->y2 + hwidth;
}
-#define FADE_OUT_STEPS 5
-#define FADE_OUT_SPEED 30
-
static gboolean
-fade_and_request_redraw (gpointer user_data)
+fade_and_request_redraw (GtkWidget *canvas,
+ GdkFrameClock *frame_clock,
+ gpointer user_data)
{
NautilusSelectionCanvasItem *self = user_data;
+ gint64 frame_time;
+ gdouble percentage;
- if (self->priv->fade_out_fill_alpha <= 0 ||
- self->priv->fade_out_outline_alpha <= 0) {
- self->priv->fade_out_handler_id = 0;
+ frame_time = gdk_frame_clock_get_frame_time (frame_clock);
+ if (frame_time >= self->priv->fade_out_end_time) {
+ self->priv->fade_out_tick_id = 0;
eel_canvas_item_destroy (EEL_CANVAS_ITEM (self));
- return FALSE;
+ return G_SOURCE_REMOVE;
}
- self->priv->fade_out_fill_alpha -= self->priv->fade_out_fill_delta;
- self->priv->fade_out_outline_alpha -= self->priv->fade_out_outline_delta;
+ percentage = 1.0 - (gdouble) (frame_time - self->priv->fade_out_start_time) /
+ (gdouble) (self->priv->fade_out_end_time - self->priv->fade_out_start_time);
+
+ self->priv->fade_out_fill_alpha = self->priv->fill_color.alpha * percentage;
+ self->priv->fade_out_outline_alpha = self->priv->outline_color.alpha * percentage;
eel_canvas_item_request_redraw (EEL_CANVAS_ITEM (self));
- return TRUE;
+ return G_SOURCE_CONTINUE;
}
void
nautilus_selection_canvas_item_fade_out (NautilusSelectionCanvasItem *self,
guint transition_time)
{
+ EelCanvasItem *item = EEL_CANVAS_ITEM (self);
+ GtkWidget *widget;
+ GdkFrameClock *clock;
+
self->priv->fade_out_fill_alpha = self->priv->fill_color.alpha;
self->priv->fade_out_outline_alpha = self->priv->outline_color.alpha;
- self->priv->fade_out_fill_delta = self->priv->fade_out_fill_alpha / FADE_OUT_STEPS;
- self->priv->fade_out_outline_delta = self->priv->fade_out_outline_alpha / FADE_OUT_STEPS;
+ widget = GTK_WIDGET (item->canvas);
+ clock = gtk_widget_get_frame_clock (widget);
+ self->priv->fade_out_start_time = gdk_frame_clock_get_frame_time (clock);
+ self->priv->fade_out_end_time = self->priv->fade_out_start_time + 1000 * transition_time;
- self->priv->fade_out_handler_id =
- g_timeout_add ((guint) (transition_time / FADE_OUT_STEPS),
- fade_and_request_redraw, self);
+ self->priv->fade_out_tick_id =
+ gtk_widget_add_tick_callback (GTK_WIDGET (item->canvas), fade_and_request_redraw, self, NULL);
}
static void
@@ -478,9 +487,9 @@ nautilus_selection_canvas_item_dispose (GObject *obj)
{
NautilusSelectionCanvasItem *self = NAUTILUS_SELECTION_CANVAS_ITEM (obj);
- if (self->priv->fade_out_handler_id != 0) {
- g_source_remove (self->priv->fade_out_handler_id);
- self->priv->fade_out_handler_id = 0;
+ if (self->priv->fade_out_tick_id != 0) {
+ gtk_widget_remove_tick_callback (GTK_WIDGET (EEL_CANVAS_ITEM (self)->canvas), self->priv->fade_out_tick_id);
+ self->priv->fade_out_tick_id = 0;
}
G_OBJECT_CLASS (nautilus_selection_canvas_item_parent_class)->dispose (obj);