diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2008-05-07 23:30:55 +0000 |
---|---|---|
committer | Carlos Garnacho <carlosg@src.gnome.org> | 2008-05-07 23:30:55 +0000 |
commit | b25800ce6cbca976a9202741f13154cb12595cfe (patch) | |
tree | 5fb992639996310637a559806bc6bcc2126691ea /plugins | |
parent | c8a4bad617a1635078752d7871af088cd97af5be (diff) | |
download | gnome-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.c | 29 |
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); |