static gboolean
fade_and_request_redraw (GtkWidget     *canvas,
                         GdkFrameClock *frame_clock,
                         gpointer       user_data)
{
    NautilusSelectionCanvasItem *self = user_data;
    gint64 frame_time;
    gdouble percentage;

    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 G_SOURCE_REMOVE;
    }

    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 G_SOURCE_CONTINUE;
}
static gboolean
fade_and_request_redraw (gpointer user_data)
{
	NautilusSelectionCanvasItem *self = user_data;

	if (self->priv->fade_out_fill_alpha <= 0 ||
	    self->priv->fade_out_outline_alpha <= 0) {
		self->priv->fade_out_handler_id = 0;
		eel_canvas_item_destroy (EEL_CANVAS_ITEM (self));

		return FALSE;
	}

	self->priv->fade_out_fill_alpha -= self->priv->fade_out_fill_delta;
	self->priv->fade_out_outline_alpha -= self->priv->fade_out_outline_delta;

	eel_canvas_item_request_redraw (EEL_CANVAS_ITEM (self));

	return TRUE;
}
static void
nautilus_selection_canvas_item_set_property (GObject *object,
					     guint param_id,
					     const GValue *value,
					     GParamSpec *pspec)
{
	EelCanvasItem *item;
	NautilusSelectionCanvasItem *self;

	self = NAUTILUS_SELECTION_CANVAS_ITEM (object);
	item = EEL_CANVAS_ITEM (object);

	switch (param_id) {
	case PROP_X1:
		self->priv->x1 = g_value_get_double (value);

		eel_canvas_item_request_update (item);
		break;

	case PROP_Y1:
		self->priv->y1 = g_value_get_double (value);

		eel_canvas_item_request_update (item);
		break;

	case PROP_X2:
		self->priv->x2 = g_value_get_double (value);

		eel_canvas_item_request_update (item);
		break;

	case PROP_Y2:
		self->priv->y2 = g_value_get_double (value);

		eel_canvas_item_request_update (item);
		break;

	case PROP_FILL_COLOR_RGBA: {
		GdkRGBA *color;

		color = g_value_get_boxed (value);

		do_set_fill (self, color != NULL);

		if (color != NULL) {
			self->priv->fill_color = *color;
		}

		eel_canvas_item_request_redraw (item);		
		break;
	}

	case PROP_OUTLINE_COLOR_RGBA: {
		GdkRGBA *color;

		color = g_value_get_boxed (value);

		do_set_outline (self, color != NULL);

		if (color != NULL) {
			self->priv->outline_color = *color;
		}

		eel_canvas_item_request_redraw (item);		
		break;
	}

	case PROP_OUTLINE_STIPPLING:
		self->priv->outline_stippling = g_value_get_boolean (value);

		eel_canvas_item_request_redraw (item);
		break;

	case PROP_WIDTH_PIXELS:
		self->priv->width = g_value_get_uint (value);

		eel_canvas_item_request_update (item);
		break;

	default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
		break;
	}
}