summaryrefslogtreecommitdiff
path: root/gtk/gtklinkbutton.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-12-30 22:34:50 -0500
committerMatthias Clasen <mclasen@redhat.com>2020-01-08 18:48:19 -0500
commitd145032cb6c0ec3ec78061e7cfb878e2d6dec3fb (patch)
treea1a7196b42fb301182d16c21f499f1f18aada229 /gtk/gtklinkbutton.c
parent2612331282c954e77e291d8f2aa3526e02a6021b (diff)
downloadgtk+-d145032cb6c0ec3ec78061e7cfb878e2d6dec3fb.tar.gz
linkbutton: Port to GtkDragSource
Diffstat (limited to 'gtk/gtklinkbutton.c')
-rw-r--r--gtk/gtklinkbutton.c113
1 files changed, 77 insertions, 36 deletions
diff --git a/gtk/gtklinkbutton.c b/gtk/gtklinkbutton.c
index c8cc0aad2d..3ae32f21ce 100644
--- a/gtk/gtklinkbutton.c
+++ b/gtk/gtklinkbutton.c
@@ -124,10 +124,6 @@ static void gtk_link_button_set_property (GObject *object,
GParamSpec *pspec);
static void gtk_link_button_clicked (GtkButton *button);
static gboolean gtk_link_button_popup_menu (GtkWidget *widget);
-static void gtk_link_button_drag_data_get_cb (GtkWidget *widget,
- GdkDrag *drag,
- GtkSelectionData *selection,
- gpointer user_data);
static gboolean gtk_link_button_query_tooltip_cb (GtkWidget *widget,
gint x,
gint y,
@@ -251,31 +247,96 @@ gtk_link_button_get_menu_model (void)
return G_MENU_MODEL (menu);
}
+#define GTK_TYPE_LINK_CONTENT (gtk_link_content_get_type ())
+#define GTK_LINK_CONTENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_LINK_CONTENT, GtkLinkContent))
+
+typedef struct _GtkLinkContent GtkLinkContent;
+typedef struct _GtkLinkContentClass GtkLinkContentClass;
+
+struct _GtkLinkContent
+{
+ GdkContentProvider parent;
+ GtkLinkButton *link;
+};
+
+struct _GtkLinkContentClass
+{
+ GdkContentProviderClass parent_class;
+};
+
+GType gtk_link_content_get_type (void) G_GNUC_CONST;
+
+G_DEFINE_TYPE (GtkLinkContent, gtk_link_content, GDK_TYPE_CONTENT_PROVIDER)
+
+static GdkContentFormats *
+gtk_link_content_ref_formats (GdkContentProvider *provider)
+{
+ GtkLinkContent *content = GTK_LINK_CONTENT (provider);
+
+ if (content->link)
+ return gdk_content_formats_union (gdk_content_formats_new_for_gtype (G_TYPE_STRING),
+ gdk_content_formats_new (link_drop_types, G_N_ELEMENTS (link_drop_types)));
+ else
+ return gdk_content_formats_new (NULL, 0);
+}
+
+static gboolean
+gtk_link_content_get_value (GdkContentProvider *provider,
+ GValue *value,
+ GError **error)
+{
+ GtkLinkContent *content = GTK_LINK_CONTENT (provider);
+
+ if (G_VALUE_HOLDS (value, G_TYPE_STRING) &&
+ content->link != NULL)
+ {
+ GtkLinkButtonPrivate *priv = gtk_link_button_get_instance_private (content->link);
+ char *uri;
+
+ uri = g_strdup_printf ("%s\r\n", priv->uri);
+ g_value_set_string (value, uri);
+ g_free (uri);
+
+ return TRUE;
+ }
+
+ return GDK_CONTENT_PROVIDER_CLASS (gtk_link_content_parent_class)->get_value (provider, value, error);
+}
+
+static void
+gtk_link_content_class_init (GtkLinkContentClass *class)
+{
+ GdkContentProviderClass *provider_class = GDK_CONTENT_PROVIDER_CLASS (class);
+
+ provider_class->ref_formats = gtk_link_content_ref_formats;
+ provider_class->get_value = gtk_link_content_get_value;
+}
+
+static void
+gtk_link_content_init (GtkLinkContent *content)
+{
+}
+
static void
gtk_link_button_init (GtkLinkButton *link_button)
{
GtkStyleContext *context;
- GdkContentFormats *targets;
GtkGesture *gesture;
+ GdkContentProvider *content;
+ GtkDragSource *source;
gtk_button_set_relief (GTK_BUTTON (link_button), GTK_RELIEF_NONE);
gtk_widget_set_state_flags (GTK_WIDGET (link_button), GTK_STATE_FLAG_LINK, FALSE);
gtk_widget_set_has_tooltip (GTK_WIDGET (link_button), TRUE);
- g_signal_connect (link_button, "drag-data-get",
- G_CALLBACK (gtk_link_button_drag_data_get_cb), NULL);
-
g_signal_connect (link_button, "query-tooltip",
G_CALLBACK (gtk_link_button_query_tooltip_cb), NULL);
- /* enable drag source */
- targets = gdk_content_formats_new (link_drop_types, G_N_ELEMENTS (link_drop_types));
- gtk_drag_source_set (GTK_WIDGET (link_button),
- GDK_BUTTON1_MASK,
- targets,
- GDK_ACTION_COPY);
- gdk_content_formats_unref (targets);
- gtk_drag_source_set_icon_name (GTK_WIDGET (link_button), "text-x-generic");
+ content = g_object_new (GTK_TYPE_LINK_CONTENT, NULL);
+ GTK_LINK_CONTENT (content)->link = link_button;
+ source = gtk_drag_source_new (content, GDK_ACTION_COPY);
+ g_object_unref (content);
+ gtk_drag_source_attach (source, GTK_WIDGET (link_button), GDK_BUTTON1_MASK);
gesture = gtk_gesture_click_new ();
gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (gesture), FALSE);
@@ -449,26 +510,6 @@ gtk_link_button_popup_menu (GtkWidget *widget)
return TRUE;
}
-static void
-gtk_link_button_drag_data_get_cb (GtkWidget *widget,
- GdkDrag *drag,
- GtkSelectionData *selection,
- gpointer user_data)
-{
- GtkLinkButton *link_button = GTK_LINK_BUTTON (widget);
- GtkLinkButtonPrivate *priv = gtk_link_button_get_instance_private (link_button);
- gchar *uri;
-
- uri = g_strdup_printf ("%s\r\n", priv->uri);
- gtk_selection_data_set (selection,
- gtk_selection_data_get_target (selection),
- 8,
- (guchar *) uri,
- strlen (uri));
-
- g_free (uri);
-}
-
/**
* gtk_link_button_new:
* @uri: a valid URI