From 8953d29831ec0903ccd76f80db2096e171389c3d Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Mon, 21 Jun 2010 12:38:23 +0900 Subject: [PATCH] eekboard: delay menu creation until the user selects the root menu --- src/eekboard.c | 584 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 519 insertions(+), 65 deletions(-) diff --git a/src/eekboard.c b/src/eekboard.c index 999afb3c..a94f60f7 100644 --- a/src/eekboard.c +++ b/src/eekboard.c @@ -53,6 +53,12 @@ #define USE_CLUTTER FALSE #endif +#ifdef EEKBOARD_ENABLE_DEBUG +#define EEKBOARD_NOTE(x,a...) g_message (G_STRLOC ": " x, ##a); +#else +#define EEKBOARD_NOTE(x,a...) +#endif + #define LICENSE \ "This program is free software: you can redistribute it and/or modify " \ "it under the terms of the GNU General Public License as published by " \ @@ -74,6 +80,24 @@ struct _Eekboard { GtkWidget *widget; gint width, height; guint key_event_listener; + XklEngine *engine; + XklConfigRegistry *registry; + GtkUIManager *ui_manager; + + guint countries_merge_id; + GtkActionGroup *countries_action_group; + + guint languages_merge_id; + GtkActionGroup *languages_action_group; + + guint models_merge_id; + GtkActionGroup *models_action_group; + + guint layouts_merge_id; + GtkActionGroup *layouts_action_group; + + guint options_merge_id; + GtkActionGroup *options_action_group; EekKeyboard *keyboard; EekLayout *layout; /* FIXME: eek_keyboard_get_layout() */ @@ -81,33 +105,48 @@ struct _Eekboard { }; typedef struct _Eekboard Eekboard; -struct _ConfigCallbackData { +struct _SetConfigCallbackData { Eekboard *eekboard; XklConfigRec *config; }; -typedef struct _ConfigCallbackData ConfigCallbackData; +typedef struct _SetConfigCallbackData SetConfigCallbackData; -struct _LayoutCallbackData { +struct _CreateMenuCallbackData { Eekboard *eekboard; - GtkUIManager *ui_manager; GtkActionGroup *action_group; guint merge_id; }; -typedef struct _LayoutCallbackData LayoutCallbackData; +typedef struct _CreateMenuCallbackData CreateMenuCallbackData; -static void on_about (GtkAction *action, - GtkWidget *window); +struct _LayoutVariant { + XklConfigItem *layout; + XklConfigItem *variant; +}; +typedef struct _LayoutVariant LayoutVariant; + +static void on_countries_menu (GtkAction *action, + GtkWidget *widget); +static void on_languages_menu (GtkAction *action, + GtkWidget *widget); +static void on_models_menu (GtkAction *action, + GtkWidget *window); +static void on_layouts_menu (GtkAction *action, + GtkWidget *window); +static void on_options_menu (GtkAction *action, + GtkWidget *window); +static void on_about (GtkAction *action, + GtkWidget *window); #if 0 static void on_monitor_key_event_toggled - (GtkToggleAction *action, - GtkWidget *window); + (GtkToggleAction *action, + GtkWidget *window); #endif -static GtkWidget *create_widget (Eekboard *eekboard, - gint initial_width, - gint initial_height); +static GtkWidget *create_widget (Eekboard *eekboard, + gint initial_width, + gint initial_height); static GtkWidget *create_widget_gtk (Eekboard *eekboard, - gint initial_width, - gint initial_height); + gint initial_width, + gint initial_height); #if !HAVE_CLUTTER_GTK #define create_widget create_widget_gtk @@ -123,9 +162,22 @@ static const char ui_description[] = #if 0 " " #endif - " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " " " " " + " " + " " + " " " " " " " " @@ -133,14 +185,27 @@ static const char ui_description[] = " " ""; -#define SET_LAYOUT_UI_PATH "/MainMenu/KeyboardMenu/SetLayout/LayoutsPH" +#define COUNTRIES_UI_PATH "/MainMenu/KeyboardMenu/ByCountry/CountriesPH" +#define LANGUAGES_UI_PATH "/MainMenu/KeyboardMenu/ByLanguage/LanguagesPH" +#define MODELS_UI_PATH "/MainMenu/KeyboardMenu/Model/ModelsPH" +#define LAYOUTS_UI_PATH "/MainMenu/KeyboardMenu/Layout/LayoutsPH" +#define OPTIONS_UI_PATH "/MainMenu/KeyboardMenu/Option/OptionsPH" static const GtkActionEntry action_entry[] = { {"FileMenu", NULL, N_("_File")}, {"KeyboardMenu", NULL, N_("_Keyboard")}, {"HelpMenu", NULL, N_("_Help")}, {"Quit", GTK_STOCK_QUIT, NULL, NULL, NULL, G_CALLBACK (gtk_main_quit)}, - {"SetLayout", NULL, N_("Set Layout"), NULL, NULL, NULL}, + {"ByCountry", NULL, N_("By Country"), NULL, NULL, + G_CALLBACK(on_countries_menu)}, + {"ByLanguage", NULL, N_("By Language"), NULL, NULL, + G_CALLBACK(on_languages_menu)}, + {"Model", NULL, N_("Model"), NULL, NULL, + G_CALLBACK(on_models_menu)}, + {"Layout", NULL, N_("Layout"), NULL, NULL, + G_CALLBACK(on_layouts_menu)}, + {"Option", NULL, N_("Option"), NULL, NULL, + G_CALLBACK(on_options_menu)}, {"About", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK (on_about)} }; @@ -208,9 +273,7 @@ on_key_pressed (EekKeyboard *keyboard, guint keysym; keysym = eek_key_get_keysym (key); -#if DEBUG - g_debug ("%s %X", eek_keysym_to_string (keysym), eekboard->modifiers); -#endif + EEKBOARD_NOTE("%s %X", eek_keysym_to_string (keysym), eekboard->modifiers); if (keysym == XK_Shift_L || keysym == XK_Shift_R) { gint group, level; @@ -236,14 +299,27 @@ on_key_released (EekKeyboard *keyboard, } static void -on_activate (GtkAction *action, +on_config_activate (GtkAction *action, gpointer user_data) { - ConfigCallbackData *data = user_data; + SetConfigCallbackData *data = user_data; eek_xkl_layout_set_config (EEK_XKL_LAYOUT(data->eekboard->layout), data->config); } +static void +on_option_toggled (GtkToggleAction *action, + gpointer user_data) +{ + SetConfigCallbackData *data = user_data; + if (gtk_toggle_action_get_active (action)) + eek_xkl_layout_enable_option (EEK_XKL_LAYOUT(data->eekboard->layout), + data->config->options[0]); + else + eek_xkl_layout_disable_option (EEK_XKL_LAYOUT(data->eekboard->layout), + data->config->options[0]); +} + static void on_changed (EekLayout *layout, gpointer user_data) { @@ -261,15 +337,265 @@ on_changed (EekLayout *layout, gpointer user_data) } static void -variant_callback (XklConfigRegistry *registry, +collect_layout_variant (XklConfigRegistry *registry, + const XklConfigItem *layout, + const XklConfigItem *variant, + gpointer user_data) +{ + GSList **r_lv_list = user_data; + LayoutVariant *lv; + + lv = g_slice_new0 (LayoutVariant); + lv->layout = g_slice_dup (XklConfigItem, layout); + if (variant) + lv->variant = g_slice_dup (XklConfigItem, variant); + *r_lv_list = g_slist_prepend (*r_lv_list, lv); +} + +static void +add_layout_variant_actions (CreateMenuCallbackData *data, + const gchar *name, + const gchar *path, + GSList *lv_list) +{ + gchar variant_action_name[128]; + SetConfigCallbackData *config; + GSList *head; + + for (head = lv_list; head; head = head->next) { + LayoutVariant *lv = head->data; + GtkAction *action; + gchar description[XKL_MAX_CI_DESC_LENGTH * 2 + 4]; + + if (lv->variant) { + g_snprintf (variant_action_name, sizeof (variant_action_name), + "SetLayoutVariant %s %s %s", + name, + lv->layout->name, + lv->variant->name); + g_snprintf (description, sizeof (description), + "%s (%s)", + lv->layout->description, + lv->variant->description); + } else { + g_snprintf (variant_action_name, sizeof (variant_action_name), + "SetLayout %s %s", + name, + lv->layout->name); + g_strlcpy (description, + lv->layout->description, + sizeof (description)); + } + + action = gtk_action_new (variant_action_name, + description, + NULL, + NULL); + + config = g_slice_new (SetConfigCallbackData); + config->eekboard = data->eekboard; + config->config = xkl_config_rec_new (); + config->config->layouts = g_new0 (char *, 2); + config->config->layouts[0] = g_strdup (lv->layout->name); + config->config->layouts[1] = NULL; + if (lv->variant) { + config->config->variants = g_new0 (char *, 2); + config->config->variants[0] = g_strdup (lv->variant->name); + config->config->variants[1] = NULL; + } + g_signal_connect (action, "activate", G_CALLBACK (on_config_activate), config); + + gtk_action_group_add_action (data->action_group, action); + g_object_unref (action); + + gtk_ui_manager_add_ui (data->eekboard->ui_manager, data->merge_id, + path, + variant_action_name, variant_action_name, + GTK_UI_MANAGER_MENUITEM, FALSE); + + g_slice_free (XklConfigItem, lv->layout); + if (lv->variant) + g_slice_free (XklConfigItem, lv->variant); + g_slice_free (LayoutVariant, lv); + } +} + +static void +country_callback (XklConfigRegistry *registry, const XklConfigItem *item, - gpointer user_data) + gpointer user_data) +{ + CreateMenuCallbackData *data = user_data; + GtkAction *action; + GSList *lv_list = NULL; + char country_action_name[128]; + char country_action_path[128]; + + g_snprintf (country_action_name, sizeof (country_action_name), + "Country %s", item->name); + action = gtk_action_new (country_action_name, item->description, + NULL, NULL); + gtk_action_group_add_action (data->action_group, action); + g_object_unref (action); + + gtk_ui_manager_add_ui (data->eekboard->ui_manager, data->merge_id, + COUNTRIES_UI_PATH, + country_action_name, country_action_name, + GTK_UI_MANAGER_MENU, FALSE); + g_snprintf (country_action_path, sizeof (country_action_path), + COUNTRIES_UI_PATH "/%s", country_action_name); + + xkl_config_registry_foreach_country_variant (data->eekboard->registry, + item->name, + collect_layout_variant, + &lv_list); + add_layout_variant_actions (data, item->name, country_action_path, + lv_list); + g_slist_free (lv_list); +} + +static guint +create_countries_menu (Eekboard *eekboard) +{ + CreateMenuCallbackData data; + + data.eekboard = eekboard; + data.merge_id = gtk_ui_manager_new_merge_id (eekboard->ui_manager); + data.action_group = eekboard->countries_action_group; + + xkl_config_registry_foreach_country (eekboard->registry, + country_callback, + &data); + return data.merge_id; +} + +static void +on_countries_menu (GtkAction *action, GtkWidget *window) +{ + Eekboard *eekboard = g_object_get_data (G_OBJECT(window), "eekboard"); + if (eekboard->countries_merge_id == 0) + eekboard->countries_merge_id = create_countries_menu (eekboard); +} + +static void +language_callback (XklConfigRegistry *registry, + const XklConfigItem *item, + gpointer user_data) +{ + CreateMenuCallbackData *data = user_data; + GtkAction *action; + GSList *lv_list = NULL; + char language_action_name[128]; + char language_action_path[128]; + + g_snprintf (language_action_name, sizeof (language_action_name), + "Language %s", item->name); + action = gtk_action_new (language_action_name, item->description, + NULL, NULL); + gtk_action_group_add_action (data->action_group, action); + g_object_unref (action); + + gtk_ui_manager_add_ui (data->eekboard->ui_manager, data->merge_id, + LANGUAGES_UI_PATH, + language_action_name, language_action_name, + GTK_UI_MANAGER_MENU, FALSE); + g_snprintf (language_action_path, sizeof (language_action_path), + LANGUAGES_UI_PATH "/%s", language_action_name); + + xkl_config_registry_foreach_language_variant (data->eekboard->registry, + item->name, + collect_layout_variant, + &lv_list); + add_layout_variant_actions (data, item->name, language_action_path, + lv_list); + g_slist_free (lv_list); +} + +static guint +create_languages_menu (Eekboard *eekboard) +{ + CreateMenuCallbackData data; + + data.eekboard = eekboard; + data.merge_id = gtk_ui_manager_new_merge_id (eekboard->ui_manager); + data.action_group = eekboard->languages_action_group; + + xkl_config_registry_foreach_language (eekboard->registry, + language_callback, + &data); + return data.merge_id; +} + +static void +on_languages_menu (GtkAction *action, GtkWidget *window) +{ + Eekboard *eekboard = g_object_get_data (G_OBJECT(window), "eekboard"); + if (eekboard->languages_merge_id == 0) + eekboard->languages_merge_id = create_languages_menu (eekboard); +} + +static void +model_callback (XklConfigRegistry *registry, + const XklConfigItem *item, + gpointer user_data) +{ + CreateMenuCallbackData *data = user_data; + GtkAction *action; + char model_action_name[128]; + SetConfigCallbackData *config; + + g_snprintf (model_action_name, sizeof (model_action_name), + "Model %s", item->name); + action = gtk_action_new (model_action_name, item->description, NULL, NULL); + gtk_action_group_add_action (data->action_group, action); + + config = g_slice_new (SetConfigCallbackData); + config->eekboard = data->eekboard; + config->config = xkl_config_rec_new (); + config->config->model = g_strdup (item->name); + + g_signal_connect (action, "activate", G_CALLBACK (on_config_activate), + config); + g_object_unref (action); + gtk_ui_manager_add_ui (data->eekboard->ui_manager, data->merge_id, + MODELS_UI_PATH, + model_action_name, model_action_name, + GTK_UI_MANAGER_MENUITEM, FALSE); +} + +static guint +create_models_menu (Eekboard *eekboard) +{ + CreateMenuCallbackData data; + + data.eekboard = eekboard; + data.merge_id = gtk_ui_manager_new_merge_id (eekboard->ui_manager); + data.action_group = eekboard->models_action_group; + + xkl_config_registry_foreach_model (eekboard->registry, + model_callback, + &data); + return data.merge_id; +} + +static void +on_models_menu (GtkAction *action, GtkWidget *window) +{ + Eekboard *eekboard = g_object_get_data (G_OBJECT(window), "eekboard"); + if (eekboard->models_merge_id == 0) + eekboard->models_merge_id = create_models_menu (eekboard); +} + +static void +collect_variant (XklConfigRegistry *registry, + const XklConfigItem *variant, + gpointer user_data) { GSList **r_variants = user_data; - XklConfigItem *_item; + XklConfigItem *item; - _item = g_slice_dup (XklConfigItem, item); - *r_variants = g_slist_prepend (*r_variants, _item); + item = g_slice_dup (XklConfigItem, variant); + *r_variants = g_slist_prepend (*r_variants, item); } static void @@ -277,37 +603,37 @@ layout_callback (XklConfigRegistry *registry, const XklConfigItem *item, gpointer user_data) { - LayoutCallbackData *data = user_data; + CreateMenuCallbackData *data = user_data; GtkAction *action; GSList *variants = NULL; char layout_action_name[128], variant_action_name[128]; - ConfigCallbackData *config; + SetConfigCallbackData *config; g_snprintf (layout_action_name, sizeof (layout_action_name), - "SetLayout%s", item->name); + "SetLayout %s", item->name); action = gtk_action_new (layout_action_name, item->description, NULL, NULL); gtk_action_group_add_action (data->action_group, action); xkl_config_registry_foreach_layout_variant (registry, item->name, - variant_callback, + collect_variant, &variants); if (!variants) { - config = g_slice_new (ConfigCallbackData); + config = g_slice_new (SetConfigCallbackData); config->eekboard = data->eekboard; config->config = xkl_config_rec_new (); config->config->layouts = g_new0 (char *, 2); config->config->layouts[0] = g_strdup (item->name); config->config->layouts[1] = NULL; - /* reset the existing variant setting */ + /* Reset the existing variant setting. */ config->config->variants = g_new0 (char *, 1); config->config->variants[0] = NULL; - g_signal_connect (action, "activate", G_CALLBACK (on_activate), + g_signal_connect (action, "activate", G_CALLBACK (on_config_activate), config); g_object_unref (action); - gtk_ui_manager_add_ui (data->ui_manager, data->merge_id, - SET_LAYOUT_UI_PATH, + gtk_ui_manager_add_ui (data->eekboard->ui_manager, data->merge_id, + LAYOUTS_UI_PATH, layout_action_name, layout_action_name, GTK_UI_MANAGER_MENUITEM, FALSE); } else { @@ -315,24 +641,24 @@ layout_callback (XklConfigRegistry *registry, GSList *head; g_object_unref (action); - gtk_ui_manager_add_ui (data->ui_manager, data->merge_id, - SET_LAYOUT_UI_PATH, + gtk_ui_manager_add_ui (data->eekboard->ui_manager, data->merge_id, + LAYOUTS_UI_PATH, layout_action_name, layout_action_name, GTK_UI_MANAGER_MENU, FALSE); g_snprintf (layout_path, sizeof (layout_path), - SET_LAYOUT_UI_PATH "/%s", layout_action_name); + LAYOUTS_UI_PATH "/%s", layout_action_name); for (head = variants; head; head = head->next) { XklConfigItem *_item = head->data; g_snprintf (variant_action_name, sizeof (variant_action_name), - "SetVariant%s%s", item->name, _item->name); + "SetLayoutVariant %s %s", item->name, _item->name); action = gtk_action_new (variant_action_name, _item->description, NULL, NULL); - config = g_slice_new (ConfigCallbackData); + config = g_slice_new (SetConfigCallbackData); config->eekboard = data->eekboard; config->config = xkl_config_rec_new (); config->config->layouts = g_new0 (char *, 2); @@ -341,13 +667,13 @@ layout_callback (XklConfigRegistry *registry, config->config->variants = g_new0 (char *, 2); config->config->variants[0] = g_strdup (_item->name); config->config->variants[1] = NULL; - g_signal_connect (action, "activate", G_CALLBACK (on_activate), + g_signal_connect (action, "activate", G_CALLBACK (on_config_activate), config); gtk_action_group_add_action (data->action_group, action); g_object_unref (action); - gtk_ui_manager_add_ui (data->ui_manager, data->merge_id, + gtk_ui_manager_add_ui (data->eekboard->ui_manager, data->merge_id, layout_path, variant_action_name, variant_action_name, GTK_UI_MANAGER_MENUITEM, FALSE); @@ -357,30 +683,131 @@ layout_callback (XklConfigRegistry *registry, } } -static void -create_layouts_menu (Eekboard *eekboard, GtkUIManager *ui_manager) +static guint +create_layouts_menu (Eekboard *eekboard) { - XklEngine *engine; - XklConfigRegistry *registry; - LayoutCallbackData data; + CreateMenuCallbackData data; data.eekboard = eekboard; - data.ui_manager = ui_manager; - data.action_group = gtk_action_group_new ("Layouts"); - gtk_ui_manager_insert_action_group (data.ui_manager, data.action_group, -1); - data.merge_id = gtk_ui_manager_new_merge_id (ui_manager); + data.merge_id = gtk_ui_manager_new_merge_id (eekboard->ui_manager); + data.action_group = eekboard->layouts_action_group; - engine = xkl_engine_get_instance (eekboard->display); - registry = xkl_config_registry_get_instance (engine); - xkl_config_registry_load (registry, FALSE); + xkl_config_registry_foreach_layout (eekboard->registry, + layout_callback, + &data); + return data.merge_id; +} - xkl_config_registry_foreach_layout (registry, layout_callback, &data); +static void +on_layouts_menu (GtkAction *action, GtkWidget *window) +{ + Eekboard *eekboard = g_object_get_data (G_OBJECT(window), "eekboard"); + if (eekboard->layouts_merge_id == 0) + eekboard->layouts_merge_id = create_layouts_menu (eekboard); +} + +static void +collect_option (XklConfigRegistry *registry, + const XklConfigItem *option, + gpointer user_data) +{ + GSList **r_options = user_data; + XklConfigItem *item; + + item = g_slice_dup (XklConfigItem, option); + *r_options = g_slist_prepend (*r_options, item); +} + +static void +option_group_callback (XklConfigRegistry *registry, + const XklConfigItem *item, + gpointer user_data) +{ + CreateMenuCallbackData *data = user_data; + GtkAction *action; + GSList *options = NULL, *head; + gchar option_group_action_name[128], option_action_name[128]; + gchar option_group_path[128]; + SetConfigCallbackData *config; + + g_snprintf (option_group_action_name, sizeof (option_group_action_name), + "OptionGroup %s", item->name); + action = gtk_action_new (option_group_action_name, item->description, + NULL, NULL); + gtk_action_group_add_action (data->action_group, action); + g_object_unref (action); + + xkl_config_registry_foreach_option (registry, + item->name, + collect_option, + &options); + g_return_if_fail (options); + + gtk_ui_manager_add_ui (data->eekboard->ui_manager, data->merge_id, + OPTIONS_UI_PATH, + option_group_action_name, option_group_action_name, + GTK_UI_MANAGER_MENU, FALSE); + g_snprintf (option_group_path, sizeof (option_group_path), + OPTIONS_UI_PATH "/%s", option_group_action_name); + + for (head = options; head; head = head->next) { + XklConfigItem *_item = head->data; + GtkToggleAction *toggle; + + g_snprintf (option_action_name, sizeof (option_action_name), + "SetOption %s", _item->name); + toggle = gtk_toggle_action_new (option_action_name, + _item->description, + NULL, + NULL); + + config = g_slice_new (SetConfigCallbackData); + config->eekboard = data->eekboard; + config->config = xkl_config_rec_new (); + config->config->options = g_new0 (char *, 2); + config->config->options[0] = g_strdup (_item->name); + config->config->options[1] = NULL; + g_signal_connect (toggle, "toggled", G_CALLBACK (on_option_toggled), + config); + + gtk_action_group_add_action (data->action_group, GTK_ACTION(toggle)); + g_object_unref (toggle); + + gtk_ui_manager_add_ui (data->eekboard->ui_manager, data->merge_id, + option_group_path, + option_action_name, option_action_name, + GTK_UI_MANAGER_MENUITEM, FALSE); + g_slice_free (XklConfigItem, _item); + } + g_slist_free (options); +} + +static guint +create_options_menu (Eekboard *eekboard) +{ + CreateMenuCallbackData data; + + data.eekboard = eekboard; + data.merge_id = gtk_ui_manager_new_merge_id (eekboard->ui_manager); + data.action_group = eekboard->options_action_group; + + xkl_config_registry_foreach_option_group (eekboard->registry, + option_group_callback, + &data); + return data.merge_id; +} + +static void +on_options_menu (GtkAction *action, GtkWidget *window) +{ + Eekboard *eekboard = g_object_get_data (G_OBJECT(window), "eekboard"); + if (eekboard->options_merge_id == 0) + eekboard->options_merge_id = create_options_menu (eekboard); } static void create_menus (Eekboard *eekboard, - GtkWidget *window, - GtkUIManager * ui_manager) + GtkWidget *window) { GtkActionGroup *action_group; @@ -395,9 +822,33 @@ create_menus (Eekboard *eekboard, window); #endif - gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); - gtk_ui_manager_add_ui_from_string (ui_manager, ui_description, -1, NULL); - create_layouts_menu (eekboard, ui_manager); + gtk_ui_manager_insert_action_group (eekboard->ui_manager, action_group, 0); + gtk_ui_manager_add_ui_from_string (eekboard->ui_manager, ui_description, -1, NULL); + + eekboard->countries_action_group = gtk_action_group_new ("Countries"); + gtk_ui_manager_insert_action_group (eekboard->ui_manager, + eekboard->countries_action_group, + -1); + + eekboard->languages_action_group = gtk_action_group_new ("Languages"); + gtk_ui_manager_insert_action_group (eekboard->ui_manager, + eekboard->languages_action_group, + -1); + + eekboard->models_action_group = gtk_action_group_new ("Models"); + gtk_ui_manager_insert_action_group (eekboard->ui_manager, + eekboard->models_action_group, + -1); + + eekboard->layouts_action_group = gtk_action_group_new ("Layouts"); + gtk_ui_manager_insert_action_group (eekboard->ui_manager, + eekboard->layouts_action_group, + -1); + + eekboard->options_action_group = gtk_action_group_new ("Options"); + gtk_ui_manager_insert_action_group (eekboard->ui_manager, + eekboard->options_action_group, + -1); } static GtkWidget * @@ -506,6 +957,11 @@ eekboard_new (gboolean use_clutter) g_signal_connect (eekboard->layout, "changed", G_CALLBACK(on_changed), eekboard); + eekboard->ui_manager = gtk_ui_manager_new (); + eekboard->engine = xkl_engine_get_instance (eekboard->display); + eekboard->registry = xkl_config_registry_get_instance (eekboard->engine); + xkl_config_registry_load (eekboard->registry, FALSE); + create_widget (eekboard, CSW, CSH); return eekboard; @@ -518,7 +974,6 @@ main (int argc, char *argv[]) gboolean use_clutter = USE_CLUTTER; Eekboard *eekboard; GtkWidget *widget, *vbox, *menubar, *window; - GtkUIManager *ui_manager; #ifdef ENABLE_NLS bindtextdomain (GETTEXT_PACKAGE, EEKBOARD_LOCALEDIR); @@ -555,9 +1010,8 @@ main (int argc, char *argv[]) g_object_set_data (G_OBJECT(window), "eekboard", eekboard); widget = create_widget (eekboard, CSW, CSH); - ui_manager = gtk_ui_manager_new (); - create_menus (eekboard, window, ui_manager); - menubar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); + create_menus (eekboard, window); + menubar = gtk_ui_manager_get_widget (eekboard->ui_manager, "/MainMenu"); gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0); gtk_container_add (GTK_CONTAINER(vbox), widget);