diff options
Diffstat (limited to 'gtk/gtkdnd.c')
-rw-r--r-- | gtk/gtkdnd.c | 84 |
1 files changed, 34 insertions, 50 deletions
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index a055c308d2..dd512bc0cf 100644 --- a/gtk/gtkdnd.c +++ b/gtk/gtkdnd.c @@ -2545,9 +2545,11 @@ gtk_drag_set_icon_widget_internal (GdkDragContext *context, { GdkScreen *screen; GdkVisual *visual; + gboolean has_rgba; screen = gdk_window_get_screen (gdk_drag_context_get_source_window (context)); visual = gdk_screen_get_rgba_visual (screen); + has_rgba = visual != NULL && gdk_screen_is_composited (screen); info->icon_window = gtk_window_new (GTK_WINDOW_POPUP); gtk_window_set_type_hint (GTK_WINDOW (info->icon_window), GDK_WINDOW_TYPE_HINT_DND); @@ -2556,7 +2558,10 @@ gtk_drag_set_icon_widget_internal (GdkDragContext *context, if (visual) gtk_widget_set_visual (info->icon_window, visual); gtk_widget_set_events (info->icon_window, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); - gtk_widget_set_app_paintable (info->icon_window, TRUE); + + if (has_rgba) + gtk_widget_set_app_paintable (info->icon_window, TRUE); + gtk_window_set_hardcoded_window (GTK_WINDOW (info->icon_window), gdk_drag_context_get_drag_window (context)); gtk_widget_show (info->icon_window); @@ -2613,6 +2618,25 @@ gtk_drag_draw_icon_pattern (GtkWidget *window, } static void +gtk_drag_draw_icon_pattern_and_background (GtkWidget *window, + cairo_t *cr, + gpointer pattern) +{ + GtkStyleContext *context; + int width, height; + + context = gtk_widget_get_style_context (window); + width = gtk_widget_get_allocated_width (window); + height = gtk_widget_get_allocated_height (window); + + gtk_render_background (context, cr, 0, 0, width, height); + gtk_render_frame (context, cr, 0, 0, width, height); + + cairo_set_source (cr, pattern); + cairo_paint (cr); +} + +static void set_icon_helper (GdkDragContext *context, GtkImageDefinition *def, gint hot_x, @@ -2749,7 +2773,7 @@ _gtk_cairo_surface_extents (cairo_surface_t *surface, * cursor will be positioned at the (0,0) coordinate of the * surface. */ -void +void gtk_drag_set_icon_surface (GdkDragContext *context, cairo_surface_t *surface) { @@ -2759,20 +2783,18 @@ gtk_drag_set_icon_surface (GdkDragContext *context, cairo_pattern_t *pattern; GdkVisual *rgba_visual; gboolean has_rgba; - + cairo_matrix_t matrix; + g_return_if_fail (GDK_IS_DRAG_CONTEXT (context)); g_return_if_fail (surface != NULL); _gtk_cairo_surface_extents (surface, &extents); - screen = gdk_window_get_screen (gdk_drag_context_get_source_window (context)); rgba_visual = gdk_screen_get_rgba_visual (screen); window = gtk_window_new (GTK_WINDOW_POPUP); - has_rgba = - rgba_visual != NULL && - gdk_screen_is_composited (screen); + has_rgba = rgba_visual != NULL && gdk_screen_is_composited (screen); gtk_window_set_screen (GTK_WINDOW (window), screen); @@ -2788,52 +2810,14 @@ gtk_drag_set_icon_surface (GdkDragContext *context, gtk_widget_set_size_request (window, extents.width, extents.height); gtk_widget_realize (window); - if (cairo_surface_get_content (surface) != CAIRO_CONTENT_COLOR && - !has_rgba) - { - cairo_surface_t *saturated; - cairo_region_t *region; - cairo_t *cr; - - region = gdk_cairo_region_create_from_surface (surface); - cairo_region_translate (region, -extents.x, -extents.y); - - gtk_widget_shape_combine_region (window, region); - cairo_region_destroy (region); - - /* Need to saturate the colors, so it doesn't look like semi-transparent - * pixels were painted on black. */ - saturated = gdk_window_create_similar_surface (gtk_widget_get_window (window), - CAIRO_CONTENT_COLOR, - extents.width, - extents.height); - - cr = cairo_create (saturated); - cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR_ALPHA); - cairo_set_source_surface (cr, surface, -extents.x, -extents.y); - cairo_paint (cr); - cairo_set_operator (cr, CAIRO_OPERATOR_SATURATE); - cairo_paint (cr); - cairo_pop_group_to_source (cr); - cairo_paint (cr); - cairo_destroy (cr); - - pattern = cairo_pattern_create_for_surface (saturated); - - cairo_surface_destroy (saturated); - } - else - { - cairo_matrix_t matrix; - - pattern = cairo_pattern_create_for_surface (surface); - cairo_matrix_init_translate (&matrix, extents.x, extents.y); - cairo_pattern_set_matrix (pattern, &matrix); - } + pattern = cairo_pattern_create_for_surface (surface); + cairo_matrix_init_translate (&matrix, extents.x, extents.y); + cairo_pattern_set_matrix (pattern, &matrix); g_signal_connect_data (window, "draw", - G_CALLBACK (gtk_drag_draw_icon_pattern), + has_rgba ? G_CALLBACK (gtk_drag_draw_icon_pattern) + : G_CALLBACK (gtk_drag_draw_icon_pattern_and_background), pattern, (GClosureNotify) cairo_pattern_destroy, G_CONNECT_AFTER); |