summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2008-05-07 23:30:55 +0000
committerCarlos Garnacho <carlosg@src.gnome.org>2008-05-07 23:30:55 +0000
commitb25800ce6cbca976a9202741f13154cb12595cfe (patch)
tree5fb992639996310637a559806bc6bcc2126691ea /plugins
parentc8a4bad617a1635078752d7871af088cd97af5be (diff)
downloadgnome-settings-daemon-b25800ce6cbca976a9202741f13154cb12595cfe.tar.gz
new function, sets a fully transparent shape to the whole window.
2008-05-08 Carlos Garnacho <carlosg@gnome.org> * plugins/mouse/gsd-locate-pointer.c (set_transparent_shape): new function, sets a fully transparent shape to the whole window. (timeline_finished_cb) (gsd_locate_pointer): set the window transparent once the animation is finished, and before it's shown for the first time. The shape will be changed afterwards while running the animation. This fixes some artifacts shown when showing/moving the window, bug #531861. (locate_pointer_expose): Plug a leak. svn path=/trunk/; revision=335
Diffstat (limited to 'plugins')
-rw-r--r--plugins/mouse/gsd-locate-pointer.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/plugins/mouse/gsd-locate-pointer.c b/plugins/mouse/gsd-locate-pointer.c
index b9311897..65f3dc9e 100644
--- a/plugins/mouse/gsd-locate-pointer.c
+++ b/plugins/mouse/gsd-locate-pointer.c
@@ -139,6 +139,7 @@ locate_pointer_expose (GtkWidget *widget,
cr = gdk_cairo_create (mask);
locate_pointer_paint (data, cr, FALSE);
gdk_window_shape_combine_mask (data->window, mask, 0, 0);
+ g_object_unref (mask);
}
cairo_destroy (cr);
@@ -167,14 +168,34 @@ timeline_frame_cb (GsdTimeline *timeline,
}
static void
+set_transparent_shape (GdkWindow *window)
+{
+ GdkBitmap *mask;
+ cairo_t *cr;
+
+ mask = gdk_pixmap_new (data->window, WINDOW_SIZE, WINDOW_SIZE, 1);
+ cr = gdk_cairo_create (mask);
+
+ cairo_set_source_rgba (cr, 1., 1., 1., 0.);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+ cairo_paint (cr);
+
+ gdk_window_shape_combine_mask (data->window, mask, 0, 0);
+ g_object_unref (mask);
+ cairo_destroy (cr);
+}
+
+static void
timeline_finished_cb (GsdTimeline *timeline,
gpointer user_data)
{
GsdLocatePointerData *data = (GsdLocatePointerData *) user_data;
- /* hide window and unset shape */
+ /* set transparent shape and hide window */
+ if (!gtk_widget_is_composited (data->widget))
+ set_transparent_shape (data->window);
+
gdk_window_hide (data->window);
- gdk_window_shape_combine_mask (data->window, NULL, 0, 0);
}
static void
@@ -286,6 +307,10 @@ gsd_locate_pointer (GdkScreen *screen)
}
data->progress = 0.;
+
+ if (!gtk_widget_is_composited (data->widget))
+ set_transparent_shape (data->window);
+
gdk_window_show (data->window);
move_locate_pointer_window (data, screen);