diff options
Diffstat (limited to 'test/matekbd-keyboard-drawing-test.c')
-rw-r--r-- | test/matekbd-keyboard-drawing-test.c | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/test/matekbd-keyboard-drawing-test.c b/test/matekbd-keyboard-drawing-test.c new file mode 100644 index 0000000..c569f09 --- /dev/null +++ b/test/matekbd-keyboard-drawing-test.c @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2006 Sergey V. Udaltsov <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gtk/gtk.h> +#include <stdlib.h> +#include <string.h> +#include <glib.h> +#include "libmatekbd/matekbd-keyboard-drawing.h" + + +static gchar *groups = NULL; +static gchar *levels = NULL; +static gchar *symbols = NULL; +static gchar *keycodes = NULL; +static gchar *geometry = NULL; + +static gboolean track_config = FALSE; +static gboolean track_modifiers = FALSE; +static gboolean program_version = FALSE; + +static const GOptionEntry options[] = { + {"groups", '\0', 0, G_OPTION_ARG_STRING, &groups, + "Keyboard groups to display, from 1-4. Up to four groups only may be " + "displayed. Examples: --groups=3 or --groups=1,2,1,2", + "group1[,group2[,group3[,group4]]]"}, + {"levels", '\0', 0, G_OPTION_ARG_STRING, &levels, + "Keyboard shift levels to display, from 1-64. Up to four shift levels " + "only may be displayed. Examples: --levels=3 or --levels=1,2,1,2", + "level1[,level2[,level3[,level4]]]"}, + {"symbols", '\0', 0, G_OPTION_ARG_STRING, &symbols, + "Symbols component of the keyboard. If you omit this option, it is " + "obtained from the X server; that is, the keyboard that is currently " + "configured is drawn. Examples: --symbols=us or " + "--symbols=us(pc104)+iso9995-3+group(switch)+ctrl(nocaps)", NULL}, + {"keycodes", '\0', 0, G_OPTION_ARG_STRING, &keycodes, + "Keycodes component of the keyboard. If you omit this option, it is " + "obtained from the X server; that is, the keyboard that is currently" + " configured is drawn. Examples: --keycodes=xfree86+aliases(qwerty)", + NULL}, + {"geometry", '\0', 0, G_OPTION_ARG_STRING, &geometry, + "Geometry xkb component. If you omit this option, it is obtained from the" + " X server; that is, the keyboard that is currently configured is drawn. " + "Example: --geometry=kinesis", NULL}, + {"track-modifiers", '\0', 0, G_OPTION_ARG_NONE, &track_modifiers, + "Track the current modifiers", NULL}, + {"track-config", '\0', 0, G_OPTION_ARG_NONE, &track_config, + "Track the server XKB configuration", NULL}, + {"version", '\0', 0, G_OPTION_ARG_NONE, &program_version, + "Show current version", NULL}, + {NULL}, +}; + +static gboolean +set_groups (gchar * groups_option, + MatekbdKeyboardDrawingGroupLevel * groupLevels) +{ + MatekbdKeyboardDrawingGroupLevel *pgl = groupLevels; + gint cntr, g; + + groupLevels[0].group = + groupLevels[1].group = + groupLevels[2].group = groupLevels[3].group = -1; + + if (groups_option == NULL) + return TRUE; + + for (cntr = 4; --cntr >= 0;) { + if (*groups_option == '\0') + return FALSE; + + g = *groups_option - '1'; + if (g < 0 || g >= 4) + return FALSE; + + pgl->group = g; + /* printf ("group %d\n", pgl->group); */ + + groups_option++; + if (*groups_option == '\0') + return TRUE; + if (*groups_option != ',') + return FALSE; + + groups_option++; + pgl++; + } + + return TRUE; +} + +static gboolean +set_levels (gchar * levels_option, + MatekbdKeyboardDrawingGroupLevel * groupLevels) +{ + MatekbdKeyboardDrawingGroupLevel *pgl = groupLevels; + gint cntr, l; + gchar *p; + + groupLevels[0].level = + groupLevels[1].level = + groupLevels[2].level = groupLevels[3].level = -1; + + if (levels_option == NULL) + return TRUE; + + for (cntr = 4; --cntr >= 0;) { + if (*levels_option == '\0') + return FALSE; + + l = (gint) strtol (levels_option, &p, 10) - 1; + if (l < 0 || l >= 64) + return FALSE; + + pgl->level = l; + /* printf ("level %d\n", pgl->level); */ + + levels_option = p; + if (*levels_option == '\0') + return TRUE; + if (*levels_option != ',') + return FALSE; + + levels_option++; + pgl++; + } + + return TRUE; +} + +static void +bad_keycode (MatekbdKeyboardDrawing * drawing, guint keycode) +{ + g_warning + ("got keycode %u, which is not on your keyboard according to your configuration", + keycode); +} + +gint +main (gint argc, gchar ** argv) +{ + GtkWidget *window; + GtkWidget *matekbd_keyboard_drawing; + GdkScreen *screen; + gint monitor; + GdkRectangle rect; + GOptionContext *context; + + MatekbdKeyboardDrawingGroupLevel groupLevels[4] = + { {0, 0}, {1, 0}, {0, 1}, {1, 1} }; + MatekbdKeyboardDrawingGroupLevel *pgroupLevels[4] = + { &groupLevels[0], &groupLevels[1], &groupLevels[2], + &groupLevels[3] + }; + + context = g_option_context_new ("kbdraw"); + g_option_context_add_main_entries (context, options, NULL); + g_option_context_parse (context, &argc, &argv, NULL); + g_option_context_free (context); + + if (program_version) { + g_print ("kbdraw %s\n", VERSION); + exit (0); + } + + gtk_init (&argc, &argv); + + if (!set_groups (groups, groupLevels)) { + g_printerr ("--groups: invalid argument\n"); + exit (1); + } + + if (!set_levels (levels, groupLevels)) { + g_printerr ("--levels: invalid argument\n"); + exit (1); + } + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (G_OBJECT (window), "destroy", + G_CALLBACK (gtk_main_quit), NULL); + + screen = gtk_window_get_screen (GTK_WINDOW (window)); + monitor = gdk_screen_get_monitor_at_point (screen, 0, 0); + gdk_screen_get_monitor_geometry (screen, monitor, &rect); + gtk_window_set_default_size (GTK_WINDOW (window), + rect.width * 4 / 5, + rect.height * 1 / 2); + + gtk_widget_show (window); + + matekbd_keyboard_drawing = matekbd_keyboard_drawing_new (); + gtk_widget_show (matekbd_keyboard_drawing); + gtk_container_add (GTK_CONTAINER (window), matekbd_keyboard_drawing); + + matekbd_keyboard_drawing_set_groups_levels (MATEKBD_KEYBOARD_DRAWING + (matekbd_keyboard_drawing), + pgroupLevels); + + if (track_modifiers) + matekbd_keyboard_drawing_set_track_modifiers + (MATEKBD_KEYBOARD_DRAWING (matekbd_keyboard_drawing), TRUE); + if (track_config) + matekbd_keyboard_drawing_set_track_config + (MATEKBD_KEYBOARD_DRAWING (matekbd_keyboard_drawing), TRUE); + g_signal_connect (G_OBJECT (matekbd_keyboard_drawing), "bad-keycode", + G_CALLBACK (bad_keycode), NULL); + + if (symbols || geometry || keycodes) { + XkbComponentNamesRec names; + gint success; + + memset (&names, '\0', sizeof (names)); + + if (symbols) + names.symbols = symbols; + else + names.symbols = (gchar *) + matekbd_keyboard_drawing_get_symbols + (MATEKBD_KEYBOARD_DRAWING + (matekbd_keyboard_drawing)); + + if (keycodes) + names.keycodes = keycodes; + else + names.keycodes = (gchar *) + matekbd_keyboard_drawing_get_keycodes + (MATEKBD_KEYBOARD_DRAWING + (matekbd_keyboard_drawing)); + + if (geometry) + names.geometry = geometry; + else + names.geometry = (gchar *) + matekbd_keyboard_drawing_get_geometry + (MATEKBD_KEYBOARD_DRAWING + (matekbd_keyboard_drawing)); + + success = + matekbd_keyboard_drawing_set_keyboard + (MATEKBD_KEYBOARD_DRAWING (matekbd_keyboard_drawing), + &names); + if (!success) { + g_printerr + ("\nError loading new keyboard description with components:\n\n" + " keycodes: %s\n" " types: %s\n" + " compat: %s\n" " symbols: %s\n" + " geometry: %s\n\n", names.keycodes, + names.types, names.compat, names.symbols, + names.geometry); + exit (1); + } + } + + gtk_widget_grab_focus (matekbd_keyboard_drawing); + + gtk_main (); + + return 0; +} |