diff --git a/src/eekboard.c b/src/eekboard.c index c8040f3b..a9d6fc79 100644 --- a/src/eekboard.c +++ b/src/eekboard.c @@ -48,15 +48,48 @@ Window target; EekLayout *layout; EekKeyboard *eek_keyboard; -static void on_monitor_key_event_toggled (GtkToggleAction *action, - GtkWidget *window); - static const GOptionEntry options[] = { {"window-id", '\0', 0, G_OPTION_ARG_STRING, &window_id, "the target window ID; use xwininfo to obtain the value", NULL}, {NULL}, }; +static void on_monitor_key_event_toggled (GtkToggleAction *action, + GtkWidget *window); + +static const char ui_description[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; + +#define SET_LAYOUT_UI_PATH "/MainMenu/KeyboardMenu/SetLayout/LayoutsPH" + +struct _LayoutVariant { + gchar *layout; + gchar *variant; +}; +typedef struct _LayoutVariant LayoutVariant; + +struct _LayoutCallbackData { + GtkUIManager *ui_manager; + GtkActionGroup *action_group; + guint merge_id; +}; +typedef struct _LayoutCallbackData LayoutCallbackData; + static const GtkActionEntry action_entry[] = { {"FileMenu", NULL, N_("_File")}, {"KeyboardMenu", NULL, N_("_Keyboard")}, @@ -82,12 +115,6 @@ on_monitor_key_event_toggled (GtkToggleAction *action, g_object_set (G_OBJECT(window), "can_focus", active, NULL); } -struct _EekBoardLayoutVariant { - gchar *layout; - gchar *variant; -}; -typedef struct _EekBoardLayoutVariant EekBoardLayoutVariant; - static void on_key_pressed (EekKeyboard *keyboard, EekKey *key) @@ -105,7 +132,7 @@ on_key_released (EekKeyboard *keyboard, static void on_activate (GtkAction *action, gpointer user_data) { - EekBoardLayoutVariant *config = user_data; + LayoutVariant *config = user_data; gchar *layouts[2], *variants[2], **vp = NULL; layouts[0] = config->layout; @@ -149,7 +176,8 @@ on_changed (EekLayout *layout, gpointer user_data) gfloat width, height; clutter_actor_get_size (stage, &width, &height); - actor = clutter_container_find_child_by_name (stage, "keyboard"); + actor = clutter_container_find_child_by_name (CLUTTER_CONTAINER(stage), + "keyboard"); /* FIXME: currently keyboard must be finalized before actor. */ g_object_unref (eek_keyboard); @@ -158,68 +186,33 @@ on_changed (EekLayout *layout, gpointer user_data) eek_keyboard = create_keyboard (stage, layout, width, height); } -static const char ui_description[] = - "" - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - ""; - -#define SET_LAYOUT_UI_PATH "/MainMenu/KeyboardMenu/SetLayout/LayoutsPH" - -struct _EekBoardAddLayoutData { - GtkUIManager *ui_manager; - GtkActionGroup *action_group; - guint merge_id; -}; -typedef struct _EekBoardAddLayoutData EekBoardAddLayoutData; - -struct _EekBoardAddVariantData { - gchar *name; - gchar *description; -}; -typedef struct _EekBoardAddVariantData EekBoardAddVariantData; - static void variant_callback (XklConfigRegistry *registry, - XklConfigItem *item, + const XklConfigItem *item, gpointer user_data) { - EekBoardAddVariantData *variant_data; - GSList **head = user_data; + GSList **r_variants = user_data; + XklConfigItem *_item; - variant_data = g_slice_new (EekBoardAddVariantData); - variant_data->name = g_strdup (item->name); - variant_data->description = g_strdup (item->description); - *head = g_slist_prepend (*head, variant_data); + _item = g_slice_dup (XklConfigItem, item); + *r_variants = g_slist_prepend (*r_variants, _item); } static void layout_callback (XklConfigRegistry *registry, - XklConfigItem *item, + const XklConfigItem *item, gpointer user_data) { + LayoutCallbackData *data = user_data; GtkAction *action; - EekBoardAddLayoutData *layout_data = user_data; GSList *variants = NULL; char layout_action_name[128], variant_action_name[128]; - EekBoardLayoutVariant *data; + LayoutVariant *config; g_snprintf (layout_action_name, sizeof (layout_action_name), "SetLayout%s", item->name); action = gtk_action_new (layout_action_name, item->description, NULL, NULL); - gtk_action_group_add_action (layout_data->action_group, action); + gtk_action_group_add_action (data->action_group, action); xkl_config_registry_foreach_layout_variant (registry, item->name, @@ -227,14 +220,13 @@ layout_callback (XklConfigRegistry *registry, &variants); if (!variants) { - data = g_slice_new (EekBoardLayoutVariant); - data->layout = g_strdup (item->name); - data->variant = NULL; - g_signal_connect (action, "activate", G_CALLBACK (on_activate), - data); + config = g_slice_new (LayoutVariant); + config->layout = g_strdup (item->name); + config->variant = NULL; + g_signal_connect (action, "activate", G_CALLBACK (on_activate), config); g_object_unref (action); - gtk_ui_manager_add_ui (layout_data->ui_manager, layout_data->merge_id, + gtk_ui_manager_add_ui (data->ui_manager, data->merge_id, SET_LAYOUT_UI_PATH, layout_action_name, layout_action_name, GTK_UI_MANAGER_MENUITEM, FALSE); @@ -243,8 +235,7 @@ layout_callback (XklConfigRegistry *registry, GSList *head; g_object_unref (action); - gtk_ui_manager_add_ui (layout_data->ui_manager, - layout_data->merge_id, + gtk_ui_manager_add_ui (data->ui_manager, data->merge_id, SET_LAYOUT_UI_PATH, layout_action_name, layout_action_name, GTK_UI_MANAGER_MENU, FALSE); @@ -252,37 +243,57 @@ layout_callback (XklConfigRegistry *registry, SET_LAYOUT_UI_PATH "/%s", layout_action_name); for (head = variants; head; head = head->next) { - EekBoardAddVariantData *variant_data = head->data; + XklConfigItem *_item = head->data; g_snprintf (variant_action_name, sizeof (variant_action_name), - "SetVariant%s%s", item->name, variant_data->name); + "SetVariant%s%s", item->name, _item->name); action = gtk_action_new (variant_action_name, - variant_data->description, + _item->description, NULL, NULL); - data = g_slice_new (EekBoardLayoutVariant); - data->layout = g_strdup (item->name); - data->variant = g_strdup (variant_data->name); + config = g_slice_new (LayoutVariant); + config->layout = g_strdup (item->name); + config->variant = g_strdup (_item->name); g_signal_connect (action, "activate", G_CALLBACK (on_activate), - data); + config); - gtk_action_group_add_action (layout_data->action_group, action); + gtk_action_group_add_action (data->action_group, action); g_object_unref (action); - gtk_ui_manager_add_ui (layout_data->ui_manager, - layout_data->merge_id, + gtk_ui_manager_add_ui (data->ui_manager, data->merge_id, layout_path, variant_action_name, variant_action_name, GTK_UI_MANAGER_MENUITEM, FALSE); - g_free (variant_data->name); - g_free (variant_data->description); - g_slice_free (EekBoardAddVariantData, variant_data); + g_slice_free (XklConfigItem, _item); } g_slist_free (variants); } } +static void +create_layouts_menu (GtkUIManager *ui_manager) +{ + XklEngine *engine; + XklConfigRegistry *registry; + Display *display; + LayoutCallbackData data; + + 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); + + display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); + g_return_if_fail (display); + + engine = xkl_engine_get_instance (display); + registry = xkl_config_registry_get_instance (engine); + xkl_config_registry_load (registry, FALSE); + + xkl_config_registry_foreach_layout (registry, layout_callback, &data); +} + static void create_menus (GtkWidget *window, GtkUIManager * ui_manager) { @@ -293,26 +304,12 @@ create_menus (GtkWidget *window, GtkUIManager * ui_manager) gtk_action_group_add_actions (action_group, action_entry, G_N_ELEMENTS (action_entry), window); gtk_action_group_add_toggle_actions (action_group, toggle_action_entry, - G_N_ELEMENTS (toggle_action_entry), window); + G_N_ELEMENTS (toggle_action_entry), + window); gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); gtk_ui_manager_add_ui_from_string (ui_manager, ui_description, -1, NULL); - - EekBoardAddLayoutData data; - - data.action_group = gtk_action_group_new ("Layouts"); - gtk_ui_manager_insert_action_group (ui_manager, data.action_group, -1); - data.merge_id = gtk_ui_manager_new_merge_id (ui_manager); - - XklEngine *engine; - XklConfigRegistry *registry; - - engine = xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ())); - registry = xkl_config_registry_get_instance (engine); - xkl_config_registry_load (registry, FALSE); - data.ui_manager = ui_manager; - data.action_group = action_group; - xkl_config_registry_foreach_layout (registry, layout_callback, &data); + create_layouts_menu (ui_manager); } static void @@ -365,7 +362,7 @@ main (int argc, char *argv[]) } if (window_id) { if (strncmp (window_id, "0x", 2) == 0) - target = strtol (window_id[2], NULL, 16); + target = strtol (&window_id[2], NULL, 16); else target = strtol (window_id, NULL, 10); } else {