From 0622e2e6ed44114bad64e9fdfd38bcf4ffc248e9 Mon Sep 17 00:00:00 2001 From: "Sergey V. Udaltsov" Date: Sun, 2 Jan 2005 01:59:28 +0000 Subject: [PATCH] a bit of the code cleanup --- .../gnome-keyboard-properties-xkbpv.c | 130 ++++++++++-------- 1 file changed, 70 insertions(+), 60 deletions(-) diff --git a/capplets/keyboard/gnome-keyboard-properties-xkbpv.c b/capplets/keyboard/gnome-keyboard-properties-xkbpv.c index ec32021c4..8ae9a5fae 100644 --- a/capplets/keyboard/gnome-keyboard-properties-xkbpv.c +++ b/capplets/keyboard/gnome-keyboard-properties-xkbpv.c @@ -28,86 +28,96 @@ #include #include +#include "libgswitchit/gswitchit_config.h" + #include "capplet-util.h" #include "gnome-keyboard-properties-xkb.h" #include "libkbdraw/keyboard-drawing.h" -static GtkWidget * previewWindow = NULL; -static gint preview_origin_x = -1; -static gint preview_origin_y = -1; +#define CWID(s) glade_xml_get_widget (chooserDialog, s) + +#ifdef HAVE_X11_EXTENSIONS_XKB_H +#include "X11/XKBlib.h" +/** + * BAD STYLE: Taken from xklavier_private_xkb.h + * Any ideas on architectural improvements are WELCOME + */ +extern Bool _XklXkbConfigPrepareNative( const XklConfigRecPtr data, XkbComponentNamesPtr componentNamesPtr ); +extern void _XklXkbConfigCleanupNative( XkbComponentNamesPtr componentNamesPtr ); +/* */ +#endif static KeyboardDrawingGroupLevel groupsLevels[] = {{0,0},{0,1},{0,2},{0,3}}; static KeyboardDrawingGroupLevel * pGroupsLevels[] = { groupsLevels, groupsLevels+1, groupsLevels+2, groupsLevels+3 }; -static gboolean -click_on_X (GtkWidget *widget, GdkEvent *event, GladeXML *dialog) -{ - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (WID ("enable_preview")), FALSE); - /* stop processing! */ - return TRUE; -} - GtkWidget* -create_preview_widget (GladeXML * dialog) +xkb_layout_preview_create_widget (GladeXML * chooserDialog) { GtkWidget *kbdraw = keyboard_drawing_new (); - //keyboard_drawing_set_track_group (KEYBOARD_DRAWING (kbdraw), TRUE); - //keyboard_drawing_set_track_config (KEYBOARD_DRAWING (kbdraw), TRUE); - - /* show levels 1 and 2 - hoping that no more levels are used */ - //keyboard_drawing_set_levels (KEYBOARD_DRAWING (kbdraw), 0, 1); keyboard_drawing_set_groups_levels (KEYBOARD_DRAWING (kbdraw), pGroupsLevels); return kbdraw; } -static void -init_preview (GladeXML * dialog) -{ - GtkWidget *kbdraw = create_preview_widget (dialog); - GtkWidget *capplet_dialog = glade_xml_get_widget(dialog, "keyboard_dialog"); - - previewWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_destroy_with_parent (GTK_WINDOW (previewWindow), TRUE); - gtk_window_set_type_hint (GTK_WINDOW (previewWindow), GDK_WINDOW_TYPE_HINT_UTILITY); - gtk_window_set_transient_for (GTK_WINDOW(previewWindow), GTK_WINDOW(capplet_dialog)); - - gtk_window_set_skip_pager_hint(GTK_WINDOW (previewWindow), TRUE); - gtk_window_set_skip_taskbar_hint(GTK_WINDOW (previewWindow), TRUE); - - gtk_window_set_resizable(GTK_WINDOW (previewWindow), TRUE); - gtk_window_set_default_size(GTK_WINDOW (previewWindow), 500, 300); - - gtk_window_set_title(GTK_WINDOW (previewWindow), _("Keyboard layout preview")); - - gtk_container_add (GTK_CONTAINER (previewWindow), kbdraw); - - g_signal_connect (G_OBJECT (previewWindow), "delete-event", - G_CALLBACK (click_on_X), dialog); -} - void -preview_toggled (GladeXML * dialog, GtkWidget * button) +xkb_layout_preview_update (GladeXML * chooserDialog) { - gboolean doShow = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); - - if (doShow && previewWindow == NULL) - init_preview (dialog); - - if (doShow) +#ifdef HAVE_X11_EXTENSIONS_XKB_H + GtkWidget *chooser = CWID ( "xkb_layout_chooser"); + GtkWidget *availableLayoutsTree = CWID ("xkb_layouts_available"); + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (availableLayoutsTree)); + GtkTreeIter selectedIter; + GtkTreeModel *model; + GtkWidget *kbdraw = GTK_WIDGET (g_object_get_data (G_OBJECT (chooser), "kbdraw")); + if (kbdraw != NULL && + gtk_tree_selection_get_selected (selection, &model, &selectedIter)) { - gtk_widget_show_all (previewWindow); - if (preview_origin_x >= 0) - gtk_window_move (GTK_WINDOW (previewWindow), - preview_origin_x, preview_origin_y); + gchar *id; + XklConfigRec data; + char **p, *layout, *variant; + int i; + XkbComponentNamesRec componentNames; + + gtk_tree_model_get (model, &selectedIter, AVAIL_LAYOUT_TREE_COL_ID, &id, -1); + XklConfigRecInit (&data); + if (XklConfigGetFromServer (&data)) + { + if( ( p = data.layouts ) != NULL ) + { + for( i = data.numLayouts; --i >= 0; ) + free( *p++ ); + } + + if( ( p = data.variants ) != NULL ) + { + for( i = data.numVariants; --i >= 0; ) + free( *p++ ); + } + data.numLayouts = + data.numVariants = 1; + data.layouts = realloc (data.layouts, sizeof (char*)); + data.variants = realloc (data.variants, sizeof (char*)); + if (GSwitchItKbdConfigSplitItems (id, &layout, &variant) + && variant != NULL) + { + data.layouts[0] = (layout == NULL) ? NULL : strdup (layout); + data.variants[0] = (variant == NULL) ? NULL : strdup (variant); + } else + { + data.layouts[0] = (id == NULL) ? NULL : strdup (id); + data.variants[0] = NULL; + } + if (_XklXkbConfigPrepareNative (&data, &componentNames)) + { + keyboard_drawing_set_keyboard (KEYBOARD_DRAWING (kbdraw), &componentNames); + + _XklXkbConfigCleanupNative( &componentNames ); + } + } + XklConfigRecDestroy (&data); } - else - if (previewWindow != NULL) - { - gtk_window_get_position (GTK_WINDOW (previewWindow), - &preview_origin_x, &preview_origin_y); - gtk_widget_hide_all (previewWindow); - } +#endif }