From 74e8c123722068886a8b12872601b14f5cc3bbe9 Mon Sep 17 00:00:00 2001 From: Stefano Karapetsas Date: Mon, 3 Sep 2012 17:14:37 +0200 Subject: migrate to gsettings --- libmatekbd/matekbd-keyboard-config.c | 539 ++++++++++++++++------------------- 1 file changed, 252 insertions(+), 287 deletions(-) (limited to 'libmatekbd/matekbd-keyboard-config.c') diff --git a/libmatekbd/matekbd-keyboard-config.c b/libmatekbd/matekbd-keyboard-config.c index 8be2a37..9de35f4 100644 --- a/libmatekbd/matekbd-keyboard-config.c +++ b/libmatekbd/matekbd-keyboard-config.c @@ -24,26 +24,23 @@ #include #include -#include +#include #include #include +#include /** * MatekbdKeyboardConfig */ -#define MATEKBD_KEYBOARD_CONFIG_KEY_PREFIX MATEKBD_CONFIG_KEY_PREFIX "/kbd" +#define MATEKBD_KEYBOARD_CONFIG_SCHEMA MATEKBD_CONFIG_SCHEMA ".kbd" #define GROUP_SWITCHERS_GROUP "grp" #define DEFAULT_GROUP_SWITCH "grp:shift_caps_toggle" -const gchar MATEKBD_KEYBOARD_CONFIG_DIR[] = MATEKBD_KEYBOARD_CONFIG_KEY_PREFIX; -const gchar MATEKBD_KEYBOARD_CONFIG_KEY_MODEL[] = - MATEKBD_KEYBOARD_CONFIG_KEY_PREFIX "/model"; -const gchar MATEKBD_KEYBOARD_CONFIG_KEY_LAYOUTS[] = - MATEKBD_KEYBOARD_CONFIG_KEY_PREFIX "/layouts"; -const gchar MATEKBD_KEYBOARD_CONFIG_KEY_OPTIONS[] = - MATEKBD_KEYBOARD_CONFIG_KEY_PREFIX "/options"; +const gchar MATEKBD_KEYBOARD_CONFIG_KEY_MODEL[] = "model"; +const gchar MATEKBD_KEYBOARD_CONFIG_KEY_LAYOUTS[] = "layouts"; +const gchar MATEKBD_KEYBOARD_CONFIG_KEY_OPTIONS[] = "options"; const gchar *MATEKBD_KEYBOARD_CONFIG_ACTIVE[] = { MATEKBD_KEYBOARD_CONFIG_KEY_MODEL, @@ -54,33 +51,30 @@ const gchar *MATEKBD_KEYBOARD_CONFIG_ACTIVE[] = { /** * static common functions */ -static void -matekbd_keyboard_config_string_list_reset (GSList ** plist) -{ - while (*plist != NULL) { - GSList *p = *plist; - *plist = (*plist)->next; - g_free (p->data); - g_slist_free_1 (p); - } -} static gboolean -gslist_str_equal (GSList * l1, GSList * l2) +g_strv_equal (gchar ** l1, gchar ** l2) { if (l1 == l2) return TRUE; - while (l1 != NULL && l2 != NULL) { - if ((l1->data != l2->data) && - (l1->data != NULL) && - (l2->data != NULL) && - g_ascii_strcasecmp (l1->data, l2->data)) - return False; - - l1 = l1->next; - l2 = l2->next; + if (l1 == NULL) + return g_strv_length (l2) == 0; + if (l2 == NULL) + return g_strv_length (l1) == 0; + + while ((*l1 != NULL) && (*l2 != NULL)) { + if (*l1 != *l2) { + if (*l1 && *l2) { + if (g_ascii_strcasecmp (*l1, *l2)) + return FALSE; + } else + return FALSE; + } + + l1++; + l2++; } - return (l1 == NULL && l2 == NULL); + return (*l1 == NULL) && (*l2 == NULL); } gboolean @@ -187,65 +181,66 @@ matekbd_keyboard_config_split_items (const gchar * merged, gchar ** parent, /** * static MatekbdKeyboardConfig functions */ -static void -matekbd_keyboard_config_options_add_full (MatekbdKeyboardConfig * kbd_config, - const gchar * full_option_name) -{ - kbd_config->options = - g_slist_append (kbd_config->options, - g_strdup (full_option_name)); -} - -static void -matekbd_keyboard_config_layouts_add_full (MatekbdKeyboardConfig * kbd_config, - const gchar * full_layout_name) -{ - kbd_config->layouts_variants = - g_slist_append (kbd_config->layouts_variants, - g_strdup (full_layout_name)); -} - static void matekbd_keyboard_config_copy_from_xkl_config (MatekbdKeyboardConfig * kbd_config, XklConfigRec * pdata) { char **p, **p1; + int i; matekbd_keyboard_config_model_set (kbd_config, pdata->model); xkl_debug (150, "Loaded Kbd model: [%s]\n", pdata->model); - matekbd_keyboard_config_layouts_reset (kbd_config); - p = pdata->layouts; - p1 = pdata->variants; - while (p != NULL && *p != NULL) { - const gchar *full_layout = - matekbd_keyboard_config_merge_items (*p, *p1); - xkl_debug (150, - "Loaded Kbd layout (with variant): [%s]\n", - full_layout); - matekbd_keyboard_config_layouts_add_full (kbd_config, - full_layout); - p++; - p1++; + /* Layouts */ + g_strfreev (kbd_config->layouts_variants); + kbd_config->layouts_variants = NULL; + if (pdata->layouts != NULL) { + p = pdata->layouts; + p1 = pdata->variants; + kbd_config->layouts_variants = + g_new0 (gchar *, g_strv_length (pdata->layouts) + 1); + i = 0; + while (*p != NULL) { + const gchar *full_layout = + matekbd_keyboard_config_merge_items (*p, *p1); + xkl_debug (150, + "Loaded Kbd layout (with variant): [%s]\n", + full_layout); + kbd_config->layouts_variants[i++] = + g_strdup (full_layout); + p++; + p1++; + } } - matekbd_keyboard_config_options_reset (kbd_config); - p = pdata->options; - while (p != NULL && *p != NULL) { - char group[XKL_MAX_CI_NAME_LENGTH]; - char *option = *p; - char *delim = - (option != NULL) ? strchr (option, ':') : NULL; - int len; - if ((delim != NULL) && - ((len = (delim - option)) < XKL_MAX_CI_NAME_LENGTH)) { - strncpy (group, option, len); - group[len] = 0; - xkl_debug (150, "Loaded Kbd option: [%s][%s]\n", - group, option); - matekbd_keyboard_config_options_add (kbd_config, - group, option); + /* Options */ + g_strfreev (kbd_config->options); + kbd_config->options = NULL; + + if (pdata->options != NULL) { + p = pdata->options; + kbd_config->options = + g_new0 (gchar *, g_strv_length (pdata->options) + 1); + i = 0; + while (*p != NULL) { + char group[XKL_MAX_CI_NAME_LENGTH]; + char *option = *p; + char *delim = + (option != NULL) ? strchr (option, ':') : NULL; + int len; + if ((delim != NULL) && + ((len = + (delim - option)) < + XKL_MAX_CI_NAME_LENGTH)) { + strncpy (group, option, len); + group[len] = 0; + xkl_debug (150, + "Loaded Kbd option: [%s][%s]\n", + group, option); + matekbd_keyboard_config_options_set + (kbd_config, i++, group, option); + } + p++; } - p++; } } @@ -261,14 +256,14 @@ matekbd_keyboard_config_copy_to_xkl_config (MatekbdKeyboardConfig * kbd_config, num_layouts = (kbd_config->layouts_variants == - NULL) ? 0 : g_slist_length (kbd_config->layouts_variants); + NULL) ? 0 : g_strv_length (kbd_config->layouts_variants); num_options = (kbd_config->options == - NULL) ? 0 : g_slist_length (kbd_config->options); + NULL) ? 0 : g_strv_length (kbd_config->options); xkl_debug (150, "Taking %d layouts\n", num_layouts); if (num_layouts != 0) { - GSList *the_layout_variant = kbd_config->layouts_variants; + gchar **the_layout_variant = kbd_config->layouts_variants; char **p1 = pdata->layouts = g_new0 (char *, num_layouts + 1); char **p2 = pdata->variants = @@ -276,7 +271,7 @@ matekbd_keyboard_config_copy_to_xkl_config (MatekbdKeyboardConfig * kbd_config, for (i = num_layouts; --i >= 0;) { char *layout, *variant; if (matekbd_keyboard_config_split_items - (the_layout_variant->data, &layout, &variant) + (*the_layout_variant, &layout, &variant) && variant != NULL) { *p1 = (layout == @@ -288,9 +283,9 @@ matekbd_keyboard_config_copy_to_xkl_config (MatekbdKeyboardConfig * kbd_config, g_strdup (variant); } else { *p1 = - (the_layout_variant->data == + (*the_layout_variant == NULL) ? g_strdup ("") : - g_strdup (the_layout_variant->data); + g_strdup (*the_layout_variant); *p2 = g_strdup (""); } xkl_debug (150, "Adding [%s]/%p and [%s]/%p\n", @@ -298,26 +293,26 @@ matekbd_keyboard_config_copy_to_xkl_config (MatekbdKeyboardConfig * kbd_config, *p2 ? *p2 : "(nil)", *p2); p1++; p2++; - the_layout_variant = the_layout_variant->next; + the_layout_variant++; } } if (num_options != 0) { - GSList *the_option = kbd_config->options; + gchar **the_option = kbd_config->options; char **p = pdata->options = g_new0 (char *, num_options + 1); for (i = num_options; --i >= 0;) { char *group, *option; if (matekbd_keyboard_config_split_items - (the_option->data, &group, &option) + (*the_option, &group, &option) && option != NULL) *(p++) = g_strdup (option); else { *(p++) = g_strdup (""); xkl_debug (150, "Could not split [%s]\n", - the_option->data); + *the_option); } - the_option = the_option->next; + the_option++; } } } @@ -326,20 +321,10 @@ static void matekbd_keyboard_config_load_params (MatekbdKeyboardConfig * kbd_config, const gchar * param_names[]) { - GError *gerror = NULL; gchar *pc; - GSList *pl, *l; - - pc = mateconf_client_get_string (kbd_config->conf_client, - param_names[0], &gerror); - if (pc == NULL || gerror != NULL) { - if (gerror != NULL) { - g_warning ("Error reading configuration:%s\n", - gerror->message); - g_error_free (gerror); - g_free (pc); - gerror = NULL; - } + + pc = g_settings_get_string (kbd_config->settings, param_names[0]); + if (pc == NULL) { matekbd_keyboard_config_model_set (kbd_config, NULL); } else { matekbd_keyboard_config_model_set (kbd_config, pc); @@ -348,97 +333,73 @@ matekbd_keyboard_config_load_params (MatekbdKeyboardConfig * kbd_config, xkl_debug (150, "Loaded Kbd model: [%s]\n", kbd_config->model ? kbd_config->model : "(null)"); - matekbd_keyboard_config_layouts_reset (kbd_config); - - l = pl = mateconf_client_get_list (kbd_config->conf_client, - param_names[1], - MATECONF_VALUE_STRING, &gerror); - if (pl == NULL || gerror != NULL) { - if (gerror != NULL) { - g_warning ("Error reading configuration:%s\n", - gerror->message); - g_error_free (gerror); - gerror = NULL; - } - } + g_strfreev (kbd_config->layouts_variants); - while (l != NULL) { - xkl_debug (150, "Loaded Kbd layout: [%s]\n", l->data); - matekbd_keyboard_config_layouts_add_full (kbd_config, - l->data); - l = l->next; - } - matekbd_keyboard_config_string_list_reset (&pl); - - matekbd_keyboard_config_options_reset (kbd_config); - - l = pl = mateconf_client_get_list (kbd_config->conf_client, - param_names[2], - MATECONF_VALUE_STRING, &gerror); - if (pl == NULL || gerror != NULL) { - if (gerror != NULL) { - g_warning ("Error reading configuration:%s\n", - gerror->message); - g_error_free (gerror); - gerror = NULL; - } + kbd_config->layouts_variants = + g_settings_get_strv (kbd_config->settings, param_names[1]); + + if (kbd_config->layouts_variants != NULL + && kbd_config->layouts_variants[0] == NULL) { + g_strfreev (kbd_config->layouts_variants); + kbd_config->layouts_variants = NULL; } - while (l != NULL) { - xkl_debug (150, "Loaded Kbd option: [%s]\n", l->data); - matekbd_keyboard_config_options_add_full (kbd_config, - (const gchar *) - l->data); - l = l->next; + g_strfreev (kbd_config->options); + + kbd_config->options = + g_settings_get_strv (kbd_config->settings, param_names[2]); + + if (kbd_config->options != NULL && kbd_config->options[0] == NULL) { + g_strfreev (kbd_config->options); + kbd_config->options = NULL; } - matekbd_keyboard_config_string_list_reset (&pl); } static void matekbd_keyboard_config_save_params (MatekbdKeyboardConfig * kbd_config, - MateConfChangeSet * cs, const gchar * param_names[]) { - GSList *pl; + gchar **pl; if (kbd_config->model) - mateconf_change_set_set_string (cs, param_names[0], - kbd_config->model); + g_settings_set_string (kbd_config->settings, param_names[0], + kbd_config->model); else - mateconf_change_set_unset (cs, param_names[0]); + g_settings_set_string (kbd_config->settings, param_names[0], + NULL); xkl_debug (150, "Saved Kbd model: [%s]\n", kbd_config->model ? kbd_config->model : "(null)"); if (kbd_config->layouts_variants) { pl = kbd_config->layouts_variants; - while (pl != NULL) { - xkl_debug (150, "Saved Kbd layout: [%s]\n", - pl->data); - pl = pl->next; + while (*pl != NULL) { + xkl_debug (150, "Saved Kbd layout: [%s]\n", *pl); + pl++; } - mateconf_change_set_set_list (cs, - param_names[1], - MATECONF_VALUE_STRING, - kbd_config->layouts_variants); + g_settings_set_strv (kbd_config->settings, + param_names[1], + (const gchar * const *) + kbd_config->layouts_variants); } else { xkl_debug (150, "Saved Kbd layouts: []\n"); - mateconf_change_set_unset (cs, param_names[1]); + g_settings_set_strv (kbd_config->settings, + param_names[1], NULL); } if (kbd_config->options) { pl = kbd_config->options; - while (pl != NULL) { - xkl_debug (150, "Saved Kbd option: [%s]\n", - pl->data); - pl = pl->next; + while (*pl != NULL) { + xkl_debug (150, "Saved Kbd option: [%s]\n", *pl); + pl++; } - mateconf_change_set_set_list (cs, - param_names[2], - MATECONF_VALUE_STRING, - kbd_config->options); + g_settings_set_strv (kbd_config->settings, + param_names[2], + (const gchar * + const *) kbd_config->options); } else { xkl_debug (150, "Saved Kbd options: []\n"); - mateconf_change_set_unset (cs, param_names[2]); + g_settings_set_strv (kbd_config->settings, + param_names[2], NULL); } } @@ -447,23 +408,11 @@ matekbd_keyboard_config_save_params (MatekbdKeyboardConfig * kbd_config, */ void matekbd_keyboard_config_init (MatekbdKeyboardConfig * kbd_config, - MateConfClient * conf_client, XklEngine * engine) + XklEngine * engine) { - GError *gerror = NULL; - memset (kbd_config, 0, sizeof (*kbd_config)); - kbd_config->conf_client = conf_client; + kbd_config->settings = g_settings_new (MATEKBD_KEYBOARD_CONFIG_SCHEMA); kbd_config->engine = engine; - g_object_ref (kbd_config->conf_client); - - mateconf_client_add_dir (kbd_config->conf_client, - MATEKBD_KEYBOARD_CONFIG_DIR, - MATECONF_CLIENT_PRELOAD_NONE, &gerror); - if (gerror != NULL) { - g_warning ("err: %s\n", gerror->message); - g_error_free (gerror); - gerror = NULL; - } } void @@ -471,15 +420,17 @@ matekbd_keyboard_config_term (MatekbdKeyboardConfig * kbd_config) { matekbd_keyboard_config_model_set (kbd_config, NULL); - matekbd_keyboard_config_layouts_reset (kbd_config); - matekbd_keyboard_config_options_reset (kbd_config); + g_strfreev (kbd_config->layouts_variants); + kbd_config->layouts_variants = NULL; + g_strfreev (kbd_config->options); + kbd_config->options = NULL; - g_object_unref (kbd_config->conf_client); - kbd_config->conf_client = NULL; + g_object_unref (kbd_config->settings); + kbd_config->settings = NULL; } void -matekbd_keyboard_config_load_from_mateconf (MatekbdKeyboardConfig * kbd_config, +matekbd_keyboard_config_load_from_gsettings (MatekbdKeyboardConfig * kbd_config, MatekbdKeyboardConfig * kbd_config_default) { @@ -487,31 +438,20 @@ matekbd_keyboard_config_load_from_mateconf (MatekbdKeyboardConfig * kbd_config, MATEKBD_KEYBOARD_CONFIG_ACTIVE); if (kbd_config_default != NULL) { - GSList *pl; if (kbd_config->model == NULL) kbd_config->model = g_strdup (kbd_config_default->model); if (kbd_config->layouts_variants == NULL) { - pl = kbd_config_default->layouts_variants; - while (pl != NULL) { - kbd_config->layouts_variants = - g_slist_append - (kbd_config->layouts_variants, - g_strdup (pl->data)); - pl = pl->next; - } + kbd_config->layouts_variants = + g_strdupv + (kbd_config_default->layouts_variants); } if (kbd_config->options == NULL) { - pl = kbd_config_default->options; - while (pl != NULL) { - kbd_config->options = - g_slist_append (kbd_config->options, - g_strdup (pl->data)); - pl = pl->next; - } + kbd_config->options = + g_strdupv (kbd_config_default->options); } } } @@ -554,6 +494,56 @@ matekbd_keyboard_config_load_from_x_initial (MatekbdKeyboardConfig * kbd_config, g_object_unref (G_OBJECT (data)); } +static gboolean +matekbd_keyboard_config_options_equals (MatekbdKeyboardConfig * kbd_config1, + MatekbdKeyboardConfig * kbd_config2) +{ + int num_options, num_options2; + + num_options = + (kbd_config1->options == + NULL) ? 0 : g_strv_length (kbd_config1->options); + num_options2 = + (kbd_config2->options == + NULL) ? 0 : g_strv_length (kbd_config2->options); + + if (num_options != num_options2) + return False; + + if (num_options != 0) { + int i; + char *group1, *option1; + + for (i = 0; i < num_options; i++) { + int j; + char *group2, *option2; + gboolean are_equal = FALSE; + + if (!matekbd_keyboard_config_split_items + (kbd_config1->options[i], &group1, &option1)) + continue; + + option1 = g_strdup (option1); + + for (j = 0; j < num_options && !are_equal; j++) { + if (matekbd_keyboard_config_split_items + (kbd_config2->options[j], &group2, + &option2)) { + are_equal = + strcmp (option1, option2) == 0; + } + } + + g_free (option1); + + if (!are_equal) + return False; + } + } + + return True; +} + gboolean matekbd_keyboard_config_equals (MatekbdKeyboardConfig * kbd_config1, MatekbdKeyboardConfig * kbd_config2) @@ -565,32 +555,26 @@ matekbd_keyboard_config_equals (MatekbdKeyboardConfig * kbd_config1, (kbd_config2->model != NULL) && g_ascii_strcasecmp (kbd_config1->model, kbd_config2->model)) return False; - return gslist_str_equal (kbd_config1->layouts_variants, - kbd_config2->layouts_variants) - && gslist_str_equal (kbd_config1->options, - kbd_config2->options); + if (!g_strv_equal (kbd_config1->layouts_variants, + kbd_config2->layouts_variants)) + return False; + + if (!matekbd_keyboard_config_options_equals + (kbd_config1, kbd_config2)) + return False; + + return True; } void -matekbd_keyboard_config_save_to_mateconf (MatekbdKeyboardConfig * kbd_config) +matekbd_keyboard_config_save_to_gsettings (MatekbdKeyboardConfig * kbd_config) { - MateConfChangeSet *cs; - GError *gerror = NULL; + g_settings_delay (kbd_config->settings); - cs = mateconf_change_set_new (); + matekbd_keyboard_config_save_params (kbd_config, + MATEKBD_KEYBOARD_CONFIG_ACTIVE); - matekbd_keyboard_config_save_params (kbd_config, cs, - MATEKBD_KEYBOARD_CONFIG_ACTIVE); - - mateconf_client_commit_change_set (kbd_config->conf_client, cs, TRUE, - &gerror); - if (gerror != NULL) { - g_warning ("Error saving active configuration: %s\n", - gerror->message); - g_error_free (gerror); - gerror = NULL; - } - mateconf_change_set_unref (cs); + g_settings_apply (kbd_config->settings); } void @@ -605,35 +589,8 @@ matekbd_keyboard_config_model_set (MatekbdKeyboardConfig * kbd_config, } void -matekbd_keyboard_config_layouts_add (MatekbdKeyboardConfig * kbd_config, - const gchar * layout_name, - const gchar * variant_name) -{ - const gchar *merged; - if (layout_name == NULL) - return; - merged = - matekbd_keyboard_config_merge_items (layout_name, variant_name); - if (merged == NULL) - return; - matekbd_keyboard_config_layouts_add_full (kbd_config, merged); -} - -void -matekbd_keyboard_config_layouts_reset (MatekbdKeyboardConfig * kbd_config) -{ - matekbd_keyboard_config_string_list_reset - (&kbd_config->layouts_variants); -} - -void -matekbd_keyboard_config_options_reset (MatekbdKeyboardConfig * kbd_config) -{ - matekbd_keyboard_config_string_list_reset (&kbd_config->options); -} - -void -matekbd_keyboard_config_options_add (MatekbdKeyboardConfig * kbd_config, +matekbd_keyboard_config_options_set (MatekbdKeyboardConfig * kbd_config, + gint idx, const gchar * group_name, const gchar * option_name) { @@ -644,7 +601,7 @@ matekbd_keyboard_config_options_add (MatekbdKeyboardConfig * kbd_config, matekbd_keyboard_config_merge_items (group_name, option_name); if (merged == NULL) return; - matekbd_keyboard_config_options_add_full (kbd_config, merged); + kbd_config->options[idx] = g_strdup (merged); } gboolean @@ -652,14 +609,17 @@ matekbd_keyboard_config_options_is_set (MatekbdKeyboardConfig * kbd_config, const gchar * group_name, const gchar * option_name) { + gchar **p = kbd_config->options; const gchar *merged = matekbd_keyboard_config_merge_items (group_name, option_name); if (merged == NULL) return FALSE; - return NULL != g_slist_find_custom (kbd_config->options, (gpointer) - merged, (GCompareFunc) - g_ascii_strcasecmp); + while (p && *p) { + if (!g_ascii_strcasecmp (merged, *p++)) + return TRUE; + } + return FALSE; } gboolean @@ -677,21 +637,20 @@ matekbd_keyboard_config_activate (MatekbdKeyboardConfig * kbd_config) void matekbd_keyboard_config_start_listen (MatekbdKeyboardConfig * kbd_config, - MateConfClientNotifyFunc func, + GCallback func, gpointer user_data) { - matekbd_desktop_config_add_listener (kbd_config->conf_client, - MATEKBD_KEYBOARD_CONFIG_DIR, func, - user_data, - &kbd_config->config_listener_id); + kbd_config->config_listener_id = + g_signal_connect (kbd_config->settings, "changed", func, + user_data); } void matekbd_keyboard_config_stop_listen (MatekbdKeyboardConfig * kbd_config) { - matekbd_desktop_config_remove_listener (kbd_config->conf_client, - &kbd_config-> - config_listener_id); + g_signal_handler_disconnect (kbd_config->settings, + kbd_config->config_listener_id); + kbd_config->config_listener_id = 0; } gboolean @@ -735,19 +694,18 @@ matekbd_keyboard_config_to_string (const MatekbdKeyboardConfig * config) gchar *layouts = NULL, *options = NULL; GString *buffer = g_string_new (NULL); - GSList *iter; + gchar **iter; gint count; gchar *result; if (config->layouts_variants) { /* g_slist_length is "expensive", so we determinate the length on the fly */ - for (iter = config->layouts_variants, count = 0; iter; - iter = iter->next, ++count) { + for (iter = config->layouts_variants, count = 0; *iter; + iter++, ++count) { if (buffer->len) g_string_append (buffer, " "); - g_string_append (buffer, - (const gchar *) iter->data); + g_string_append (buffer, *iter); } /* Translators: The count is related to the number of options. The %s @@ -760,13 +718,12 @@ matekbd_keyboard_config_to_string (const MatekbdKeyboardConfig * config) } if (config->options) { /* g_slist_length is "expensive", so we determinate the length on the fly */ - for (iter = config->options, count = 0; iter; - iter = iter->next, ++count) { + for (iter = config->options, count = 0; *iter; + iter++, ++count) { if (buffer->len) g_string_append (buffer, " "); - g_string_append (buffer, - (const gchar *) iter->data); + g_string_append (buffer, *iter); } /* Translators: The count is related to the number of options. The %s @@ -791,27 +748,35 @@ matekbd_keyboard_config_to_string (const MatekbdKeyboardConfig * config) return result; } -GSList * -matekbd_keyboard_config_add_default_switch_option_if_necessary (GSList * - layouts_list, - GSList * - options_list, gboolean *was_appended) +/** + * matekbd_keyboard_config_add_default_switch_option_if_necessary: + * + * Returns: (transfer full) (array zero-terminated=1): List of options + */ +gchar ** +matekbd_keyboard_config_add_default_switch_option_if_necessary (gchar ** + layouts_list, + gchar ** + options_list, + gboolean *was_appended) { *was_appended = FALSE; - if (g_slist_length (layouts_list) >= 2) { + if (g_strv_length (layouts_list) >= 2) { gboolean any_switcher = False; - GSList *option = options_list; - while (option != NULL) { - char *g, *o; - if (matekbd_keyboard_config_split_items - (option->data, &g, &o)) { - if (!g_ascii_strcasecmp - (g, GROUP_SWITCHERS_GROUP)) { - any_switcher = True; - break; + if (*options_list != NULL) { + gchar **option = options_list; + while (*option != NULL) { + char *g, *o; + if (matekbd_keyboard_config_split_items + (*option, &g, &o)) { + if (!g_ascii_strcasecmp + (g, GROUP_SWITCHERS_GROUP)) { + any_switcher = True; + break; + } } + option++; } - option = option->next; } if (!any_switcher) { const gchar *id = @@ -819,7 +784,7 @@ matekbd_keyboard_config_add_default_switch_option_if_necessary (GSList * (GROUP_SWITCHERS_GROUP, DEFAULT_GROUP_SWITCH); options_list = - g_slist_append (options_list, g_strdup (id)); + matekbd_strv_append (options_list, g_strdup (id)); *was_appended = TRUE; } } -- cgit v1.2.1