diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/keyboard/msd-keyboard-xkb.c | 53 |
1 files changed, 21 insertions, 32 deletions
diff --git a/plugins/keyboard/msd-keyboard-xkb.c b/plugins/keyboard/msd-keyboard-xkb.c index 0254f68..b9b5c24 100644 --- a/plugins/keyboard/msd-keyboard-xkb.c +++ b/plugins/keyboard/msd-keyboard-xkb.c @@ -103,22 +103,14 @@ static void msd_keyboard_log_appender(const char file[], const char function[], } #endif -static void g_strv_delete_str (gchar **a, gchar *str) +static void +g_strv_behead (gchar **arr) { - int i; - int j; - gchar **b; - b = g_new0 (gchar *, g_strv_length (a) - 1); - - j = 0; - for (i = 0; a[i] != NULL; i++) { - if (g_strcmp0 (a[i], str) != 0) { - b[j] = g_strdup (a[i]); - j++; - } - } - g_strfreev (a); - a = b; + if (arr == NULL || *arr == NULL) + return; + + g_free (*arr); + memmove (arr, arr + 1, g_strv_length (arr) * sizeof (gchar *)); } static void @@ -398,7 +390,6 @@ filter_xkb_config (void) gchar *lname; gchar *vname; gchar **lv; - int i; gboolean any_change = FALSE; xkl_debug (100, "Filtering configuration against the registry\n"); @@ -412,24 +403,20 @@ filter_xkb_config (void) return FALSE; } } - lv = g_strdupv(current_kbd_config.layouts_variants); + lv = current_kbd_config.layouts_variants; item = xkl_config_item_new (); - for (lv = 0; lv[i] != NULL; i++) { - xkl_debug (100, "Checking [%s]\n", lv[i]); - if (matekbd_keyboard_config_split_items - (lv[i], &lname, &vname)) { + while (*lv) { + xkl_debug (100, "Checking [%s]\n", *lv); + if (matekbd_keyboard_config_split_items (*lv, &lname, &vname)) { + gboolean should_be_dropped = FALSE; g_snprintf (item->name, sizeof (item->name), "%s", lname); if (!xkl_config_registry_find_layout (xkl_registry, item)) { xkl_debug (100, "Bad layout [%s]\n", lname); - g_strv_delete_str (current_kbd_config.layouts_variants, - lv[i]); - any_change = TRUE; - continue; - } - if (vname) { + should_be_dropped = TRUE; + } else if (vname) { g_snprintf (item->name, sizeof (item->name), "%s", vname); @@ -438,14 +425,16 @@ filter_xkb_config (void) xkl_debug (100, "Bad variant [%s(%s)]\n", lname, vname); - g_strv_delete_str - (current_kbd_config.layouts_variants, - lv[i]); - any_change = TRUE; - continue; + should_be_dropped = TRUE; } } + if (should_be_dropped) { + g_strv_behead (lv); + any_change = TRUE; + continue; + } } + lv++; } g_object_unref (item); return any_change; |