Fix Emoji completion
authorMatthias Clasen <mclasen@redhat.com>
Thu, 23 Jan 2020 18:27:56 +0000 (13:27 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 23 Jan 2020 19:07:09 +0000 (14:07 -0500)
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
gtk/theme/Adwaita/_common.scss
gtk/theme/Adwaita/gtk-contained-dark.css
gtk/theme/Adwaita/gtk-contained.css

index 4351f9d4473e0c4424f566c6a96babc027e222da..41e37ff2215b183266fab35fc6e0f6ee61cd7b9c 100644 (file)
@@ -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;
index 0a39c17a6523d487b95352f541699c1807f6d6de..f45f5880fd55e3eae9c76b370e1475ec54ba2c04 100644 (file)
@@ -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;
 }
 
index 4ecfc059fa7f6c78c4bfff2a8a0797e321b1027e..4e2c76e9694af8ad26c5fca0e3910bae01212013 100644 (file)
@@ -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); }
 
index b36db4db3d8878a6edf07e257528c449b3f1af39..10c7d465f9511a17a688bd1443b7955d89bd6789 100644 (file)
@@ -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); }