Sophie

Sophie

distrib > Mandriva > 2010.2 > i586 > by-pkgid > 084001a527a951ba733aff458650a783 > files > 2

xfce-mcs-plugins-4.4.2-10mdv2009.0.src.rpm

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;
 };