[gtk/gtk-3-24: 11/13] gtkemojichooser: Use retrocompatible format for saving recent-emoji




commit 247ed3d14a352af6898ac2174059acbdd58370c0
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Thu May 6 04:31:33 2021 +0200

    gtkemojichooser: Use retrocompatible format for saving recent-emoji
    
    Given that the format changed, not to break current user history we can
    keep using the old format for saving and reading the emoji-recent
    gsettings key, by converting the new data to the old one at save time.
    
    We loose information about the short name (not really relevant), even it
    could be saved using the first keyword, but this isn't really relevant.

 gtk/gtkemojichooser.c                         | 54 ++++++++++++++++++++++-----
 gtk/org.gtk.Settings.EmojiChooser.gschema.xml |  5 +--
 2 files changed, 46 insertions(+), 13 deletions(-)
---
diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c
index a0b827dd02..66f646641a 100644
--- a/gtk/gtkemojichooser.c
+++ b/gtk/gtkemojichooser.c
@@ -174,6 +174,37 @@ populate_recent_section (GtkEmojiChooser *chooser)
   g_variant_unref (variant);
 }
 
+static GVariant *
+get_recent_emoji_data (GtkWidget *widget)
+{
+  GVariant *emoji_data = g_object_get_data (G_OBJECT (widget), "emoji-data");
+  GVariantIter *codes_iter;
+  GVariantIter *keywords_iter;
+  GVariantBuilder codes_builder;
+  const char *name;
+  const char *shortname;
+  guint code;
+  guint group;
+
+  g_assert (emoji_data);
+
+  if (g_variant_is_of_type (emoji_data, G_VARIANT_TYPE ("(auss)")))
+    return emoji_data;
+
+  g_variant_get (emoji_data, "(au&sasu)", &codes_iter, &name, &keywords_iter, &group);
+
+  g_variant_builder_init (&codes_builder, G_VARIANT_TYPE ("au"));
+  while (g_variant_iter_loop (codes_iter, "u", &code))
+    g_variant_builder_add (&codes_builder, "u", code);
+
+  g_variant_iter_free (codes_iter);
+  g_variant_iter_free (keywords_iter);
+
+  shortname = "";
+
+  return g_variant_new ("(auss)", &codes_builder, name, shortname);
+}
+
 static void
 add_recent_item (GtkEmojiChooser *chooser,
                  GVariant        *item,
@@ -185,13 +216,13 @@ add_recent_item (GtkEmojiChooser *chooser,
 
   g_variant_ref (item);
 
-  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a((ausasu)u)"));
-  g_variant_builder_add (&builder, "(@(ausasu)u)", item, modifier);
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a((auss)u)"));
+  g_variant_builder_add (&builder, "(@(auss)u)", item, modifier);
 
   children = gtk_container_get_children (GTK_CONTAINER (chooser->recent.box));
   for (l = children, i = 1; l; l = l->next, i++)
     {
-      GVariant *item2 = g_object_get_data (G_OBJECT (l->data), "emoji-data");
+      GVariant *item2 = get_recent_emoji_data (GTK_WIDGET (l->data));
       gunichar modifier2 = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (l->data), "modifier"));
 
       if (modifier == modifier2 && g_variant_equal (item, item2))
@@ -206,7 +237,7 @@ add_recent_item (GtkEmojiChooser *chooser,
           continue;
         }
 
-      g_variant_builder_add (&builder, "(@(ausasu)u)", item2, modifier2);
+      g_variant_builder_add (&builder, "(@(auss)u)", item2, modifier2);
     }
   g_list_free (children);
 
@@ -265,7 +296,7 @@ emoji_activated (GtkFlowBox      *box,
   label = gtk_bin_get_child (GTK_BIN (ebox));
   text = g_strdup (gtk_label_get_label (GTK_LABEL (label)));
 
-  item = (GVariant*) g_object_get_data (G_OBJECT (child), "emoji-data");
+  item = get_recent_emoji_data (GTK_WIDGET (child));
   modifier = (gunichar) GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (child), "modifier"));
   add_recent_item (chooser, item, modifier);
 
@@ -694,7 +725,6 @@ filter_func (GtkFlowBoxChild *child,
   GVariant *emoji_data;
   const char *text;
   const char *name;
-  const char **keywords;
   char **term_tokens;
   char **name_tokens;
   gboolean res;
@@ -715,10 +745,16 @@ filter_func (GtkFlowBoxChild *child,
   
   g_variant_get_child (emoji_data, 1, "&s", &name);
   name_tokens = g_str_tokenize_and_fold (name, "en", NULL);
-  g_variant_get_child (emoji_data, 2, "^a&s", &keywords);
 
-  res = match_tokens ((const char **)term_tokens, (const char **)name_tokens) ||
-        match_tokens ((const char **)term_tokens, keywords);
+  res = match_tokens ((const char **)term_tokens, (const char **)name_tokens);
+
+  if (g_variant_is_of_type (emoji_data, G_VARIANT_TYPE ("(ausasu)")))
+    {
+      const char **keywords;
+
+      g_variant_get_child (emoji_data, 2, "^a&s", &keywords);
+      res |= match_tokens ((const char **)term_tokens, keywords);
+    }
 
   g_strfreev (term_tokens);
   g_strfreev (name_tokens);
diff --git a/gtk/org.gtk.Settings.EmojiChooser.gschema.xml b/gtk/org.gtk.Settings.EmojiChooser.gschema.xml
index 110f7e8d9e..20e3db4f9d 100644
--- a/gtk/org.gtk.Settings.EmojiChooser.gschema.xml
+++ b/gtk/org.gtk.Settings.EmojiChooser.gschema.xml
@@ -2,7 +2,7 @@
 <schemalist>
 
   <schema id='org.gtk.Settings.EmojiChooser' path='/org/gtk/settings/emoji-chooser/'>
-    <key name='recent-emoji' type='a((ausasu)u)'>
+    <key name='recent-emoji' type='a((auss)u)'>
       <default>[]</default>
       <summary>Recently used Emoji</summary>
       <description>
@@ -10,9 +10,6 @@
         specified as an array of codepoints, name and shortname. The extra integer after this
         pair is the code of the Fitzpatrick modifier to use in place of a 0 in the
         codepoint array.
-        specified as an array of codepoints, name, shortname and keywords. The extra
-        integer after this pair is the code of the Fitzpatrick modifier to use in
-        place of a 0 in the codepoint array.
       </description>
     </key>
   </schema>


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