diff -Naur libgnomekbd-2.24.0.old/libgnomekbd/gkbd-indicator.c libgnomekbd-2.24.0/libgnomekbd/gkbd-indicator.c --- libgnomekbd-2.24.0.old/libgnomekbd/gkbd-indicator.c 2008-05-10 20:02:39.000000000 +0000 +++ libgnomekbd-2.24.0/libgnomekbd/gkbd-indicator.c 2009-01-11 15:50:50.000000000 +0000 @@ -135,7 +135,12 @@ GtkNotebook *notebook = GTK_NOTEBOOK (gki); for (grp = 0; grp < total_groups; grp++) { - GtkWidget *page, *decorated_page; + GtkWidget *page, *decorated_page = NULL; + gchar *full_group_name = + (grp < + g_strv_length (globals. + full_group_names)) ? + globals.full_group_names[grp] : "?"; page = gkbd_indicator_prepare_drawing (gki, grp); if (page == NULL) @@ -144,7 +149,7 @@ decorated_page = gkbd_indicator_plugin_manager_decorate_widget (&globals.plugin_manager, page, grp, - globals.full_group_names[grp], &globals.kbd_cfg); + full_group_name, &globals.kbd_cfg); page = decorated_page == NULL ? page : decorated_page; @@ -257,39 +262,46 @@ g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - if (xkl_engine_get_features (globals.engine) & - XKLF_MULTIPLE_LAYOUTS_SUPPORTED) { - char *full_layout_name = - (char *) g_slist_nth_data (globals.kbd_cfg. - layouts_variants, - group); - char *variant_name; - if (!gkbd_keyboard_config_split_items - (full_layout_name, &layout_name, - &variant_name)) - /* just in case */ - layout_name = full_layout_name; - - /* make it freeable */ - layout_name = g_strdup (layout_name); - - if (globals.short_group_names != NULL) { - char *short_group_name = - globals.short_group_names[group]; - if (short_group_name != NULL - && *short_group_name != '\0') { - /* drop the long name */ - g_free (layout_name); - layout_name = - g_strdup (short_group_name); + + if (group < g_strv_length (globals.short_group_names)) { + if (xkl_engine_get_features (globals.engine) & + XKLF_MULTIPLE_LAYOUTS_SUPPORTED) { + char *full_layout_name = (char *) + g_slist_nth_data (globals.kbd_cfg. + layouts_variants, + group); + char *variant_name; + if (!gkbd_keyboard_config_split_items + (full_layout_name, &layout_name, + &variant_name)) + /* just in case */ + layout_name = full_layout_name; + + /* make it freeable */ + layout_name = g_strdup (layout_name); + + if (globals.short_group_names != NULL) { + char *short_group_name = + globals.short_group_names + [group]; + if (short_group_name != NULL + && *short_group_name != '\0') { + /* drop the long name */ + g_free (layout_name); + layout_name = + g_strdup + (short_group_name); + } } + } else { + layout_name = + g_strdup (globals.full_group_names + [group]); } - } else - layout_name = - g_strdup (globals.full_group_names[group]); + } if (layout_name == NULL) - layout_name = g_strdup ("?"); + layout_name = g_strdup ("??"); /* Process layouts with repeating description */ ppln = &prev_layout_name; @@ -347,7 +359,8 @@ { XklState *state = xkl_engine_get_current_state (globals.engine); gchar *buf; - if (state == NULL || state->group < 0) + if (state == NULL || state->group < 0 + || state->group >= g_strv_length (globals.full_group_names)) return; buf = g_strdup_printf (globals.tooltips_format,