Patch updated on 17 May 2006 with this changelog: ================================================================================ --- gtk/gtkfontsel.c +++ gtk/gtkfontsel.c @@ -563,11 +563,24 @@ gtk_font_selection_finalize (GObject *object) { GtkFontSelection *fontsel; + guint selection_timeout; g_return_if_fail (GTK_IS_FONT_SELECTION (object)); fontsel = GTK_FONT_SELECTION (object); + 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); + if (fontsel->font) gdk_font_unref (fontsel->font); @@ -646,10 +659,10 @@ } /* 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) { + GtkTreeSelection *selection; GtkFontSelection *fontsel; GtkTreeModel *model; GtkTreeIter iter; @@ -657,7 +670,11 @@ const gchar *family_name; #endif + if (!g_object_get_data (G_OBJECT (data), "immediate-selection")) + GDK_THREADS_ENTER (); + fontsel = GTK_FONT_SELECTION (data); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->family_list)); if (gtk_tree_selection_get_selected (selection, &model, &iter)) { @@ -679,6 +696,31 @@ 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; + + fontsel = GTK_FONT_SELECTION (data); + 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 = g_timeout_add (200, gtk_font_selection_real_select_font, data); + g_object_set_data (G_OBJECT (fontsel), "font-selection-timeout", GUINT_TO_POINTER (selection_timeout)); } static int @@ -881,14 +923,20 @@ /* 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); + GtkTreeSelection *selection; + GtkFontSelection *fontsel; GtkTreeModel *model; GtkTreeIter iter; + if (!g_object_get_data (G_OBJECT (data), "immediate-selection")) + GDK_THREADS_ENTER (); + + fontsel = GTK_FONT_SELECTION (data); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->face_list)); + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { PangoFontFace *face; @@ -901,6 +949,31 @@ 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; + + fontsel = GTK_FONT_SELECTION (data); + 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 = g_timeout_add (200, gtk_font_selection_real_select_style, data); + g_object_set_data (G_OBJECT (fontsel), "style-selection-timeout", GUINT_TO_POINTER (selection_timeout)); } static void @@ -1033,22 +1106,51 @@ } /* 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) { + GtkTreeSelection *selection; GtkFontSelection *fontsel; GtkTreeModel *model; GtkTreeIter iter; gint new_size; + if (!g_object_get_data (G_OBJECT (data), "immediate-selection")) + GDK_THREADS_ENTER (); + fontsel = GTK_FONT_SELECTION (data); - + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->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; + + fontsel = GTK_FONT_SELECTION (data); + selection_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fontsel), "size-selection-timeout")); + + if (selection_timeout) + g_source_remove (selection_timeout); + + selection_timeout = g_timeout_add (200, gtk_font_selection_real_select_size, data); + g_object_set_data (G_OBJECT (fontsel), "size-selection-timeout", GUINT_TO_POINTER (selection_timeout)); } static void