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.
This commit is contained in:
parent
a1aecd26d5
commit
247ed3d14a
@ -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);
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user