[gnome-text-editor] spellcheck: add group property to language info
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-text-editor] spellcheck: add group property to language info
- Date: Fri, 24 Jun 2022 21:07:14 +0000 (UTC)
commit 48b9ec78cfa80fcf4b29e7353935da5299a903e0
Author: Christian Hergert <chergert redhat com>
Date: Fri Jun 24 13:24:29 2022 -0700
spellcheck: add group property to language info
This can be used in a future commit to group selections by language name.
src/editor-spell-language-info.c | 30 ++++++++++++++-
src/editor-spell-language-info.h | 10 +++--
src/enchant/editor-enchant-spell-provider.c | 60 ++++++++++++++++++++++-------
3 files changed, 81 insertions(+), 19 deletions(-)
---
diff --git a/src/editor-spell-language-info.c b/src/editor-spell-language-info.c
index 8bc4ceb..7d4095c 100644
--- a/src/editor-spell-language-info.c
+++ b/src/editor-spell-language-info.c
@@ -27,6 +27,7 @@ struct _EditorSpellLanguageInfo
GObject parent_instance;
char *name;
char *code;
+ char *group;
};
G_DEFINE_TYPE (EditorSpellLanguageInfo, editor_spell_language_info, G_TYPE_OBJECT)
@@ -34,6 +35,7 @@ G_DEFINE_TYPE (EditorSpellLanguageInfo, editor_spell_language_info, G_TYPE_OBJEC
enum {
PROP_0,
PROP_CODE,
+ PROP_GROUP,
PROP_NAME,
N_PROPS
};
@@ -49,11 +51,13 @@ static GParamSpec *properties [N_PROPS];
*/
EditorSpellLanguageInfo *
editor_spell_language_info_new (const char *name,
- const char *code)
+ const char *code,
+ const char *group)
{
return g_object_new (EDITOR_TYPE_SPELL_LANGUAGE_INFO,
"name", name,
"code", code,
+ "group", group,
NULL);
}
@@ -64,6 +68,7 @@ editor_spell_language_info_finalize (GObject *object)
g_clear_pointer (&self->name, g_free);
g_clear_pointer (&self->code, g_free);
+ g_clear_pointer (&self->group, g_free);
G_OBJECT_CLASS (editor_spell_language_info_parent_class)->finalize (object);
}
@@ -86,6 +91,10 @@ editor_spell_language_info_get_property (GObject *object,
g_value_set_string (value, editor_spell_language_info_get_code (self));
break;
+ case PROP_GROUP:
+ g_value_set_string (value, editor_spell_language_info_get_group (self));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -109,6 +118,10 @@ editor_spell_language_info_set_property (GObject *object,
self->code = g_value_dup_string (value);
break;
+ case PROP_GROUP:
+ self->group = g_value_dup_string (value);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -137,6 +150,13 @@ editor_spell_language_info_class_init (EditorSpellLanguageInfoClass *klass)
NULL,
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ properties [PROP_GROUP] =
+ g_param_spec_string ("group",
+ "Group",
+ "A group for sorting, usually the country name",
+ NULL,
+ (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
g_object_class_install_properties (object_class, N_PROPS, properties);
}
@@ -160,3 +180,11 @@ editor_spell_language_info_get_code (EditorSpellLanguageInfo *self)
return self->code;
}
+
+const char *
+editor_spell_language_info_get_group (EditorSpellLanguageInfo *self)
+{
+ g_return_val_if_fail (EDITOR_IS_SPELL_LANGUAGE_INFO (self), NULL);
+
+ return self->group;
+}
diff --git a/src/editor-spell-language-info.h b/src/editor-spell-language-info.h
index a844261..ede69b8 100644
--- a/src/editor-spell-language-info.h
+++ b/src/editor-spell-language-info.h
@@ -28,9 +28,11 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (EditorSpellLanguageInfo, editor_spell_language_info, EDITOR, SPELL_LANGUAGE_INFO,
GObject)
-EditorSpellLanguageInfo *editor_spell_language_info_new (const char *name,
- const char *code);
-const char *editor_spell_language_info_get_name (EditorSpellLanguageInfo *self);
-const char *editor_spell_language_info_get_code (EditorSpellLanguageInfo *self);
+EditorSpellLanguageInfo *editor_spell_language_info_new (const char *name,
+ const char *code,
+ const char *group);
+const char *editor_spell_language_info_get_group (EditorSpellLanguageInfo *self);
+const char *editor_spell_language_info_get_name (EditorSpellLanguageInfo *self);
+const char *editor_spell_language_info_get_code (EditorSpellLanguageInfo *self);
G_END_DECLS
diff --git a/src/enchant/editor-enchant-spell-provider.c b/src/enchant/editor-enchant-spell-provider.c
index fb722c5..1949013 100644
--- a/src/enchant/editor-enchant-spell-provider.c
+++ b/src/enchant/editor-enchant-spell-provider.c
@@ -50,6 +50,31 @@ get_broker (void)
return broker;
}
+static char *
+_icu_uchar_to_char (const UChar *input,
+ gsize max_input_len)
+{
+ GString *str;
+
+ g_assert (input != NULL);
+ g_assert (max_input_len > 0);
+
+ if (input[0] == 0)
+ return NULL;
+
+ str = g_string_new (NULL);
+
+ for (gsize i = 0; i < max_input_len; i++)
+ {
+ if (input[i] == 0)
+ break;
+
+ g_string_append_unichar (str, input[i]);
+ }
+
+ return g_string_free (str, FALSE);
+}
+
static char *
get_display_name (const char *code)
{
@@ -59,20 +84,26 @@ get_display_name (const char *code)
{
UChar ret[256];
UErrorCode status = U_ZERO_ERROR;
-
- ret[0] = 0;
uloc_getDisplayName (code, names[i], ret, G_N_ELEMENTS (ret), &status);
- ret[G_N_ELEMENTS (ret)-1] = 0;
+ if (status == U_ZERO_ERROR)
+ return _icu_uchar_to_char (ret, G_N_ELEMENTS (ret));
+ }
- if (status == U_ZERO_ERROR && ret[0] != 0)
- {
- GString *str = g_string_new (NULL);
+ return NULL;
+}
- for (guint j = 0; ret[j]; j++)
- g_string_append_unichar (str, ret[j]);
+static char *
+get_display_language (const char *code)
+{
+ const char * const *names = g_get_language_names ();
- return g_string_free (str, FALSE);
- }
+ for (guint i = 0; names[i]; i++)
+ {
+ UChar ret[256];
+ UErrorCode status = U_ZERO_ERROR;
+ uloc_getDisplayLanguage (code, names[i], ret, G_N_ELEMENTS (ret), &status);
+ if (status == U_ZERO_ERROR)
+ return _icu_uchar_to_char (ret, G_N_ELEMENTS (ret));
}
return NULL;
@@ -112,12 +143,13 @@ list_languages_cb (const char * const lang_tag,
{
GPtrArray *ar = user_data;
char *name = get_display_name (lang_tag);
+ char *group = get_display_language (lang_tag);
if (name != NULL)
- {
- g_ptr_array_add (ar, editor_spell_language_info_new (name, lang_tag));
- g_free (name);
- }
+ g_ptr_array_add (ar, editor_spell_language_info_new (name, lang_tag, group));
+
+ g_free (name);
+ g_free (group);
}
static GPtrArray *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]