#! /bin/sh /usr/share/dpatch/dpatch-run ## configurable_num_key_rows.dpatch by Timo Lindfors ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: No description. @DPATCH@ diff -urNad xvkbd-3.0~/resources.h xvkbd-3.0/resources.h --- xvkbd-3.0~/resources.h 2009-01-07 22:44:22.000000000 +0000 +++ xvkbd-3.0/resources.h 2009-01-07 22:44:23.000000000 +0000 @@ -94,6 +94,8 @@ int key_click_pitch; int key_click_duration; int autoclick_delay; + + int num_key_rows; } appres; diff -urNad xvkbd-3.0~/xvkbd.c xvkbd-3.0/xvkbd.c --- xvkbd-3.0~/xvkbd.c 2009-01-07 22:44:23.000000000 +0000 +++ xvkbd-3.0/xvkbd.c 2009-01-07 22:45:02.000000000 +0000 @@ -60,10 +60,10 @@ * Default keyboard layout is hardcoded here. * Layout of the main keyboard can be redefined by resources. */ -#define NUM_KEY_ROWS 6 +#define MAX_NUM_KEY_ROWS 6 #define NUM_KEY_COLS 20 -static char *keys_normal[NUM_KEY_ROWS][NUM_KEY_COLS] = { +static char *keys_normal[MAX_NUM_KEY_ROWS][NUM_KEY_COLS] = { { "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "BackSpace" }, { "Escape", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "\\", "`" }, { "Tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "Delete" }, @@ -72,7 +72,7 @@ { "MainMenu", "Caps_Lock", "Alt_L", "Meta_L", "space", "Meta_R", "Alt_R", "Left", "Right", "Up", "Down", "Focus" }, }; -static char *keys_shift[NUM_KEY_ROWS][NUM_KEY_COLS] = { +static char *keys_shift[MAX_NUM_KEY_ROWS][NUM_KEY_COLS] = { { "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "BackSpace" }, { "Escape", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", "|", "~" }, { "Tab", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "{", "}", "Delete" }, @@ -81,10 +81,10 @@ { "MainMenu", "Caps_Lock", "Alt_L", "Meta_L", "space", "Meta_R", "Alt_R", "Left", "Right", "Up", "Down", "Focus" }, }; -static char *keys_altgr[NUM_KEY_ROWS][NUM_KEY_COLS] = { { NULL } }; -static char *keys_shift_altgr[NUM_KEY_ROWS][NUM_KEY_COLS] = { { NULL } }; +static char *keys_altgr[MAX_NUM_KEY_ROWS][NUM_KEY_COLS] = { { NULL } }; +static char *keys_shift_altgr[MAX_NUM_KEY_ROWS][NUM_KEY_COLS] = { { NULL } }; -static char *key_labels[NUM_KEY_ROWS][NUM_KEY_COLS] = { +static char *key_labels[MAX_NUM_KEY_ROWS][NUM_KEY_COLS] = { { "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "Backspace" }, { "Esc", "!\n1", "@\n2", "#\n3", "$\n4", "%\n5", "^\n6", "&\n7", "*\n8", "(\n9", ")\n0", "_\n-", "+\n=", "|\n\\", "~\n`" }, @@ -94,7 +94,7 @@ { "MainMenu", "Caps\nLock", "Alt", "Meta", "", "Meta", "Alt", "left", "right", "up", "down", "Focus" }, }; -static char *normal_key_labels[NUM_KEY_ROWS][NUM_KEY_COLS] = { +static char *normal_key_labels[MAX_NUM_KEY_ROWS][NUM_KEY_COLS] = { { "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "Backspace" }, { "Esc", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "\\", "`" }, { "Tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "Del" }, @@ -103,7 +103,7 @@ { "MainMenu", "Caps", "Alt", "Meta", "", "Meta", "Alt", "left", "right", "up", "down", "Focus" }, }; -static char *shift_key_labels[NUM_KEY_ROWS][NUM_KEY_COLS] = { +static char *shift_key_labels[MAX_NUM_KEY_ROWS][NUM_KEY_COLS] = { { "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "Backspace" }, { "Esc", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", "|", "~" }, { "Tab", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "{", "}", "Del" }, @@ -112,8 +112,8 @@ { "MainMenu", "Caps", "Alt", "Meta", "", "Meta", "Alt", "left", "right", "up", "down", "Focus" }, }; -static char *altgr_key_labels[NUM_KEY_ROWS][NUM_KEY_COLS] = { { NULL } }; -static char *shift_altgr_key_labels[NUM_KEY_ROWS][NUM_KEY_COLS] = { { NULL } }; +static char *altgr_key_labels[MAX_NUM_KEY_ROWS][NUM_KEY_COLS] = { { NULL } }; +static char *shift_altgr_key_labels[MAX_NUM_KEY_ROWS][NUM_KEY_COLS] = { { NULL } }; #define NUM_KEYPAD_ROWS 5 @@ -365,6 +365,9 @@ Offset(key_click_duration), XtRImmediate, (XtPointer)1 }, { "autoClickDelay", "AutoClickDelay", XtRInt, sizeof(int), Offset(autoclick_delay), XtRImmediate, (XtPointer)500 }, + + { "numKeyRows", "NumKeyRows", XtRInt, sizeof(int), + Offset(num_key_rows), XtRImmediate, (XtPointer)MAX_NUM_KEY_ROWS }, }; #undef Offset @@ -421,7 +424,7 @@ static XtAppContext app_con; static Widget toplevel; -static Widget key_widgets[NUM_KEY_ROWS][NUM_KEY_COLS]; +static Widget key_widgets[MAX_NUM_KEY_ROWS][NUM_KEY_COLS]; static Widget main_menu = None; static Dimension toplevel_height = 1000; @@ -622,6 +625,16 @@ Widget w; int last_altgr_mask; + if (appres.num_key_rows > NUM_KEY_COLS) { + fprintf(stderr, "%s: NumKeyRows too large (%d > %d)\n", PROGRAM_NAME, appres.num_key_rows, MAX_NUM_KEY_ROWS); + exit(1); + } + + if (appres.num_key_rows < 1) { + fprintf(stderr, "%s: NumKeyRows too small (%d < 1)\n", PROGRAM_NAME, appres.num_key_rows); + exit(1); + } + XDisplayKeycodes(target_dpy, &min_keycode, &max_keycode); if (keysym_table != NULL) XFree(keysym_table); keysym_table = XGetKeyboardMapping(target_dpy, @@ -1531,7 +1544,7 @@ if (changed && !appres.keypad_only && (appres.modal_keytop || toplevel_height < appres.modal_threshold)) { first_row = appres.function_key ? 0 : 1; - for (row = first_row; row < NUM_KEY_ROWS; row++) { + for (row = first_row; row < appres.num_key_rows; row++) { for (col = 0; col < NUM_KEY_COLS; col++) { shifted = (shift_state & ShiftMask); if (key_widgets[row][col] != None) { @@ -2243,7 +2256,7 @@ found = TRUE; } else if (w != None) { int first_row = appres.function_key ? 0 : 1; - for (row = first_row; row < NUM_KEY_ROWS; row++) { + for (row = first_row; row < appres.num_key_rows; row++) { for (col = 0; col < NUM_KEY_COLS; col++) { if (key_widgets[row][col] == w) { found = TRUE; @@ -2366,13 +2379,13 @@ * White spaces separate the keys, and " \n" (note that white space * before the \n) separate the rows of keys. */ -static void RedefineKeys(char *array[NUM_KEY_ROWS][NUM_KEY_COLS], const char *spec) +static void RedefineKeys(char *array[MAX_NUM_KEY_ROWS][NUM_KEY_COLS], const char *spec) { char *s = XtNewString(spec); char *cp; int row, col; - for (row = 0; row < NUM_KEY_ROWS; row++) { + for (row = 0; row < appres.num_key_rows; row++) { for (col = 0; col < NUM_KEY_COLS; col++) array[row][col] = NULL; } row = 0; @@ -2385,7 +2398,7 @@ cp = cp + 1; } if (*cp != '\0') { - if (NUM_KEY_ROWS <= row) { + if (appres.num_key_rows <= row) { fprintf(stderr, "%s: too many key rows: \"%s\" ignored\n", PROGRAM_NAME, cp); } else if (NUM_KEY_COLS <= col) { @@ -2613,7 +2626,7 @@ Dimension dwd, max_dwd; int row, col, first_row; char name[50], *label; - Widget key_box[NUM_KEY_ROWS]; + Widget key_box[MAX_NUM_KEY_ROWS]; Widget menu_entry; Cardinal i; @@ -2632,7 +2645,7 @@ key_box[1] = None; first_row = appres.function_key ? 0 : 1; if (!appres.keypad_only) { - for (row = first_row; row < NUM_KEY_ROWS; row++) { + for (row = first_row; row < appres.num_key_rows; row++) { snprintf(name, sizeof(name), "row%d", row); key_box[row] = XtVaCreateManagedWidget(name, formWidgetClass, form, NULL); if (row != first_row) @@ -2744,12 +2757,12 @@ XtVaGetValues(key_box[1], XtNwidth, &max_dwd, NULL); } else { max_dwd = 0; - for (row = first_row; row < NUM_KEY_ROWS; row++) { + for (row = first_row; row < appres.num_key_rows; row++) { XtVaGetValues(key_box[row], XtNwidth, &dwd, NULL); if (max_dwd < dwd) max_dwd = dwd; } } - for (row = first_row; row < NUM_KEY_ROWS; row++) { + for (row = first_row; row < appres.num_key_rows; row++) { XtVaSetValues(key_box[row], XtNwidth, max_dwd, NULL); } }