summaryrefslogtreecommitdiff
path: root/libgnomekbd/gkbd-keyboard-drawing.c
diff options
context:
space:
mode:
authorSergey V. Udaltsov <svu@gnome.org>2011-02-03 18:00:44 +0000
committerSergey V. Udaltsov <svu@gnome.org>2011-02-03 23:14:46 +0000
commit9cefae7f87a9d67c2c3787822f0f529cf6da195b (patch)
treef3e2d891427ba61660ceafd96891f7fe799115e3 /libgnomekbd/gkbd-keyboard-drawing.c
parent0f969b2dc5c5cf95e0e6b8fa4cec86974344d30a (diff)
downloadlibgnomekbd-9cefae7f87a9d67c2c3787822f0f529cf6da195b.tar.gz
Now, gkbd-keyboard-display is able to show layouts
To be used by g-c-c
Diffstat (limited to 'libgnomekbd/gkbd-keyboard-drawing.c')
-rw-r--r--libgnomekbd/gkbd-keyboard-drawing.c185
1 files changed, 139 insertions, 46 deletions
diff --git a/libgnomekbd/gkbd-keyboard-drawing.c b/libgnomekbd/gkbd-keyboard-drawing.c
index dbc812d..4dbe6bf 100644
--- a/libgnomekbd/gkbd-keyboard-drawing.c
+++ b/libgnomekbd/gkbd-keyboard-drawing.c
@@ -48,6 +48,20 @@ enum {
static guint gkbd_keyboard_drawing_signals[NUM_SIGNALS] = { 0 };
+static GkbdKeyboardDrawingGroupLevel defaultGroupsLevels[] = {
+ {0, 1},
+ {0, 3},
+ {0, 0},
+ {0, 2}
+};
+
+static GkbdKeyboardDrawingGroupLevel *pGroupsLevels[] = {
+ defaultGroupsLevels,
+ defaultGroupsLevels + 1,
+ defaultGroupsLevels + 2,
+ defaultGroupsLevels + 3
+};
+
static void gkbd_keyboard_drawing_set_mods (GkbdKeyboardDrawing * drawing,
guint mods);
@@ -2501,57 +2515,32 @@ show_layout_response (GtkWidget * dialog, gint resp)
}
}
-GtkWidget *
-gkbd_keyboard_drawing_new_dialog (gint group, const gchar * group_name)
-{
- static GkbdKeyboardDrawingGroupLevel groupsLevels[] = { {
- 0, 1}, {
- 0,
- 3},
- {
- 0, 0}, {
- 0, 2}
- };
- static GkbdKeyboardDrawingGroupLevel *pGroupsLevels[] = {
- groupsLevels, groupsLevels + 1, groupsLevels + 2,
- groupsLevels + 3
- };
-
- GtkBuilder *builder;
- GtkWidget *dialog, *kbdraw;
- XkbComponentNamesRec component_names;
- XklConfigRec *xkl_data;
- GdkRectangle *rect;
- GError *error = NULL;
+static void
+gkbd_keyboard_drawing_dialog_set_group_name (GtkWidget * dialog,
+ const gchar * group_name)
+{
char title[128] = "";
- XklEngine *engine =
- xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY
- (gdk_display_get_default ()));
-
- builder = gtk_builder_new ();
- gtk_builder_add_from_file (builder, UIDIR "/show-layout.ui",
- &error);
-
- if (error) {
- g_error ("building ui from %s failed: %s",
- UIDIR "/show-layout.ui", error->message);
- g_clear_error (&error);
- }
-
-
- dialog =
- GTK_WIDGET (gtk_builder_get_object
- (builder, "gswitchit_layout_view"));
- kbdraw = gkbd_keyboard_drawing_new ();
-
snprintf (title, sizeof (title), _("Keyboard Layout \"%s\""),
group_name);
gtk_window_set_title (GTK_WINDOW (dialog), title);
g_object_set_data_full (G_OBJECT (dialog), "group_name",
g_strdup (group_name), g_free);
+}
- gkbd_keyboard_drawing_set_groups_levels (GKBD_KEYBOARD_DRAWING
- (kbdraw), pGroupsLevels);
+void
+gkbd_keyboard_drawing_dialog_set_group (GtkWidget * dialog, gint group)
+{
+ GtkWidget *kbdraw;
+ XkbComponentNamesRec component_names;
+ XklConfigRec *xkl_data;
+ XklEngine *engine =
+ xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY
+ (gdk_display_get_default ()));
+ const gchar **names = xkl_engine_get_groups_names (engine);
+ const gchar *group_name = names[group];
+
+ kbdraw = g_object_get_data (G_OBJECT (dialog), "kbdraw");
+ gkbd_keyboard_drawing_dialog_set_group_name (dialog, group_name);
xkl_data = xkl_config_rec_new ();
if (xkl_config_rec_get_from_server (xkl_data, engine)) {
@@ -2594,6 +2583,33 @@ gkbd_keyboard_drawing_new_dialog (gint group, const gchar * group_name)
}
}
g_object_unref (G_OBJECT (xkl_data));
+}
+
+GtkWidget *
+gkbd_keyboard_drawing_dialog_new ()
+{
+ GtkBuilder *builder;
+ GtkWidget *dialog, *kbdraw;
+ GdkRectangle *rect;
+ GError *error = NULL;
+
+ builder = gtk_builder_new ();
+ gtk_builder_add_from_file (builder, UIDIR "/show-layout.ui",
+ &error);
+
+ if (error) {
+ g_error ("building ui from %s failed: %s",
+ UIDIR "/show-layout.ui", error->message);
+ g_clear_error (&error);
+ }
+
+ dialog =
+ GTK_WIDGET (gtk_builder_get_object
+ (builder, "gswitchit_layout_view"));
+ kbdraw = gkbd_keyboard_drawing_new ();
+
+ gkbd_keyboard_drawing_set_groups_levels (GKBD_KEYBOARD_DRAWING
+ (kbdraw), pGroupsLevels);
g_object_set_data (G_OBJECT (dialog), "builderData", builder);
g_signal_connect (G_OBJECT (dialog), "response",
@@ -2619,7 +2635,84 @@ gkbd_keyboard_drawing_new_dialog (gint group, const gchar * group_name)
g_free (rect);
}
- gtk_widget_show_all (dialog);
-
return dialog;
}
+
+void
+gkbd_keyboard_drawing_set_layout (GkbdKeyboardDrawing * drawing,
+ const gchar * id)
+{
+ if (drawing != NULL) {
+ if (id != NULL) {
+ XklConfigRec *data;
+ char **p, *layout, *variant;
+ XkbComponentNamesRec component_names;
+ XklEngine *engine =
+ xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY
+ (gdk_display_get_default
+ ()));
+
+ data = xkl_config_rec_new ();
+ if (xkl_config_rec_get_from_server (data, engine)) {
+ if ((p = data->layouts) != NULL)
+ g_strfreev (data->layouts);
+
+ if ((p = data->variants) != NULL)
+ g_strfreev (data->variants);
+
+ data->layouts = g_new0 (char *, 2);
+ data->variants = g_new0 (char *, 2);
+ if (gkbd_keyboard_config_split_items
+ (id, &layout, &variant)
+ && variant != NULL) {
+ data->layouts[0] =
+ (layout ==
+ NULL) ? NULL :
+ g_strdup (layout);
+ data->variants[0] =
+ (variant ==
+ NULL) ? NULL :
+ g_strdup (variant);
+ } else {
+ data->layouts[0] =
+ (id ==
+ NULL) ? NULL : g_strdup (id);
+ data->variants[0] = NULL;
+ }
+
+ if (xkl_xkb_config_native_prepare
+ (engine, data, &component_names)) {
+ gkbd_keyboard_drawing_set_keyboard
+ (drawing, &component_names);
+
+ xkl_xkb_config_native_cleanup
+ (engine, &component_names);
+ }
+ }
+ g_object_unref (G_OBJECT (data));
+ } else
+ gkbd_keyboard_drawing_set_keyboard (drawing, NULL);
+
+ }
+}
+
+void
+gkbd_keyboard_drawing_dialog_set_layout (GtkWidget * dialog,
+ const gchar * layout)
+{
+ Display *display;
+ Atom atom;
+ const gchar *group_name;
+ GkbdKeyboardDrawing *kbdraw =
+ GKBD_KEYBOARD_DRAWING (g_object_get_data
+ (G_OBJECT (dialog), "kbdraw"));
+
+ if (layout == NULL || layout[0] == 0)
+ return;
+
+ display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
+ gkbd_keyboard_drawing_set_layout (kbdraw, layout);
+ atom = kbdraw->xkb->names->groups[0];
+ group_name = XGetAtomName (display, atom);
+ gkbd_keyboard_drawing_dialog_set_group_name (dialog, group_name);
+}