diff options
Diffstat (limited to 'libgnomekbd')
-rw-r--r-- | libgnomekbd/gkbd-config-registry.c | 65 | ||||
-rw-r--r-- | libgnomekbd/gkbd-config-registry.h | 4 | ||||
-rw-r--r-- | libgnomekbd/gkbd-config-registry.xml | 4 | ||||
-rw-r--r-- | libgnomekbd/gkbd-desktop-config.c | 14 | ||||
-rw-r--r-- | libgnomekbd/gkbd-desktop-config.h | 4 | ||||
-rw-r--r-- | libgnomekbd/gkbd-indicator-config.c | 7 | ||||
-rw-r--r-- | libgnomekbd/gkbd-indicator.c | 34 | ||||
-rw-r--r-- | libgnomekbd/gkbd-keyboard-config.c | 83 | ||||
-rw-r--r-- | libgnomekbd/gkbd-keyboard-config.h | 8 |
9 files changed, 128 insertions, 95 deletions
diff --git a/libgnomekbd/gkbd-config-registry.c b/libgnomekbd/gkbd-config-registry.c index 98850d2..8c8e0b8 100644 --- a/libgnomekbd/gkbd-config-registry.c +++ b/libgnomekbd/gkbd-config-registry.c @@ -28,13 +28,14 @@ static GObjectClass *parent_class = NULL; gboolean - gkbd_config_registry_get_current_descriptions_as_utf8 + gkbd_config_registry_get_descriptions_as_utf8 (GkbdConfigRegistry * registry, + gchar ** layout_ids, + gchar ** variant_ids, gchar *** short_layout_descriptions, gchar *** long_layout_descriptions, gchar *** short_variant_descriptions, gchar *** long_variant_descriptions, GError ** error) { - XklConfigRec *xkl_config; char **pl, **pv; guint total_layouts; gchar **sld, **lld, **svd, **lvd; @@ -51,14 +52,9 @@ gboolean XKLF_MULTIPLE_LAYOUTS_SUPPORTED)) return FALSE; - xkl_config = xkl_config_rec_new (); - - if (!xkl_config_rec_get_from_server (xkl_config, registry->engine)) - return FALSE; - - pl = xkl_config->layouts; - pv = xkl_config->variants; - total_layouts = g_strv_length (xkl_config->layouts); + pl = layout_ids; + pv = variant_ids; + total_layouts = g_strv_length (layout_ids); sld = *short_layout_descriptions = g_new0 (char *, total_layouts + 1); lld = *long_layout_descriptions = @@ -71,14 +67,16 @@ gboolean while (pl != NULL && *pl != NULL) { XklConfigItem item; + xkl_debug (100, "ids: [%s][%s]\n", *pl, pv == NULL ? NULL : *pv); + g_snprintf (item.name, sizeof item.name, "%s", *pl); if (xkl_config_registry_find_layout (registry->registry, &item)) { - *sld++ = g_strdup (item.short_description); - *lld++ = g_strdup (item.description); + *sld = g_strdup (item.short_description); + *lld = g_strdup (item.description); } else { - *sld++ = g_strdup (""); - *lld++ = g_strdup (""); + *sld = g_strdup (""); + *lld = g_strdup (""); } if (*pv != NULL) { @@ -89,18 +87,26 @@ gboolean *svd = g_strdup (item.short_description); *lvd = g_strdup (item.description); } else { - *svd++ = g_strdup (""); - *lvd++ = g_strdup (""); + *svd = g_strdup (""); + *lvd = g_strdup (""); } } else { - *svd++ = g_strdup (""); - *lvd++ = g_strdup (""); + *svd = g_strdup (""); + *lvd = g_strdup (""); } + xkl_debug (100, "description: [%s][%s][%s][%s]\n", + *sld, *lld, *svd, *lvd); + sld++; + lld++; + svd++; + lvd++; + pl++; - pv++; + + if (*pv != NULL) + pv++; } - g_object_unref (G_OBJECT (xkl_config)); return TRUE; } @@ -169,14 +175,17 @@ gkbd_config_registry_init (GkbdConfigRegistry * registry) DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); - if (!org_freedesktop_DBus_request_name - (driver_proxy, "org.gnome.GkbdConfigRegistry", 0, - &request_ret, &error)) { - g_warning ("Unable to register service: %s", - error->message); - g_error_free (error); - } - g_object_unref (driver_proxy); + if (driver_proxy != NULL) { + if (!org_freedesktop_DBus_request_name + (driver_proxy, "org.gnome.GkbdConfigRegistry", 0, + &request_ret, &error)) { + g_warning ("Unable to register service: %s", + error->message); + g_error_free (error); + } + g_object_unref (driver_proxy); + } else + g_critical ("Could not create DBUS proxy"); /* Init libxklavier stuff */ registry->engine = xkl_engine_get_instance (XOpenDisplay (NULL)); diff --git a/libgnomekbd/gkbd-config-registry.h b/libgnomekbd/gkbd-config-registry.h index 04d7318..d958090 100644 --- a/libgnomekbd/gkbd-config-registry.h +++ b/libgnomekbd/gkbd-config-registry.h @@ -53,8 +53,10 @@ struct GkbdConfigRegistryClass { extern GType gkbd_config_registry_get_type (void); extern gboolean - gkbd_config_registry_get_current_descriptions_as_utf8 + gkbd_config_registry_get_descriptions_as_utf8 (GkbdConfigRegistry * registry, + gchar ** layout_ids, + gchar ** variant_ids, gchar *** short_layout_descriptions, gchar *** long_layout_descriptions, gchar *** short_variant_descriptions, diff --git a/libgnomekbd/gkbd-config-registry.xml b/libgnomekbd/gkbd-config-registry.xml index 32c4380..73b6404 100644 --- a/libgnomekbd/gkbd-config-registry.xml +++ b/libgnomekbd/gkbd-config-registry.xml @@ -3,7 +3,9 @@ <node name="/org/gnome/GkbdConfigRegistry"> <interface name="org.gnome.GkbdConfigRegistry"> <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="gkbd_config_registry"/> - <method name="GetCurrentDescriptionsAsUtf8"> + <method name="GetDescriptionsAsUtf8"> + <arg type="as" name="layoutIds" direction="in" /> + <arg type="as" name="variantIds" direction="in" /> <arg type="as" name="shortLayoutDescriptions" direction="out" /> <arg type="as" name="longLayoutDescriptions" direction="out" /> <arg type="as" name="shortVariantDescriptions" direction="out" /> diff --git a/libgnomekbd/gkbd-desktop-config.c b/libgnomekbd/gkbd-desktop-config.c index bdf2112..936ad67 100644 --- a/libgnomekbd/gkbd-desktop-config.c +++ b/libgnomekbd/gkbd-desktop-config.c @@ -52,7 +52,9 @@ const gchar GKBD_DESKTOP_CONFIG_KEY_LAYOUT_NAMES_AS_GROUP_NAMES[] */ static gboolean -gkbd_desktop_config_get_remote_lv_descriptions_utf8 (gchar *** sld, +gkbd_desktop_config_get_remote_lv_descriptions_utf8 (const gchar ** lids, + const gchar ** vids, + gchar *** sld, gchar *** lld, gchar *** svd, gchar *** lvd) @@ -77,8 +79,8 @@ gkbd_desktop_config_get_remote_lv_descriptions_utf8 (gchar *** sld, "org.gnome.GkbdConfigRegistry"); /* The method call will trigger activation, more on that later */ - if (!org_gnome_GkbdConfigRegistry_get_current_descriptions_as_utf8 - (proxy, sld, lld, svd, lvd, &error)) { + if (!org_gnome_GkbdConfigRegistry_get_descriptions_as_utf8 + (proxy, lids, vids, sld, lld, svd, lvd, &error)) { /* Method failed, the GError is set, let's warn everyone */ g_warning ("Woops remote method failed: %s", error->message); @@ -300,6 +302,10 @@ gkbd_desktop_config_stop_listen (GkbdDesktopConfig * config) gboolean gkbd_desktop_config_load_remote_group_descriptions_utf8 (GkbdDesktopConfig * config, + const gchar ** + layout_ids, + const gchar ** + variant_ids, gchar *** short_group_names, gchar *** @@ -311,7 +317,7 @@ gkbd_desktop_config_load_remote_group_descriptions_utf8 (GkbdDesktopConfig gint total_descriptions; if (!gkbd_desktop_config_get_remote_lv_descriptions_utf8 - (&sld, &lld, &svd, &lvd)) { + (layout_ids, variant_ids, &sld, &lld, &svd, &lvd)) { return False; } diff --git a/libgnomekbd/gkbd-desktop-config.h b/libgnomekbd/gkbd-desktop-config.h index 9d8322e..11eb91d 100644 --- a/libgnomekbd/gkbd-desktop-config.h +++ b/libgnomekbd/gkbd-desktop-config.h @@ -78,6 +78,10 @@ gkbd_desktop_config_load_group_descriptions_utf8 (GkbdDesktopConfig * extern gboolean gkbd_desktop_config_load_remote_group_descriptions_utf8 (GkbdDesktopConfig * config, + const gchar ** + layout_ids, + const gchar ** + variant_ids, gchar *** short_group_names, gchar *** diff --git a/libgnomekbd/gkbd-indicator-config.c b/libgnomekbd/gkbd-indicator-config.c index d47b150..f353f01 100644 --- a/libgnomekbd/gkbd-indicator-config.c +++ b/libgnomekbd/gkbd-indicator-config.c @@ -101,10 +101,11 @@ gkbd_indicator_config_get_images_file (GkbdIndicatorConfig * if (!ind_config->show_flags) return NULL; - if ((kbd_config->layouts != NULL) && - (g_slist_length (kbd_config->layouts) > group)) { + if ((kbd_config->layouts_variants != NULL) && + (g_slist_length (kbd_config->layouts_variants) > group)) { char *full_layout_name = - (char *) g_slist_nth_data (kbd_config->layouts, group); + (char *) g_slist_nth_data (kbd_config-> + layouts_variants, group); if (full_layout_name != NULL) { char *l, *v; diff --git a/libgnomekbd/gkbd-indicator.c b/libgnomekbd/gkbd-indicator.c index 57091e5..cb0c2e4 100644 --- a/libgnomekbd/gkbd-indicator.c +++ b/libgnomekbd/gkbd-indicator.c @@ -245,7 +245,6 @@ gkbd_indicator_prepare_drawing (GkbdIndicator * gki, int group) char *lbl_title = NULL; int counter = 0; char *layout_name = NULL; - XklConfigItem cfg_item; GtkWidget *align, *label; /** * Map "short desciption" -> @@ -263,7 +262,7 @@ gkbd_indicator_prepare_drawing (GkbdIndicator * gki, int group) XKLF_MULTIPLE_LAYOUTS_SUPPORTED) { char *full_layout_name = (char *) g_slist_nth_data (globals.kbd_cfg. - layouts, + layouts_variants, group); char *variant_name; if (!gkbd_keyboard_config_split_items @@ -272,10 +271,6 @@ gkbd_indicator_prepare_drawing (GkbdIndicator * gki, int group) /* just in case */ layout_name = g_strdup (full_layout_name); - g_snprintf (cfg_item.name, - sizeof (cfg_item.name), "%s", - layout_name); - if (globals.short_group_names != NULL) { char *short_group_name = globals.short_group_names[group]; @@ -415,11 +410,12 @@ gkbd_indicator_ind_cfg_changed (GConfClient * client, } static void -gkbd_indicator_load_group_names (void) +gkbd_indicator_load_group_names (const gchar ** layout_ids, + const gchar ** variant_ids) { if (!gkbd_desktop_config_load_remote_group_descriptions_utf8 - (&globals.cfg, &globals.short_group_names, - &globals.full_group_names)) { + (&globals.cfg, layout_ids, variant_ids, + &globals.short_group_names, &globals.full_group_names)) { gint i, total_groups = xkl_engine_get_num_groups (globals.engine); globals.full_group_names = @@ -427,7 +423,7 @@ gkbd_indicator_load_group_names (void) if (xkl_engine_get_features (globals.engine) & XKLF_MULTIPLE_LAYOUTS_SUPPORTED) { - GSList *lst = globals.kbd_cfg.layouts; + GSList *lst = globals.kbd_cfg.layouts_variants; for (i = 0; lst; lst = lst->next) { globals.full_group_names[i++] = g_strdup ((char *) lst->data); @@ -445,20 +441,25 @@ gkbd_indicator_load_group_names (void) static void gkbd_indicator_kbd_cfg_callback (GkbdIndicator * gki) { + XklConfigRec *xklrec = xkl_config_rec_new (); xkl_debug (100, "XKB configuration changed on X Server - reiniting...\n"); - gkbd_keyboard_config_load_from_x_current (&globals.kbd_cfg); + gkbd_keyboard_config_load_from_x_current (&globals.kbd_cfg, + xklrec); gkbd_indicator_config_update_images (&globals.ind_cfg, &globals.kbd_cfg); g_strfreev (globals.full_group_names); g_strfreev (globals.short_group_names); - gkbd_indicator_load_group_names (); + gkbd_indicator_load_group_names ((const gchar **) xklrec->layouts, + (const gchar **) xklrec-> + variants); ForAllIndicators () { gkbd_indicator_reinit_ui (gki); } NextIndicator (); + g_object_unref (G_OBJECT (xklrec)); } /* Should be called once for all applets */ @@ -697,6 +698,7 @@ static void gkbd_indicator_global_init (void) { GConfClient *gconf_client; + XklConfigRec *xklrec = xkl_config_rec_new (); globals.engine = xkl_engine_get_instance (GDK_DISPLAY ()); if (globals.engine == NULL) { @@ -727,13 +729,17 @@ gkbd_indicator_global_init (void) gkbd_desktop_config_load_from_gconf (&globals.cfg); gkbd_desktop_config_activate (&globals.cfg); - gkbd_keyboard_config_load_from_x_current (&globals.kbd_cfg); + gkbd_keyboard_config_load_from_x_current (&globals.kbd_cfg, + xklrec); gkbd_indicator_config_load_from_gconf (&globals.ind_cfg); gkbd_indicator_config_update_images (&globals.ind_cfg, &globals.kbd_cfg); gkbd_indicator_config_activate (&globals.ind_cfg); - gkbd_indicator_load_group_names (); + gkbd_indicator_load_group_names ((const gchar **) xklrec->layouts, + (const gchar **) xklrec-> + variants); + g_object_unref (G_OBJECT (xklrec)); gkbd_indicator_plugin_manager_init (&globals.plugin_manager); gkbd_indicator_plugin_manager_init_enabled_plugins (&globals. diff --git a/libgnomekbd/gkbd-keyboard-config.c b/libgnomekbd/gkbd-keyboard-config.c index f61d9f7..1a121fc 100644 --- a/libgnomekbd/gkbd-keyboard-config.c +++ b/libgnomekbd/gkbd-keyboard-config.c @@ -212,8 +212,8 @@ static void gkbd_keyboard_config_layouts_add_full (GkbdKeyboardConfig * kbd_config, const gchar * full_layout_name) { - kbd_config->layouts = - g_slist_append (kbd_config->layouts, + kbd_config->layouts_variants = + g_slist_append (kbd_config->layouts_variants, g_strdup (full_layout_name)); } @@ -229,20 +229,13 @@ gkbd_keyboard_config_copy_from_xkl_config (GkbdKeyboardConfig * kbd_config, p = pdata->layouts; p1 = pdata->variants; while (p != NULL && *p != NULL) { - if (*p1 == NULL || **p1 == '\0') { - xkl_debug (150, "Loaded Kbd layout: [%s]\n", *p); - gkbd_keyboard_config_layouts_add_full (kbd_config, - *p); - } else { - char full_layout[XKL_MAX_CI_NAME_LENGTH * 2]; - g_snprintf (full_layout, sizeof (full_layout), - "%s\t%s", *p, *p1); - xkl_debug (150, - "Loaded Kbd layout with variant: [%s]\n", - full_layout); - gkbd_keyboard_config_layouts_add_full (kbd_config, - full_layout); - } + const gchar *full_layout = + gkbd_keyboard_config_merge_items (*p, *p1); + xkl_debug (150, + "Loaded Kbd layout (with variant): [%s]\n", + full_layout); + gkbd_keyboard_config_layouts_add_full (kbd_config, + full_layout); p++; p1++; } @@ -279,15 +272,15 @@ gkbd_keyboard_config_copy_to_xkl_config (GkbdKeyboardConfig * kbd_config, NULL) ? NULL : g_strdup (kbd_config->model); num_layouts = - (kbd_config->layouts == - NULL) ? 0 : g_slist_length (kbd_config->layouts); + (kbd_config->layouts_variants == + NULL) ? 0 : g_slist_length (kbd_config->layouts_variants); num_options = (kbd_config->options == NULL) ? 0 : g_slist_length (kbd_config->options); xkl_debug (150, "Taking %d layouts\n", num_layouts); if (num_layouts != 0) { - GSList *the_layout = kbd_config->layouts; + GSList *the_layout_variant = kbd_config->layouts_variants; char **p1 = pdata->layouts = g_new0 (char *, num_layouts + 1); char **p2 = pdata->variants = @@ -295,7 +288,7 @@ gkbd_keyboard_config_copy_to_xkl_config (GkbdKeyboardConfig * kbd_config, for (i = num_layouts; --i >= 0;) { char *layout, *variant; if (gkbd_keyboard_config_split_items - (the_layout->data, &layout, &variant) + (the_layout_variant->data, &layout, &variant) && variant != NULL) { *p1 = (layout == @@ -307,9 +300,9 @@ gkbd_keyboard_config_copy_to_xkl_config (GkbdKeyboardConfig * kbd_config, g_strdup (variant); } else { *p1 = - (the_layout->data == + (the_layout_variant->data == NULL) ? g_strdup ("") : - g_strdup (the_layout->data); + g_strdup (the_layout_variant->data); *p2 = g_strdup (""); } xkl_debug (150, "Adding [%s]/%p and [%s]/%p\n", @@ -317,7 +310,7 @@ gkbd_keyboard_config_copy_to_xkl_config (GkbdKeyboardConfig * kbd_config, *p2 ? *p2 : "(nil)", *p2); p1++; p2++; - the_layout = the_layout->next; + the_layout_variant = the_layout_variant->next; } } @@ -428,8 +421,8 @@ gkbd_keyboard_config_save_params (GkbdKeyboardConfig * kbd_config, xkl_debug (150, "Saved Kbd model: [%s]\n", kbd_config->model ? kbd_config->model : "(null)"); - if (kbd_config->layouts) { - pl = kbd_config->layouts; + if (kbd_config->layouts_variants) { + pl = kbd_config->layouts_variants; while (pl != NULL) { xkl_debug (150, "Saved Kbd layout: [%s]\n", pl->data); @@ -438,7 +431,7 @@ gkbd_keyboard_config_save_params (GkbdKeyboardConfig * kbd_config, gconf_change_set_set_list (cs, param_names[1], GCONF_VALUE_STRING, - kbd_config->layouts); + kbd_config->layouts_variants); } else { xkl_debug (150, "Saved Kbd layouts: []\n"); gconf_change_set_unset (cs, param_names[1]); @@ -511,11 +504,12 @@ gkbd_keyboard_config_load_from_gconf (GkbdKeyboardConfig * kbd_config, kbd_config->model = g_strdup (kbd_config_default->model); - if (kbd_config->layouts == NULL) { - pl = kbd_config_default->layouts; + if (kbd_config->layouts_variants == NULL) { + pl = kbd_config_default->layouts_variants; while (pl != NULL) { - kbd_config->layouts = - g_slist_append (kbd_config->layouts, + kbd_config->layouts_variants = + g_slist_append (kbd_config-> + layouts_variants, g_strdup (pl->data)); pl = pl->next; } @@ -542,9 +536,12 @@ gkbd_keyboard_config_load_from_gconf_backup (GkbdKeyboardConfig * } void -gkbd_keyboard_config_load_from_x_current (GkbdKeyboardConfig * kbd_config) +gkbd_keyboard_config_load_from_x_current (GkbdKeyboardConfig * kbd_config, + XklConfigRec * data) { - XklConfigRec *data = xkl_config_rec_new (); + gboolean own_data = data == NULL; + if (own_data) + data = xkl_config_rec_new (); if (xkl_config_rec_get_from_server (data, kbd_config->engine)) gkbd_keyboard_config_copy_from_xkl_config (kbd_config, data); @@ -552,13 +549,15 @@ gkbd_keyboard_config_load_from_x_current (GkbdKeyboardConfig * kbd_config) xkl_debug (150, "Could not load keyboard config from server: [%s]\n", xkl_get_last_error ()); - g_object_unref (G_OBJECT (data)); + if (own_data) + g_object_unref (G_OBJECT (data)); } void -gkbd_keyboard_config_load_from_x_initial (GkbdKeyboardConfig * kbd_config) +gkbd_keyboard_config_load_from_x_initial (GkbdKeyboardConfig * kbd_config, + XklConfigRec * data) { - XklConfigRec *data = xkl_config_rec_new (); + gboolean own_data = data == NULL; if (xkl_config_rec_get_from_backup (data, kbd_config->engine)) gkbd_keyboard_config_copy_from_xkl_config (kbd_config, data); @@ -566,7 +565,8 @@ gkbd_keyboard_config_load_from_x_initial (GkbdKeyboardConfig * kbd_config) xkl_debug (150, "Could not load keyboard config from backup: [%s]\n", xkl_get_last_error ()); - g_object_unref (G_OBJECT (data)); + if (own_data) + g_object_unref (G_OBJECT (data)); } gboolean @@ -580,8 +580,8 @@ gkbd_keyboard_config_equals (GkbdKeyboardConfig * kbd_config1, (kbd_config2->model != NULL) && g_ascii_strcasecmp (kbd_config1->model, kbd_config2->model)) return False; - return gslist_str_equal (kbd_config1->layouts, - kbd_config2->layouts) + return gslist_str_equal (kbd_config1->layouts_variants, + kbd_config2->layouts_variants) && gslist_str_equal (kbd_config1->options, kbd_config2->options); } @@ -659,7 +659,8 @@ gkbd_keyboard_config_layouts_add (GkbdKeyboardConfig * kbd_config, void gkbd_keyboard_config_layouts_reset (GkbdKeyboardConfig * kbd_config) { - gkbd_keyboard_config_string_list_reset (&kbd_config->layouts); + gkbd_keyboard_config_string_list_reset (&kbd_config-> + layouts_variants); } void @@ -775,9 +776,9 @@ gkbd_keyboard_config_to_string (const GkbdKeyboardConfig * config) gint count; gchar *result; - if (config->layouts) { + if (config->layouts_variants) { /* g_slist_length is "expensive", so we determinate the length on the fly */ - for (iter = config->layouts, count = 0; iter; + for (iter = config->layouts_variants, count = 0; iter; iter = iter->next, ++count) { if (buffer->len) g_string_append (buffer, " "); diff --git a/libgnomekbd/gkbd-keyboard-config.h b/libgnomekbd/gkbd-keyboard-config.h index d0ba04d..579338a 100644 --- a/libgnomekbd/gkbd-keyboard-config.h +++ b/libgnomekbd/gkbd-keyboard-config.h @@ -39,7 +39,7 @@ extern const gchar GKBD_KEYBOARD_CONFIG_KEY_OPTIONS[]; */ typedef struct _GkbdKeyboardConfig { gchar *model; - GSList *layouts; + GSList *layouts_variants; GSList *options; /* private, transient */ @@ -71,10 +71,12 @@ extern void gkbd_keyboard_config_save_to_gconf_backup (GkbdKeyboardConfig * kbd_config); extern void gkbd_keyboard_config_load_from_x_initial (GkbdKeyboardConfig * - kbd_config); + kbd_config, + XklConfigRec * buf); extern void gkbd_keyboard_config_load_from_x_current (GkbdKeyboardConfig * - kbd_config); + kbd_config, + XklConfigRec * buf); extern void gkbd_keyboard_config_start_listen (GkbdKeyboardConfig * kbd_config, |