summaryrefslogtreecommitdiff
path: root/gtk/gtkdnd.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-12-01 22:52:28 -0500
committerMatthias Clasen <mclasen@redhat.com>2015-12-01 23:47:56 -0500
commitae4f6da550b39a8374de2880ae8ce729e4a5cfec (patch)
tree6bdf505956b645d9538e79e0e6c72e4008a8b6a0 /gtk/gtkdnd.c
parent5bb12474d975ee4b790c56e907e4e627120955a0 (diff)
downloadgtk+-ae4f6da550b39a8374de2880ae8ce729e4a5cfec.tar.gz
DND: Drop support for using rgba cursors as icons
This adds a lot of complication to the code, and is not really a big win, since still need to support icon windows anyway.
Diffstat (limited to 'gtk/gtkdnd.c')
-rw-r--r--gtk/gtkdnd.c253
1 files changed, 40 insertions, 213 deletions
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c
index 8e673d4f43..a525fd9770 100644
--- a/gtk/gtkdnd.c
+++ b/gtk/gtkdnd.c
@@ -112,15 +112,14 @@ struct _GtkDragSourceInfo
guint32 grab_time; /* timestamp for initial grab */
GList *selections; /* selections we've claimed */
-
+
GtkDragDestInfo *proxy_dest; /* Set if this is a proxy drag */
+ GtkIconHelper *icon_helper;
guint update_idle; /* Idle function to update the drag */
guint drop_timeout; /* Timeout for aborting drop */
guint destroy_icon : 1; /* If true, destroy icon_widget */
- guint have_grab : 1; /* Do we still have the pointer grab */
- GtkIconHelper *icon_helper;
- GdkCursor *drag_cursors[6];
+ guint have_grab : 1; /* Do we still have the pointer grab */
};
struct _GtkDragDestSite
@@ -763,36 +762,6 @@ gtk_drag_get_event_actions (const GdkEvent *event,
}
}
-static gboolean
-gtk_drag_can_use_rgba_cursor (GdkDisplay *display,
- gint width,
- gint height)
-{
- guint max_width, max_height;
-
-#ifdef GDK_WINDOWING_WAYLAND
- if (GDK_IS_WAYLAND_DISPLAY (display))
- return FALSE;
-#endif
-
- if (!gdk_display_supports_cursor_color (display))
- return FALSE;
-
- if (!gdk_display_supports_cursor_alpha (display))
- return FALSE;
-
- gdk_display_get_maximal_cursor_size (display,
- &max_width,
- &max_height);
- if (width > max_width || height > max_height)
- {
- /* can't use rgba cursor (too large) */
- return FALSE;
- }
-
- return TRUE;
-}
-
static void
ensure_drag_cursor_pixbuf (int i)
{
@@ -809,24 +778,6 @@ ensure_drag_cursor_pixbuf (int i)
}
}
-static void
-get_surface_size (cairo_surface_t *surface,
- gint *width,
- gint *height)
-{
- gdouble x_scale, y_scale;
-
- x_scale = y_scale = 1;
-
- cairo_surface_get_device_scale (surface, &x_scale, &y_scale);
-
- /* Assume any set scaling is icon scale */
- *width =
- ceil (cairo_image_surface_get_width (surface) / x_scale);
- *height =
- ceil (cairo_image_surface_get_height (surface) / y_scale);
-}
-
static GdkCursor *
gtk_drag_get_cursor (GtkWidget *widget,
GdkDisplay *display,
@@ -863,88 +814,6 @@ gtk_drag_get_cursor (GtkWidget *widget,
drag_cursors[i].cursor = gdk_cursor_new_from_pixbuf (display, drag_cursors[i].pixbuf, 0, 0);
}
- if (info && info->icon_helper)
- {
- gint cursor_width, cursor_height;
- gint icon_width, icon_height;
- gint width, height;
- cairo_surface_t *icon_surface, *cursor_surface;
- gdouble hot_x, hot_y;
- gint icon_x, icon_y, ref_x, ref_y;
- gint scale;
-
- if (info->drag_cursors[i] != NULL)
- {
- if (display == gdk_cursor_get_display (info->drag_cursors[i]))
- return info->drag_cursors[i];
-
- g_clear_object (&info->drag_cursors[i]);
- }
-
- scale = gtk_widget_get_scale_factor (widget);
- _gtk_icon_helper_get_size (info->icon_helper,
- gtk_widget_get_style_context (widget),
- &icon_width, &icon_height);
- icon_surface = gtk_icon_helper_load_surface (info->icon_helper,
- gtk_widget_get_style_context (widget),
- scale);
-
- icon_x = info->hot_x;
- icon_y = info->hot_y;
-
- hot_x = hot_y = 0;
- cursor_surface = gdk_cursor_get_surface (drag_cursors[i].cursor,
- &hot_x, &hot_y);
- if (!cursor_surface)
- {
- ensure_drag_cursor_pixbuf (i);
- cursor_surface = gdk_cairo_surface_create_from_pixbuf (drag_cursors[i].pixbuf, 1, NULL);
- }
-
- get_surface_size (cursor_surface, &cursor_width, &cursor_height);
-
- ref_x = MAX (hot_x, icon_x);
- ref_y = MAX (hot_y, icon_y);
- width = ref_x + MAX (cursor_width - hot_x, icon_width - icon_x);
- height = ref_y + MAX (cursor_height - hot_y, icon_height - icon_y);
-
- if (gtk_drag_can_use_rgba_cursor (display, width * scale, height * scale))
- {
- cairo_surface_t *surface;
- cairo_t *cr;
-
- /* Composite cursor and icon so that both hotspots
- * end up at (ref_x, ref_y)
- */
- surface =
- gdk_window_create_similar_image_surface (NULL,
- CAIRO_FORMAT_ARGB32,
- width * scale, height * scale, scale);
-
- cr = cairo_create (surface);
- cairo_set_source_surface (cr, icon_surface,
- ref_x - icon_x, ref_y - icon_y);
- cairo_paint (cr);
-
- cairo_set_source_surface (cr, cursor_surface,
- ref_x - hot_x, ref_y - hot_y);
- cairo_paint (cr);
-
- cairo_destroy (cr);
-
- info->drag_cursors[i] =
- gdk_cursor_new_from_surface (display, surface, ref_x, ref_y);
-
- cairo_surface_destroy (surface);
- }
-
- cairo_surface_destroy (cursor_surface);
- cairo_surface_destroy (icon_surface);
-
- if (info->drag_cursors[i] != NULL)
- return info->drag_cursors[i];
- }
-
return drag_cursors[i].cursor;
}
@@ -958,17 +827,16 @@ gtk_drag_update_cursor (GtkDragSourceInfo *info)
return;
for (i = 0 ; i < G_N_ELEMENTS (drag_cursors) - 1; i++)
- if (info->cursor == drag_cursors[i].cursor ||
- info->cursor == info->drag_cursors[i])
+ if (info->cursor == drag_cursors[i].cursor)
break;
-
+
if (i == G_N_ELEMENTS (drag_cursors))
return;
cursor = gtk_drag_get_cursor (info->widget,
- gdk_cursor_get_display (info->cursor),
+ gdk_cursor_get_display (info->cursor),
drag_cursors[i].action, info);
-
+
if (cursor != info->cursor)
{
GdkDevice *pointer;
@@ -2761,8 +2629,12 @@ set_icon_helper (GdkDragContext *context,
GtkWidget *window;
gint width, height;
GdkScreen *screen;
- GdkDisplay *display;
GdkVisual *visual;
+ cairo_surface_t *source;
+ cairo_surface_t *surface;
+ cairo_pattern_t *pattern;
+ cairo_t *cr;
+ GdkWindow *root;
g_return_if_fail (context != NULL);
g_return_if_fail (def != NULL);
@@ -2787,77 +2659,43 @@ set_icon_helper (GdkDragContext *context,
_gtk_icon_helper_set_definition (info->icon_helper, def);
_gtk_icon_helper_set_icon_size (info->icon_helper, GTK_ICON_SIZE_DND);
- display = gdk_window_get_display (gdk_drag_context_get_source_window (context));
- _gtk_icon_helper_get_size (info->icon_helper,
+ _gtk_icon_helper_get_size (info->icon_helper,
gtk_widget_get_style_context (window),
&width, &height);
- if (!force_window &&
- gtk_drag_can_use_rgba_cursor (display, width + 2, height + 2))
- {
- gtk_widget_destroy (window);
+ gtk_widget_set_size_request (window, width, height);
- gtk_drag_set_icon_window (context, NULL, hot_x, hot_y, TRUE);
- }
- else
- {
- cairo_surface_t *source, *surface;
- cairo_pattern_t *pattern;
- GdkWindow *root;
- cairo_t *cr;
-
- gtk_widget_set_size_request (window, width, height);
-
- root = gdk_screen_get_root_window (screen);
- source = gtk_icon_helper_load_surface (info->icon_helper,
- gtk_widget_get_style_context (window),
- gdk_window_get_scale_factor (root));
- surface = gdk_window_create_similar_surface (gdk_screen_get_root_window (screen),
- CAIRO_CONTENT_COLOR,
- width, height);
-
- cr = cairo_create (surface);
- cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR_ALPHA);
- cairo_set_source_surface (cr, source, 0, 0);
- 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);
+ root = gdk_screen_get_root_window (screen);
+ source = gtk_icon_helper_load_surface (info->icon_helper,
+ gtk_widget_get_style_context (window),
+ gdk_window_get_scale_factor (root));
+ surface = gdk_window_create_similar_surface (root,
+ CAIRO_CONTENT_COLOR,
+ width, height);
- pattern = cairo_pattern_create_for_surface (surface);
-
- cairo_surface_destroy (surface);
-
- if (cairo_surface_get_content (source) & CAIRO_CONTENT_ALPHA)
- {
- cairo_region_t *region;
-
- surface = cairo_image_surface_create (CAIRO_FORMAT_A1, width, height);
- cr = cairo_create (surface);
- cairo_set_source_surface (cr, source, 0, 0);
- cairo_paint (cr);
- cairo_destroy (cr);
-
- region = gdk_cairo_region_create_from_surface (surface);
- gtk_widget_shape_combine_region (window, region);
- cairo_region_destroy (region);
+ cr = cairo_create (surface);
+ cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR_ALPHA);
+ cairo_set_source_surface (cr, source, 0, 0);
+ 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);
- cairo_surface_destroy (surface);
- }
+ pattern = cairo_pattern_create_for_surface (surface);
- cairo_surface_destroy (source);
+ cairo_surface_destroy (surface);
+ cairo_surface_destroy (source);
- g_signal_connect_data (window,
- "draw",
- G_CALLBACK (gtk_drag_draw_icon_pattern),
- pattern,
- (GClosureNotify) cairo_pattern_destroy,
- G_CONNECT_AFTER);
+ g_signal_connect_data (window,
+ "draw",
+ G_CALLBACK (gtk_drag_draw_icon_pattern),
+ pattern,
+ (GClosureNotify) cairo_pattern_destroy,
+ G_CONNECT_AFTER);
- gtk_drag_set_icon_window (context, window, hot_x, hot_y, TRUE);
- }
+ gtk_drag_set_icon_window (context, window, hot_x, hot_y, TRUE);
}
void
@@ -3532,17 +3370,6 @@ gtk_drag_remove_icon (GtkDragSourceInfo *info)
static void
gtk_drag_source_info_destroy (GtkDragSourceInfo *info)
{
- gint i;
-
- for (i = 0; i < G_N_ELEMENTS (drag_cursors); i++)
- {
- if (info->drag_cursors[i] != NULL)
- {
- g_object_unref (info->drag_cursors[i]);
- info->drag_cursors[i] = NULL;
- }
- }
-
gtk_drag_remove_icon (info);
g_clear_object (&info->icon_helper);