[gtk/matthiasc/for-master] Fix Emoji completion



commit 03c6d26c2de28032253d62a177b83388758849f7
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Jan 23 13:27:56 2020 -0500

    Fix Emoji completion
    
    This was broken in various ways; Tabbing between pages
    was causing segfaults, and using the hover state like
    this does not work anymore, with hover now being completely
    managed by GTK. Use focus instead, and also fix up the
    style.

 gtk/gtkemojicompletion.c                 | 46 +++++++++++++-------------------
 gtk/theme/Adwaita/_common.scss           | 13 ++++++---
 gtk/theme/Adwaita/gtk-contained-dark.css |  8 +++---
 gtk/theme/Adwaita/gtk-contained.css      |  8 +++---
 4 files changed, 38 insertions(+), 37 deletions(-)
---
diff --git a/gtk/gtkemojicompletion.c b/gtk/gtkemojicompletion.c
index 4351f9d447..41e37ff221 100644
--- a/gtk/gtkemojicompletion.c
+++ b/gtk/gtkemojicompletion.c
@@ -179,16 +179,11 @@ move_active_row (GtkEmojiCompletion *completion,
                  int                 direction)
 {
   GtkWidget *child;
-  GtkWidget *base;
 
   for (child = gtk_widget_get_first_child (completion->list);
        child != NULL;
        child = gtk_widget_get_next_sibling (child))
-    {
-      gtk_widget_unset_state_flags (child, GTK_STATE_FLAG_PRELIGHT);
-      base = GTK_WIDGET (g_object_get_data (G_OBJECT (child), "base"));
-      gtk_widget_unset_state_flags (base, GTK_STATE_FLAG_PRELIGHT);
-    }
+    gtk_widget_unset_state_flags (child, GTK_STATE_FLAG_FOCUSED);
 
   if (completion->active != NULL)
     {
@@ -207,11 +202,11 @@ move_active_row (GtkEmojiCompletion *completion,
     }
 
   if (completion->active != NULL)
-    gtk_widget_set_state_flags (completion->active, GTK_STATE_FLAG_PRELIGHT, FALSE);
+    gtk_widget_set_state_flags (completion->active, GTK_STATE_FLAG_FOCUSED, FALSE);
 
   if (completion->active_variation)
     {
-      gtk_widget_unset_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT);
+      gtk_widget_unset_state_flags (completion->active_variation, GTK_STATE_FLAG_FOCUSED);
       completion->active_variation = NULL;
     }
 }
@@ -232,6 +227,7 @@ show_variations (GtkEmojiCompletion *completion,
 {
   GtkWidget *stack;
   GtkWidget *box;
+  GtkWidget *child;
   gboolean is_visible;
 
   if (!row)
@@ -246,17 +242,10 @@ show_variations (GtkEmojiCompletion *completion,
   if (is_visible == visible)
     return;
 
-  if (visible)
-    gtk_widget_unset_state_flags (row, GTK_STATE_FLAG_PRELIGHT);
-  else
-    gtk_widget_set_state_flags (row, GTK_STATE_FLAG_PRELIGHT, FALSE);
-
   gtk_stack_set_visible_child_name (GTK_STACK (stack), visible ? "variations" : "text");
-  if (completion->active_variation)
-    {
-      gtk_widget_unset_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT);
-      completion->active_variation = NULL;
-    }
+  for (child = gtk_widget_get_first_child (box); child; child = gtk_widget_get_next_sibling (child))
+    gtk_widget_unset_state_flags (child, GTK_STATE_FLAG_FOCUSED);
+  completion->active_variation = NULL;
 }
 
 static gboolean
@@ -294,9 +283,9 @@ move_active_variation (GtkEmojiCompletion *completion,
   if (next)
     {
       if (completion->active_variation)
-        gtk_widget_unset_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT);
+        gtk_widget_unset_state_flags (completion->active_variation, GTK_STATE_FLAG_FOCUSED);
       completion->active_variation = next;
-      gtk_widget_set_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT, FALSE);
+      gtk_widget_set_state_flags (completion->active_variation, GTK_STATE_FLAG_FOCUSED, FALSE);
     }
 
   return next != NULL;
@@ -477,8 +466,7 @@ add_emoji_variation (GtkWidget *box,
   gtk_label_set_attributes (GTK_LABEL (label), attrs);
   pango_attr_list_unref (attrs);
 
-  child = gtk_flow_box_child_new ();
-  gtk_style_context_add_class (gtk_widget_get_style_context (child), "emoji");
+  child = g_object_new (GTK_TYPE_FLOW_BOX_CHILD, "css-name", "emoji", NULL);
   g_object_set_data_full (G_OBJECT (child), "text", g_strdup (text), g_free);
   g_object_set_data_full (G_OBJECT (child), "emoji-data",
                           g_variant_ref (emoji_data),
@@ -513,7 +501,7 @@ add_emoji (GtkWidget          *list,
   pango_attr_list_unref (attrs);
   gtk_style_context_add_class (gtk_widget_get_style_context (label), "emoji");
 
-  child = gtk_list_box_row_new ();
+  child = g_object_new (GTK_TYPE_LIST_BOX_ROW, "css-name", "emoji-completion-row", NULL);
   gtk_widget_set_focus_on_click (child, FALSE);
   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
   gtk_container_add (GTK_CONTAINER (child), box);
@@ -550,7 +538,6 @@ add_emoji (GtkWidget          *list,
   g_object_set_data_full (G_OBJECT (child), "text", g_strdup (text), g_free);
   g_object_set_data_full (G_OBJECT (child), "emoji-data",
                           g_variant_ref (emoji_data), (GDestroyNotify)g_variant_unref);
-  gtk_style_context_add_class (gtk_widget_get_style_context (child), "emoji-completion-row");
 
   gtk_list_box_insert (GTK_LIST_BOX (list), child, -1);
 }
@@ -566,9 +553,12 @@ populate_completion (GtkEmojiCompletion *completion,
   GVariantIter iter;
   GVariant *item;
 
-  g_free (completion->text);
-  completion->text = g_strdup (text);
-  completion->length = g_utf8_strlen (text, -1);
+  if (completion->text != text)
+    {
+      g_free (completion->text);
+      completion->text = g_strdup (text);
+      completion->length = g_utf8_strlen (text, -1);
+    }
   completion->offset = offset;
 
   children = gtk_container_get_children (GTK_CONTAINER (completion->list));
@@ -603,7 +593,7 @@ populate_completion (GtkEmojiCompletion *completion,
   if (n_added > 0)
     {
       completion->active = gtk_widget_get_first_child (completion->list);
-      gtk_widget_set_state_flags (completion->active, GTK_STATE_FLAG_PRELIGHT, FALSE);
+      gtk_widget_set_state_flags (completion->active, GTK_STATE_FLAG_FOCUSED, FALSE);
     }
 
   return n_added;
diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss
index 0a39c17a65..f45f5880fd 100644
--- a/gtk/theme/Adwaita/_common.scss
+++ b/gtk/theme/Adwaita/_common.scss
@@ -4795,16 +4795,23 @@ popover.emoji-picker emoji {
   }
 }
 
-popover.emoji-completion contents row box {
+emoji-completion-row box {
   border-spacing: 10px;
   padding: 2px 10px;
 }
 
-popover.emoji-completion emoji:hover {
+emoji-completion-row:focus,
+emoji-completion-row:hover {
+  background-color: $selected_bg_color;
+  color: $selected_fg_color;
+}
+
+emoji-completion-row emoji:focus,
+emoji-completion-row emoji:hover {
   background-color: $popover_hover_color;
 }
 
-popover.entry-completion contents {
+popover.entry-completion > contents {
   padding: 0;
 }
 
diff --git a/gtk/theme/Adwaita/gtk-contained-dark.css b/gtk/theme/Adwaita/gtk-contained-dark.css
index 4ecfc059fa..4e2c76e969 100644
--- a/gtk/theme/Adwaita/gtk-contained-dark.css
+++ b/gtk/theme/Adwaita/gtk-contained-dark.css
@@ -1982,11 +1982,13 @@ popover.emoji-picker emoji { font-size: x-large; padding: 6px; border-radius: 6p
 
 popover.emoji-picker emoji:hover { background: #15539e; }
 
-popover.emoji-completion contents row box { border-spacing: 10px; padding: 2px 10px; }
+emoji-completion-row box { border-spacing: 10px; padding: 2px 10px; }
 
-popover.emoji-completion emoji:hover { background-color: #424242; }
+emoji-completion-row:focus, emoji-completion-row:hover { background-color: #15539e; color: #ffffff; }
 
-popover.entry-completion contents { padding: 0; }
+emoji-completion-row emoji:focus, emoji-completion-row emoji:hover { background-color: #424242; }
+
+popover.entry-completion > contents { padding: 0; }
 
 menubar { padding: 0px; box-shadow: inset 0 -1px rgba(0, 0, 0, 0.1); }
 
diff --git a/gtk/theme/Adwaita/gtk-contained.css b/gtk/theme/Adwaita/gtk-contained.css
index b36db4db3d..10c7d465f9 100644
--- a/gtk/theme/Adwaita/gtk-contained.css
+++ b/gtk/theme/Adwaita/gtk-contained.css
@@ -1998,11 +1998,13 @@ popover.emoji-picker emoji { font-size: x-large; padding: 6px; border-radius: 6p
 
 popover.emoji-picker emoji:hover { background: #3584e4; }
 
-popover.emoji-completion contents row box { border-spacing: 10px; padding: 2px 10px; }
+emoji-completion-row box { border-spacing: 10px; padding: 2px 10px; }
 
-popover.emoji-completion emoji:hover { background-color: white; }
+emoji-completion-row:focus, emoji-completion-row:hover { background-color: #3584e4; color: #ffffff; }
 
-popover.entry-completion contents { padding: 0; }
+emoji-completion-row emoji:focus, emoji-completion-row emoji:hover { background-color: white; }
+
+popover.entry-completion > contents { padding: 0; }
 
 menubar { padding: 0px; box-shadow: inset 0 -1px rgba(0, 0, 0, 0.1); }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]