File gtk3-bnc130159-bgo319483-async-font-selection.patch of Package gtk3

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;
 }
 
openSUSE Build Service is sponsored by