diff -urNad xfce-mcs-plugins-4.4.2~/plugins/keyboard_plugin/keyboard_plugin.c xfce-mcs-plugins-4.4.2/plugins/keyboard_plugin/keyboard_plugin.c --- xfce-mcs-plugins-4.4.2~/plugins/keyboard_plugin/keyboard_plugin.c 2007-11-17 20:31:23.000000000 +0100 +++ xfce-mcs-plugins-4.4.2/plugins/keyboard_plugin/keyboard_plugin.c 2008-03-04 05:24:24.000000000 +0100 @@ -57,6 +57,7 @@ #include <libxfcegui4/libxfcegui4.h> #include "shortcuts_plugin.h" +#include "layouts_settings.h" #include "plugins/gtk_common/gtk_common.h" #define PLUGIN_NAME "keyboard" @@ -817,6 +818,17 @@ gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), nth++), label); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); + GtkWidget *test = layouts_plugin_create_dialog(dialog); + gtk_widget_show(test); + gtk_container_add(GTK_CONTAINER(notebook), test); + gtk_container_set_border_width (GTK_CONTAINER (test), 5); + + label = gtk_label_new (_("Layouts")); + gtk_widget_show (label); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook), + gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), nth++), label); + gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); + button = gtk_button_new_from_stock ("gtk-help"); /* gtk_widget_show (button); */ gtk_dialog_add_action_widget (GTK_DIALOG (dialog->dialog_keyboard), button, GTK_RESPONSE_HELP); @@ -902,6 +914,7 @@ g_object_set_data_full (G_OBJECT (mcs_plugin->icon), "mcs-plugin-icon-name", g_strdup ("xfce4-keyboard"), g_free); shortcuts_plugin_init (mcs_plugin); + layouts_plugin_init (mcs_plugin); return MCS_PLUGIN_INIT_OK; } diff -urNad xfce-mcs-plugins-4.4.2~/plugins/keyboard_plugin/layouts_settings.c xfce-mcs-plugins-4.4.2/plugins/keyboard_plugin/layouts_settings.c --- xfce-mcs-plugins-4.4.2~/plugins/keyboard_plugin/layouts_settings.c 1970-01-01 01:00:00.000000000 +0100 +++ xfce-mcs-plugins-4.4.2/plugins/keyboard_plugin/layouts_settings.c 2008-03-04 05:29:54.000000000 +0100 @@ -0,0 +1,638 @@ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_STRING_H +#include <string.h> +#endif + + +#include <stdio.h> + +#include <gtk/gtk.h> +#include <libxklavier/xklavier.h> +#include <libxfce4util/libxfce4util.h> +#include <libxfcegui4/libxfcegui4.h> + +#include "shortcuts_plugin.h" +#include "layouts_settings.h" + +enum +{ + LAYOUTS = 0, + VARIANTS, + TREE_NUM +}; + +enum +{ + AVAIL_LAYOUT_TREE_COL_DESCRIPTION = 0, + AVAIL_LAYOUT_TREE_COL_ID, + NUM +}; + +enum +{ + DESC = 0, + NOM, + COMBO_NUM +}; + +/* Globals */ +static guint max_layouts_nb; +static int use_X_config = 1; +static gchar *model = NULL; +static gchar *layouts = NULL; +static gchar *variants = NULL; +XklEngine *engine; +XklConfigRec *user_config_rec; +XklConfigRec *X_config_rec; +XklConfigRegistry *registry; +GtkTreeIter iter, child; + +/* from the gnome control center keyboard applet */ +char * +xci_desc_to_utf8 (XklConfigItem * ci) +{ + char *sd = g_strstrip (ci->description); + return sd[0] == 0 ? g_strdup (ci->name) : + g_locale_to_utf8 (sd, -1, NULL, NULL, NULL); +} + +static void +add_model_to_list (XklConfigRegistry *config_registry, + XklConfigItem *config_item, + KeyboardMcsDialog *dialog) +{ + GtkTreeModel *store; + GtkTreeIter iter; + + store = gtk_combo_box_get_model (GTK_COMBO_BOX (dialog->combo_kbd_model)); + char *utf_model_name = xci_desc_to_utf8 (config_item); + gtk_list_store_append(GTK_LIST_STORE (store), &iter ); + gtk_list_store_set(GTK_LIST_STORE (store), &iter, + DESC, utf_model_name, + NOM, config_item->name, -1 ); + g_free (utf_model_name); +} + +void +set_combo_default_value (KeyboardMcsDialog *dialog) +{ + gchar *id; + GtkTreeModel *store; + + store = gtk_combo_box_get_model(GTK_COMBO_BOX (dialog->combo_kbd_model)); + gtk_tree_model_get_iter_first (store, &iter); + gtk_tree_model_get (store, &iter, NOM, &id, -1); + if (strcmp (id, model) == 0 ) + gtk_combo_box_set_active_iter (GTK_COMBO_BOX (dialog->combo_kbd_model), &iter); + else + { + while (gtk_tree_model_iter_next (store, &iter)) + { + gtk_tree_model_get (store, &iter, NOM, &id, -1); + + if (strcmp (id, model) == 0) + { + gtk_combo_box_set_active_iter (GTK_COMBO_BOX (dialog->combo_kbd_model), &iter); + break; + } + } + } + + g_free (id); +} + +static void +show_hide_buttons (GtkWidget *widget, gpointer data) +{ + KeyboardMcsDialog *dialog = (KeyboardMcsDialog *) data; + GtkTreePath *p; + GtkTreeViewColumn *c; + + gtk_tree_view_get_cursor (GTK_TREE_VIEW (dialog->treeview_layouts), &p, &c); + if (p != NULL) + gtk_widget_set_sensitive (dialog->btn_edit_layout, TRUE); + else + gtk_widget_set_sensitive (dialog->btn_edit_layout, FALSE); + + int nb = (int) dialog->layouts_nb; + int max_nb = (int) max_layouts_nb; + if (nb < max_nb) + gtk_widget_set_sensitive (dialog->btn_add_layout, TRUE); + else + gtk_widget_set_sensitive (dialog->btn_add_layout, FALSE); + + if (nb > 1) + gtk_widget_set_sensitive (dialog->btn_rm_layout, TRUE); + else + gtk_widget_set_sensitive (dialog->btn_rm_layout, FALSE); +} + +gboolean layouts_plugin_save_settings (McsPlugin * plugin) +{ + gboolean result; + gchar *file, *path; + + path = g_build_filename ("xfce4", RCDIR, RCFILE2, NULL); + file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, path, TRUE); + + result = mcs_manager_save_channel_to_file (plugin->manager, CHANNEL2, file); + g_free (path); + g_free (file); + + return (result); +} + +void +apply_xklavier_config(gboolean force) +{ + if (use_X_config != 1) + { + user_config_rec->model = model; + user_config_rec->layouts = g_strsplit_set(layouts, ",", 0); + user_config_rec->variants = g_strsplit_set(variants, ",", 0); + + xkl_config_rec_activate (user_config_rec, engine); + } else { + if (force) { /* when configuring (not at startup) */ + xkl_config_rec_activate (X_config_rec, engine); + } + } +} + +void +layouts_config_update (KeyboardMcsDialog *dialog) +{ + gchar *new_layouts, *new_variants; + McsPlugin *mcs_plugin = dialog->mcs_plugin; + GtkTreeModel *treemodel; + + treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_layouts)); + gtk_tree_model_get_iter_first (treemodel, &iter); + gtk_tree_model_get (treemodel, &iter, LAYOUTS, &new_layouts, VARIANTS, &new_variants, -1); + layouts = new_layouts; + if (new_variants != NULL) + variants = new_variants; + else + variants = ""; + + while (gtk_tree_model_iter_next (treemodel, &iter)) + { + gtk_tree_model_get (treemodel, &iter, LAYOUTS, &new_layouts, VARIANTS, &new_variants, -1); + layouts = g_strdup(g_strconcat(layouts, ",", new_layouts, NULL)); + if (new_variants != NULL) + variants = g_strdup(g_strconcat(variants, ",", new_variants, NULL)); + else + variants = g_strdup(g_strconcat(variants, ",", NULL)); + } + + treemodel = gtk_combo_box_get_model (GTK_COMBO_BOX (dialog->combo_kbd_model)); + gtk_combo_box_get_active_iter (GTK_COMBO_BOX (dialog->combo_kbd_model), &iter); + gtk_tree_model_get (treemodel, &iter, NOM, &model, -1); + + mcs_manager_set_int(mcs_plugin->manager, "Key/UseX", CHANNEL2, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->chk_use_X))); + mcs_manager_set_string(mcs_plugin->manager, "Key/Layouts", CHANNEL2, layouts); + mcs_manager_set_string(mcs_plugin->manager, "Key/Variants", CHANNEL2, variants); + mcs_manager_set_string(mcs_plugin->manager, "Key/Model", CHANNEL2, model); + mcs_manager_notify (mcs_plugin->manager, CHANNEL2); + + layouts_plugin_save_settings (dialog->mcs_plugin); + + apply_xklavier_config (TRUE); + + g_free(new_layouts); + g_free(new_variants); +} + +static void +check_button_toggled (GtkToggleButton *btn, gpointer data) +{ + KeyboardMcsDialog *dialog = (KeyboardMcsDialog *) data; + + use_X_config = gtk_toggle_button_get_active (btn) ? 1 : 0; + gtk_widget_set_sensitive (GTK_WIDGET (dialog->vbox_layouts), + use_X_config ? FALSE : TRUE); + + layouts_config_update (dialog); +} + +// from the gnome control center keyboard applet +static void +add_variant_to_available_layouts_tree (XklConfigRegistry *registry, + XklConfigItem *config_item, + GtkTreeStore *treestore) +{ + char *utf_variant_name = xci_desc_to_utf8 (config_item); + + gtk_tree_store_append (treestore, &child, &iter); + gtk_tree_store_set (treestore, &child, + AVAIL_LAYOUT_TREE_COL_DESCRIPTION, utf_variant_name, + AVAIL_LAYOUT_TREE_COL_ID, config_item->name, -1); + g_free (utf_variant_name); +} + +static void +add_layout_to_available_layouts_tree (XklConfigRegistry *registry, + XklConfigItem *config_item, + GtkTreeStore *treestore) +{ + char *utf_layout_name = xci_desc_to_utf8 (config_item); + + gtk_tree_store_append (treestore, &iter, NULL); + gtk_tree_store_set (treestore, &iter, + AVAIL_LAYOUT_TREE_COL_DESCRIPTION, utf_layout_name, + AVAIL_LAYOUT_TREE_COL_ID, config_item->name, -1); + g_free (utf_layout_name); + + xkl_config_registry_foreach_layout_variant (registry, config_item->name, + (ConfigItemProcessFunc)add_variant_to_available_layouts_tree, + treestore); +} +// + +gchar * +layout_dialog_run (KeyboardMcsDialog *dialog) +{ + GtkWidget *add_dialog; + GtkTreeStore *treestore; + GtkWidget *tree_view = gtk_tree_view_new (); + GtkCellRenderer *renderer; + GtkWidget *scrolledw; + GtkTreeModel *treemodel; + GtkTreeSelection *selection; + + add_dialog = xfce_titled_dialog_new_with_buttons(_("Add layout"), + NULL, + GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, + GTK_RESPONSE_OK, + NULL); + + treestore = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_STRING); + + xkl_config_registry_foreach_layout (registry, (ConfigItemProcessFunc) + add_layout_to_available_layouts_tree, treestore); + + renderer = gtk_cell_renderer_text_new (); + + GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes (NULL, + renderer, + "text", + AVAIL_LAYOUT_TREE_COL_DESCRIPTION, + NULL); + + gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), + GTK_TREE_MODEL (treestore)); + gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (treestore), + 0, GTK_SORT_ASCENDING); + + scrolledw = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (add_dialog)->vbox), scrolledw); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_widget_show (scrolledw); + + gtk_container_add (GTK_CONTAINER (scrolledw), tree_view); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE); + gtk_widget_show (GTK_WIDGET (tree_view)); + + gtk_window_set_default_size(GTK_WINDOW (add_dialog), 400, 400); + gtk_widget_show (add_dialog); + + int response = gtk_dialog_run (GTK_DIALOG (add_dialog)); + + if (response == GTK_RESPONSE_OK) + { + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); + gchar *id; + gchar *strings[2]; + + gtk_tree_selection_get_selected (selection, &treemodel, &iter); + gtk_tree_model_get (treemodel, &iter, AVAIL_LAYOUT_TREE_COL_ID, &id, -1); + + GtkTreePath *path = gtk_tree_model_get_path (treemodel, &iter); + if (gtk_tree_path_get_depth (path) == 1) + { + strings[0] = id; + strings[1] = ""; + } + else + { + strings[1] = id; + gtk_tree_path_up(path); + gtk_tree_model_get_iter(treemodel, &iter, path); + gtk_tree_model_get (treemodel, &iter, AVAIL_LAYOUT_TREE_COL_ID, &id, -1); + strings[0] = id; + } + gtk_tree_path_free (path); + + gtk_widget_destroy (add_dialog); + return g_strconcat(strings[0], ",", strings[1], NULL); + } + gtk_widget_destroy (add_dialog); + return NULL; +} + +static void +edit_layout (GtkWidget *widget, gpointer data) +{ + KeyboardMcsDialog *dialog = (KeyboardMcsDialog *) data; + gchar *c; + c = layout_dialog_run(dialog); + if (c != NULL) + { + GtkTreeModel *treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_layouts)); + GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->treeview_layouts)); + gchar **strings; + strings = g_strsplit_set(c, ",", 0); + + gtk_tree_selection_get_selected (selection, &treemodel, &iter); + gtk_list_store_set (GTK_LIST_STORE (treemodel), &iter, + LAYOUTS, strings[0], + VARIANTS, strings[1], + -1); + g_free(strings); + } + g_free(c); + layouts_config_update (dialog); + show_hide_buttons (NULL, (gpointer) dialog); +} + +static void +add_layout (GtkWidget *widget, gpointer data) +{ + KeyboardMcsDialog *dialog = (KeyboardMcsDialog *) data; + gchar *c; + c = layout_dialog_run(dialog); + if (c != NULL) + { + GtkTreeModel *treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_layouts)); + gchar **strings; + strings = g_strsplit_set(c, ",", 0); + gtk_list_store_append (GTK_LIST_STORE (treemodel), &iter); + gtk_list_store_set (GTK_LIST_STORE (treemodel), &iter, + LAYOUTS, strings[0], + VARIANTS, strings[1], + -1); + dialog->layouts_nb += 1; + show_hide_buttons (NULL, (gpointer) dialog); + g_free (strings); + } + g_free (c); + layouts_config_update (dialog); + show_hide_buttons (NULL, (gpointer) dialog); +} + +static void +rm_layout (GtkWidget *widget, gpointer data) +{ + KeyboardMcsDialog *dialog = (KeyboardMcsDialog *) data; + GtkTreeModel *treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_layouts)); + GtkTreeSelection *selection = gtk_tree_view_get_selection ( + GTK_TREE_VIEW (dialog->treeview_layouts)); + + if (gtk_tree_selection_get_selected(selection, &treemodel, &iter)) + { + gtk_list_store_remove(GTK_LIST_STORE (treemodel), &iter); + dialog->layouts_nb -= 1; + show_hide_buttons (NULL, (gpointer) dialog); + } + + layouts_config_update (dialog); +} + +static void +model_changed (GtkWidget *combo, gpointer data) +{ + layouts_config_update ((KeyboardMcsDialog *) data); +} + +static void +set_layouts_dialog (KeyboardMcsDialog *dialog) +{ + GtkCellRenderer *renderer; + GtkListStore *store; + gchar **layoutsv; + gchar **variantsv; + + /* Layouts tree view */ + dialog->layouts_nb = 0; + + layoutsv = g_strsplit (layouts, ",", 0); + variantsv = g_strsplit (variants, ",", 0); + + store = gtk_list_store_new (TREE_NUM, G_TYPE_STRING, G_TYPE_STRING); + while (layoutsv[dialog->layouts_nb] != NULL) + { + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + LAYOUTS, layoutsv[dialog->layouts_nb ], + VARIANTS, variantsv[dialog->layouts_nb ], + -1); + dialog->layouts_nb += 1; + } + + gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->treeview_layouts), + GTK_TREE_MODEL (store)); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (dialog->treeview_layouts), + -1, + "Layout", + renderer, + "text", LAYOUTS, + NULL); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (dialog->treeview_layouts), + -1, + "Variant", + renderer, + "text", VARIANTS, + NULL); + + /* use X check button */ + if (use_X_config == 1) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->chk_use_X), TRUE); + gtk_widget_set_sensitive (dialog->vbox_layouts, FALSE); + } + + /* model combo */ + store = gtk_list_store_new (COMBO_NUM, G_TYPE_STRING, G_TYPE_STRING); + gtk_combo_box_set_model(GTK_COMBO_BOX (dialog->combo_kbd_model), + GTK_TREE_MODEL (store)); + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (dialog->combo_kbd_model), renderer, TRUE); + gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (dialog->combo_kbd_model), renderer, "text", 0); + xkl_config_registry_foreach_model (registry, + (ConfigItemProcessFunc) add_model_to_list, + dialog); + set_combo_default_value (dialog); + + /* Add/Remove buttons sensitivity */ + show_hide_buttons (NULL, (gpointer) dialog); + + /* signals */ + g_signal_connect (G_OBJECT (dialog->chk_use_X), "toggled", + G_CALLBACK (check_button_toggled), (gpointer) dialog); + g_signal_connect (G_OBJECT (dialog->btn_add_layout), "clicked", + G_CALLBACK (add_layout), (gpointer) dialog); + g_signal_connect (G_OBJECT (dialog->btn_edit_layout), "clicked", + G_CALLBACK (edit_layout), (gpointer) dialog); + g_signal_connect (G_OBJECT (dialog->btn_rm_layout), "clicked", + G_CALLBACK (rm_layout), (gpointer) dialog); + g_signal_connect (G_OBJECT (dialog->treeview_layouts), "cursor-changed", + G_CALLBACK (show_hide_buttons), (gpointer) dialog); + g_signal_connect (G_OBJECT (dialog->combo_kbd_model), "changed", + G_CALLBACK (model_changed), (gpointer) dialog); + + g_strfreev (variantsv); + g_strfreev (layoutsv); +} + +GtkWidget * +layouts_plugin_create_dialog (KeyboardMcsDialog *dialog) +{ + GtkWidget *vbox1, *vbox2, *frame, *hbox; + + vbox1 = gtk_vbox_new (FALSE, 5); + gtk_widget_show (vbox1); + + dialog->chk_use_X= gtk_check_button_new_with_label (_("Use X configuration")); + gtk_box_pack_start (GTK_BOX (vbox1), dialog->chk_use_X, FALSE, FALSE, 0); + gtk_widget_show (dialog->chk_use_X); + + dialog->vbox_layouts = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox1), dialog->vbox_layouts, FALSE, FALSE, 0); + gtk_widget_show (dialog->vbox_layouts); + + dialog->combo_kbd_model = gtk_combo_box_new (); + gtk_widget_set_size_request (dialog->combo_kbd_model, 230, -1); + gtk_widget_show (dialog->combo_kbd_model); + + frame = xfce_create_framebox_with_content (_("Keyboard model:"), dialog->combo_kbd_model); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (dialog->vbox_layouts), frame, TRUE, TRUE, 5); + + hbox = gtk_hbox_new (FALSE, 5); + gtk_widget_show (hbox); + + frame = xfce_create_framebox_with_content (_("Keyboard layouts:"), hbox); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (dialog->vbox_layouts), frame, TRUE, TRUE, 5); + + dialog->treeview_layouts = gtk_tree_view_new (); + gtk_widget_show (dialog->treeview_layouts); + gtk_box_pack_start (GTK_BOX (hbox), dialog->treeview_layouts, TRUE, TRUE, 5); + gtk_widget_set_size_request (dialog->treeview_layouts, -1, 112); + + vbox2 = gtk_vbox_new (FALSE, 5); + gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5); + gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5); + gtk_widget_show (vbox2); + + dialog->btn_add_layout = gtk_button_new_from_stock (GTK_STOCK_ADD); + gtk_box_pack_start (GTK_BOX (vbox2), dialog->btn_add_layout, FALSE, FALSE, 0); + gtk_widget_show (dialog->btn_add_layout); + + dialog->btn_edit_layout = gtk_button_new_from_stock (GTK_STOCK_EDIT); + gtk_box_pack_start (GTK_BOX (vbox2), dialog->btn_edit_layout, FALSE, FALSE, 0); + gtk_widget_show (dialog->btn_edit_layout); + + dialog->btn_rm_layout = gtk_button_new_from_stock (GTK_STOCK_DELETE); + gtk_box_pack_start (GTK_BOX (vbox2), dialog->btn_rm_layout, FALSE, FALSE, 0); + gtk_widget_show (dialog->btn_rm_layout); + + set_layouts_dialog (dialog); + + return vbox1; +} + +XklConfigRec * +xklavier_init() +{ + Display *dsp; + + dsp = XOpenDisplay(NULL); + g_type_init(); + engine = xkl_engine_get_instance (dsp); + + user_config_rec = xkl_config_rec_new (); + xkl_config_rec_get_from_server (user_config_rec, engine); + + /* store X config */ + X_config_rec = xkl_config_rec_new (); + xkl_config_rec_get_from_server (X_config_rec, engine); + + max_layouts_nb = xkl_engine_get_max_num_groups (engine); + + registry = xkl_config_registry_get_instance (engine); + xkl_config_registry_load (registry); + + layouts = g_strdup(g_strjoinv(",", user_config_rec->layouts)); + variants = g_strdup(g_strjoinv(",", user_config_rec->variants)); + model = g_strdup(user_config_rec->model); + + return user_config_rec; +} + +void +layouts_plugin_init (McsPlugin *mcs_plugin) +{ + McsSetting *setting; + + user_config_rec = xklavier_init(); + + setting = mcs_manager_setting_lookup (mcs_plugin->manager, "Key/UseX", CHANNEL2); + if(setting) + { + use_X_config = (setting->data.v_int); + } + else + { + use_X_config = 1; + mcs_manager_set_int (mcs_plugin->manager, "Key/UseX", CHANNEL2, use_X_config); + } + + setting = mcs_manager_setting_lookup (mcs_plugin->manager, "Key/Layouts", CHANNEL2); + if(setting) + { + layouts = (setting->data.v_string); + } + else + { + mcs_manager_set_string (mcs_plugin->manager, "Key/Layouts", CHANNEL2, layouts); + } + + setting = mcs_manager_setting_lookup (mcs_plugin->manager, "Key/Variants", CHANNEL2); + if(setting) + { + variants = (setting->data.v_string); + } + else + { + mcs_manager_set_string (mcs_plugin->manager, "Key/Variants", CHANNEL2, variants); + } + + setting = mcs_manager_setting_lookup (mcs_plugin->manager, "Key/Model", CHANNEL2); + if(setting) + { + model = (setting->data.v_string); + } + else + { + mcs_manager_set_string (mcs_plugin->manager, "Key/Model", CHANNEL2, model); + } + + apply_xklavier_config (FALSE); +} diff -urNad xfce-mcs-plugins-4.4.2~/plugins/keyboard_plugin/layouts_settings.h xfce-mcs-plugins-4.4.2/plugins/keyboard_plugin/layouts_settings.h --- xfce-mcs-plugins-4.4.2~/plugins/keyboard_plugin/layouts_settings.h 1970-01-01 01:00:00.000000000 +0100 +++ xfce-mcs-plugins-4.4.2/plugins/keyboard_plugin/layouts_settings.h 2008-03-04 05:24:24.000000000 +0100 @@ -0,0 +1,3 @@ + +void layouts_plugin_init (McsPlugin *); +GtkWidget *layouts_plugin_create_dialog (KeyboardMcsDialog *); diff -urNad xfce-mcs-plugins-4.4.2~/plugins/keyboard_plugin/shortcuts_plugin.h xfce-mcs-plugins-4.4.2/plugins/keyboard_plugin/shortcuts_plugin.h --- xfce-mcs-plugins-4.4.2~/plugins/keyboard_plugin/shortcuts_plugin.h 2007-11-17 20:31:23.000000000 +0100 +++ xfce-mcs-plugins-4.4.2/plugins/keyboard_plugin/shortcuts_plugin.h 2008-03-04 05:24:24.000000000 +0100 @@ -26,6 +26,7 @@ McsPlugin *mcs_plugin; gboolean theme_modified; + guint layouts_nb; GtkWidget *checkbutton_blink; GtkWidget *checkbutton_repeat; @@ -62,6 +63,14 @@ GtkWidget *menuitem_popup_add_shortcut; GtkWidget *menuitem_popup_del_shortcut; + GtkWidget *vbox_layouts; + GtkWidget *combo_kbd_model; + GtkWidget *treeview_layouts; + GtkWidget *btn_add_layout; + GtkWidget *btn_edit_layout; + GtkWidget *btn_rm_layout; + GtkWidget *chk_use_X; + GtkWidget *button_close; GtkWidget *button_help; };