Index: gtk+-2.90.6/gtk/gtkfontsel.c =================================================================== --- gtk+-2.90.6.orig/gtk/gtkfontsel.c +++ gtk+-2.90.6/gtk/gtkfontsel.c @@ -130,6 +130,8 @@ struct _GtkFontSelectionDialogPrivate #define FONT_STYLE_LIST_WIDTH 170 #define FONT_SIZE_LIST_WIDTH 60 +#define DELAY_REAL_SELECTION_MS 75 + /* These are what we use as the standard font sizes, for the size list. */ static const guint16 font_sizes[] = { @@ -612,10 +614,23 @@ static void gtk_font_selection_finalize (GObject *object) { GtkFontSelection *fontsel = GTK_FONT_SELECTION (object); + guint selection_timeout; gtk_font_selection_ref_family (fontsel, NULL); gtk_font_selection_ref_face (fontsel, NULL); + selection_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fontsel), "font-selection-timeout")); + if (selection_timeout) + g_source_remove (selection_timeout); + + selection_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fontsel), "style-selection-timeout")); + if (selection_timeout) + g_source_remove (selection_timeout); + + selection_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fontsel), "size-selection-timeout")); + if (selection_timeout) + g_source_remove (selection_timeout); + G_OBJECT_CLASS (gtk_font_selection_parent_class)->finalize (object); } @@ -652,6 +667,9 @@ gtk_font_selection_reload_fonts (GtkFont PangoFontDescription *desc; desc = gtk_font_selection_get_font_description (fontsel); + /* Disable selection timeout */ + g_object_set_data (G_OBJECT (fontsel), "immediate-selection", GUINT_TO_POINTER (1)); + gtk_font_selection_show_available_fonts (fontsel); gtk_font_selection_show_available_sizes (fontsel, TRUE); gtk_font_selection_show_available_styles (fontsel); @@ -659,6 +677,9 @@ gtk_font_selection_reload_fonts (GtkFont gtk_font_selection_select_font_desc (fontsel, desc, NULL, NULL); gtk_font_selection_scroll_to_selection (fontsel); + /* Enable selection timeout */ + g_object_set_data (G_OBJECT (fontsel), "immediate-selection", GUINT_TO_POINTER (0)); + pango_font_description_free (desc); } } @@ -737,21 +758,26 @@ gtk_font_selection_scroll_on_map (GtkWid } /* This is called when a family is selected in the list. */ -static void -gtk_font_selection_select_font (GtkTreeSelection *selection, - gpointer data) +static gboolean +gtk_font_selection_real_select_font (gpointer data) { GtkFontSelection *fontsel; GtkFontSelectionPrivate *priv; + GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; #ifdef INCLUDE_FONT_ENTRIES const gchar *family_name; #endif + if (!g_object_get_data (G_OBJECT (data), "immediate-selection")) + GDK_THREADS_ENTER (); + fontsel = GTK_FONT_SELECTION (data); priv = fontsel->priv; + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->family_list)); + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { PangoFontFamily *family; @@ -772,6 +798,40 @@ gtk_font_selection_select_font (GtkTreeS g_object_unref (family); } + + g_object_set_data (G_OBJECT (fontsel), "font-selection-timeout", GUINT_TO_POINTER (0)); + + if (!g_object_get_data (G_OBJECT (fontsel), "immediate-selection")) + GDK_THREADS_LEAVE (); + + /* Remove ourselves */ + return FALSE; +} + +static void +gtk_font_selection_select_font (GtkTreeSelection *selection, + gpointer data) +{ + GtkFontSelection *fontsel; + guint selection_timeout = 0; + guint immediate_selection = 0; + + fontsel = GTK_FONT_SELECTION (data); + selection_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fontsel), "font-selection-timeout")); + immediate_selection = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fontsel), "immediate-selection")); + + if (selection_timeout) + g_source_remove (selection_timeout); + + if (immediate_selection) + { + gtk_font_selection_real_select_font (data); + } + else + { + selection_timeout = g_timeout_add (DELAY_REAL_SELECTION_MS, gtk_font_selection_real_select_font, data); + g_object_set_data (G_OBJECT (fontsel), "font-selection-timeout", GUINT_TO_POINTER (selection_timeout)); + } } static int @@ -977,14 +1037,22 @@ gtk_font_selection_select_best_style (Gt /* This is called when a style is selected in the list. */ -static void -gtk_font_selection_select_style (GtkTreeSelection *selection, - gpointer data) +static gboolean +gtk_font_selection_real_select_style (gpointer data) { GtkFontSelection *fontsel = GTK_FONT_SELECTION (data); + GtkFontSelectionPrivate *priv; + GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; + if (!g_object_get_data (G_OBJECT (data), "immediate-selection")) + GDK_THREADS_ENTER (); + + priv = fontsel->priv; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->face_list)); + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { PangoFontFace *face; @@ -996,6 +1064,40 @@ gtk_font_selection_select_style (GtkTree gtk_font_selection_show_available_sizes (fontsel, FALSE); gtk_font_selection_select_best_size (fontsel); + + g_object_set_data (G_OBJECT (fontsel), "style-selection-timeout", GUINT_TO_POINTER (0)); + + if (!g_object_get_data (G_OBJECT (fontsel), "immediate-selection")) + GDK_THREADS_LEAVE (); + + /* Remove ourselves */ + return FALSE; +} + +static void +gtk_font_selection_select_style (GtkTreeSelection *selection, + gpointer data) +{ + GtkFontSelection *fontsel; + guint selection_timeout = 0; + guint immediate_selection = 0; + + fontsel = GTK_FONT_SELECTION (data); + selection_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fontsel), "style-selection-timeout")); + immediate_selection = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fontsel), "immediate-selection")); + + if (selection_timeout) + g_source_remove (selection_timeout); + + if (immediate_selection) + { + gtk_font_selection_real_select_style (data); + } + else + { + selection_timeout = g_timeout_add (DELAY_REAL_SELECTION_MS, gtk_font_selection_real_select_style, data); + g_object_set_data (G_OBJECT (fontsel), "style-selection-timeout", GUINT_TO_POINTER (selection_timeout)); + } } static void @@ -1129,20 +1231,62 @@ gtk_font_selection_size_focus_out (GtkWi } /* This is called when a size is selected in the list. */ -static void -gtk_font_selection_select_size (GtkTreeSelection *selection, - gpointer data) +static gboolean +gtk_font_selection_real_select_size (gpointer data) { GtkFontSelection *fontsel = GTK_FONT_SELECTION (data); + GtkFontSelectionPrivate *priv; + GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; gint new_size; + if (!g_object_get_data (G_OBJECT (data), "immediate-selection")) + GDK_THREADS_ENTER (); + + priv = fontsel->priv; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->size_list)); + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gtk_tree_model_get (model, &iter, SIZE_COLUMN, &new_size, -1); gtk_font_selection_set_size (fontsel, new_size * PANGO_SCALE); } + + g_object_set_data (G_OBJECT (fontsel), "size-selection-timeout", GUINT_TO_POINTER (0)); + + if (!g_object_get_data (G_OBJECT (fontsel), "immediate-selection")) + GDK_THREADS_LEAVE (); + + /* Remove ourselves */ + return FALSE; +} + +static void +gtk_font_selection_select_size (GtkTreeSelection *selection, + gpointer data) +{ + GtkFontSelection *fontsel; + guint selection_timeout = 0; + guint immediate_selection = 0; + + fontsel = GTK_FONT_SELECTION (data); + selection_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fontsel), "size-selection-timeout")); + immediate_selection = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fontsel), "immediate-selection")); + + if (selection_timeout) + g_source_remove (selection_timeout); + + if (immediate_selection) + { + gtk_font_selection_real_select_size (data); + } + else + { + selection_timeout = g_timeout_add (DELAY_REAL_SELECTION_MS, gtk_font_selection_real_select_size, data); + g_object_set_data (G_OBJECT (fontsel), "size-selection-timeout", GUINT_TO_POINTER (selection_timeout)); + } } static void @@ -1444,6 +1588,9 @@ gtk_font_selection_select_font_desc (Gtk if (!new_family) return FALSE; + /* Disable selection timeout */ + g_object_set_data (G_OBJECT (fontsel), "immediate-selection", GUINT_TO_POINTER (1)); + if (pfamily) *pfamily = new_family; else @@ -1494,6 +1641,9 @@ gtk_font_selection_select_font_desc (Gtk gtk_font_selection_set_size (fontsel, pango_font_description_get_size (new_desc)); + /* Enable selection timeout */ + g_object_set_data (G_OBJECT (fontsel), "immediate-selection", GUINT_TO_POINTER (0)); + return TRUE; }