GtkLabel: Create gestures only when needed

And move them into the GtkLabelSelectionInfo struct.
This commit is contained in:
Timm Bäder 2015-11-20 16:06:10 +01:00
parent 770feff302
commit 1db5ed0aae

View File

@ -255,9 +255,6 @@ struct _GtkLabelPrivate
PangoAttrList *markup_attrs; PangoAttrList *markup_attrs;
PangoLayout *layout; PangoLayout *layout;
GtkGesture *drag_gesture;
GtkGesture *multipress_gesture;
gchar *label; gchar *label;
gchar *text; gchar *text;
@ -336,6 +333,9 @@ struct _GtkLabelSelectionInfo
GList *links; GList *links;
GtkLabelLink *active_link; GtkLabelLink *active_link;
GtkGesture *drag_gesture;
GtkGesture *multipress_gesture;
gint drag_start_x; gint drag_start_x;
gint drag_start_y; gint drag_start_y;
@ -1373,21 +1373,6 @@ gtk_label_init (GtkLabel *label)
priv->mnemonics_visible = TRUE; priv->mnemonics_visible = TRUE;
gtk_label_set_text (label, ""); gtk_label_set_text (label, "");
priv->drag_gesture = gtk_gesture_drag_new (GTK_WIDGET (label));
g_signal_connect (priv->drag_gesture, "drag-begin",
G_CALLBACK (gtk_label_drag_gesture_begin), label);
g_signal_connect (priv->drag_gesture, "drag-update",
G_CALLBACK (gtk_label_drag_gesture_update), label);
gtk_gesture_single_set_exclusive (GTK_GESTURE_SINGLE (priv->drag_gesture), TRUE);
priv->multipress_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (label));
g_signal_connect (priv->multipress_gesture, "pressed",
G_CALLBACK (gtk_label_multipress_gesture_pressed), label);
g_signal_connect (priv->multipress_gesture, "released",
G_CALLBACK (gtk_label_multipress_gesture_released), label);
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->multipress_gesture), 0);
gtk_gesture_single_set_exclusive (GTK_GESTURE_SINGLE (priv->multipress_gesture), TRUE);
} }
@ -3285,12 +3270,15 @@ gtk_label_finalize (GObject *object)
if (priv->markup_attrs) if (priv->markup_attrs)
pango_attr_list_unref (priv->markup_attrs); pango_attr_list_unref (priv->markup_attrs);
if (priv->select_info)
{
g_object_unref (priv->select_info->drag_gesture);
g_object_unref (priv->select_info->multipress_gesture);
}
gtk_label_clear_links (label); gtk_label_clear_links (label);
g_free (priv->select_info); g_free (priv->select_info);
g_object_unref (priv->drag_gesture);
g_object_unref (priv->multipress_gesture);
G_OBJECT_CLASS (gtk_label_parent_class)->finalize (object); G_OBJECT_CLASS (gtk_label_parent_class)->finalize (object);
} }
@ -5474,6 +5462,21 @@ gtk_label_ensure_select_info (GtkLabel *label)
if (gtk_widget_get_mapped (GTK_WIDGET (label))) if (gtk_widget_get_mapped (GTK_WIDGET (label)))
gdk_window_show (priv->select_info->window); gdk_window_show (priv->select_info->window);
priv->select_info->drag_gesture = gtk_gesture_drag_new (GTK_WIDGET (label));
g_signal_connect (priv->select_info->drag_gesture, "drag-begin",
G_CALLBACK (gtk_label_drag_gesture_begin), label);
g_signal_connect (priv->select_info->drag_gesture, "drag-update",
G_CALLBACK (gtk_label_drag_gesture_update), label);
gtk_gesture_single_set_exclusive (GTK_GESTURE_SINGLE (priv->select_info->drag_gesture), TRUE);
priv->select_info->multipress_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (label));
g_signal_connect (priv->select_info->multipress_gesture, "pressed",
G_CALLBACK (gtk_label_multipress_gesture_pressed), label);
g_signal_connect (priv->select_info->multipress_gesture, "released",
G_CALLBACK (gtk_label_multipress_gesture_released), label);
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->select_info->multipress_gesture), 0);
gtk_gesture_single_set_exclusive (GTK_GESTURE_SINGLE (priv->select_info->multipress_gesture), TRUE);
} }
} }
@ -5489,6 +5492,9 @@ gtk_label_clear_select_info (GtkLabel *label)
{ {
gtk_label_destroy_window (label); gtk_label_destroy_window (label);
g_object_unref (priv->select_info->drag_gesture);
g_object_unref (priv->select_info->multipress_gesture);
g_free (priv->select_info); g_free (priv->select_info);
priv->select_info = NULL; priv->select_info = NULL;