diff --git a/clients/keyboard.c b/clients/keyboard.c index fed5f0c51a3af7ad5a788a18411a8fa2a3e32aab..82c7b85202583174aff416d3ce72870d7e91b259 100644 --- a/clients/keyboard.c +++ b/clients/keyboard.c @@ -86,11 +86,21 @@ struct virtual_keyboard { struct text_input_state pending; struct text_input_state current; - char *preferred_language; // FIXME: fetch from system settings or take from user + char *preferred_layout; uint32_t buttons_held; }; +/// Modifiers passed to the virtual_keyboard protocol. +/// They are based on wayland's wl_keyboard, which doesn't document them. +enum key_modifier_type { + modifier_none = 0, + modifier_shift = 1, + modifier_capslock = 2, + modifier_ctrl = 4, + modifier_altgr = 128, +}; + enum key_type { keytype_default, keytype_backspace, @@ -112,6 +122,7 @@ struct key { char *label; char *uppercase; char *symbol; + char *symbol_upper; unsigned keycode; unsigned int width; @@ -121,163 +132,234 @@ struct layout { const struct key *keys; uint32_t count; + const char *keymap_str; + uint32_t columns; uint32_t rows; const char *language; - uint32_t text_direction; + + bool has_symbol_upper; }; static const struct key normal_keys[] = { - { keytype_default, "q", "Q", "1", KEY_Q, 1}, - { keytype_default, "w", "W", "2", KEY_W, 1}, - { keytype_default, "e", "E", "3", KEY_E, 1}, - { keytype_default, "r", "R", "4", KEY_R, 1}, - { keytype_default, "t", "T", "5", KEY_T, 1}, - { keytype_default, "y", "Y", "6", KEY_Y, 1}, - { keytype_default, "u", "U", "7", KEY_U, 1}, - { keytype_default, "i", "I", "8", KEY_I, 1}, - { keytype_default, "o", "O", "9", KEY_O, 1}, - { keytype_default, "p", "P", "0", KEY_P, 1}, - { keytype_backspace, "⌫", "⌫", "⌫", 0, 2}, - - { keytype_tab, "⇥", "⇥", "⇥", 0, 1}, - { keytype_default, "a", "A", "-", KEY_A, 1}, - { keytype_default, "s", "S", "@", KEY_S, 1}, - { keytype_default, "d", "D", "*", KEY_D, 1}, - { keytype_default, "f", "F", "^", KEY_F, 1}, - { keytype_default, "g", "G", ":", KEY_G, 1}, - { keytype_default, "h", "H", ";", KEY_H, 1}, - { keytype_default, "j", "J", "(", KEY_J, 1}, - { keytype_default, "k", "K", ")", KEY_K, 1}, - { keytype_default, "l", "L", "~", KEY_L, 1}, - { keytype_enter, "↵", "↵", "↵", 0, 2}, - - { keytype_caps, "ABC", "abc", "ABC", 0, 2}, - { keytype_default, "z", "Z", "/", KEY_Z, 1}, - { keytype_default, "x", "X", "\'", KEY_X, 1}, - { keytype_default, "c", "C", "\"", KEY_C, 1}, - { keytype_default, "v", "V", "+", KEY_V, 1}, - { keytype_default, "b", "B", "=", KEY_B, 1}, - { keytype_default, "n", "N", "?", KEY_N, 1}, - { keytype_default, "m", "M", "!", KEY_M, 1}, - { keytype_default, ",", ",", "\\", KEY_COMMA, 1}, - { keytype_default, ".", ".", "|", KEY_DOT, 1}, - { keytype_caps, "ABC", "abc", "ABC", 0, 1}, - - { keytype_altgr, "?123", "?123", "abc", 0, 1}, - { keytype_space, "", "", "", 0, 5}, - { keytype_arrow_up, "↑", "↑", "↑", 0, 1}, - { keytype_arrow_left, "←", "←", "←", 0, 1}, - { keytype_arrow_right, "→", "→", "→", 0, 1}, - { keytype_arrow_down, "↓", "↓", "↓", 0, 1}, - { keytype_ctrl, "Ctrl", "Ctrl", "Ctrl", 0, 2} + { keytype_default, "q", "Q", "1", NULL, KEY_Q, 1}, + { keytype_default, "w", "W", "2", NULL, KEY_W, 1}, + { keytype_default, "e", "E", "3", NULL, KEY_E, 1}, + { keytype_default, "r", "R", "4", NULL, KEY_R, 1}, + { keytype_default, "t", "T", "5", NULL, KEY_T, 1}, + { keytype_default, "y", "Y", "6", NULL, KEY_Y, 1}, + { keytype_default, "u", "U", "7", NULL, KEY_U, 1}, + { keytype_default, "i", "I", "8", NULL, KEY_I, 1}, + { keytype_default, "o", "O", "9", NULL, KEY_O, 1}, + { keytype_default, "p", "P", "0", NULL, KEY_P, 1}, + { keytype_backspace, "⌫", "⌫", "⌫", NULL, 0, 2}, + + { keytype_tab, "⇥", "⇥", "⇥", NULL, 0, 1}, + { keytype_default, "a", "A", "-", NULL, KEY_A, 1}, + { keytype_default, "s", "S", "@", NULL, KEY_S, 1}, + { keytype_default, "d", "D", "*", NULL, KEY_D, 1}, + { keytype_default, "f", "F", "^", NULL, KEY_F, 1}, + { keytype_default, "g", "G", ":", NULL, KEY_G, 1}, + { keytype_default, "h", "H", ";", NULL, KEY_H, 1}, + { keytype_default, "j", "J", "(", NULL, KEY_J, 1}, + { keytype_default, "k", "K", ")", NULL, KEY_K, 1}, + { keytype_default, "l", "L", "~", NULL, KEY_L, 1}, + { keytype_enter, "↵", "↵", "↵", NULL, 0, 2}, + + { keytype_caps, "ABC", "abc", "ABC", NULL, 0, 2}, + { keytype_default, "z", "Z", "/", NULL, KEY_Z, 1}, + { keytype_default, "x", "X", "\'", NULL, KEY_X, 1}, + { keytype_default, "c", "C", "\"", NULL, KEY_C, 1}, + { keytype_default, "v", "V", "+", NULL, KEY_V, 1}, + { keytype_default, "b", "B", "=", NULL, KEY_B, 1}, + { keytype_default, "n", "N", "?", NULL, KEY_N, 1}, + { keytype_default, "m", "M", "!", NULL, KEY_M, 1}, + { keytype_default, ",", ",", "\\", NULL, KEY_COMMA, 1}, + { keytype_default, ".", ".", "|", NULL, KEY_DOT, 1}, + { keytype_caps, "ABC", "abc", "ABC", NULL, 0, 1}, + + { keytype_altgr, "?123", "?123", "abc", NULL, 0, 1}, + { keytype_space, "", "", "", NULL, 0, 5}, + { keytype_arrow_up, "↑", "↑", "↑", NULL, 0, 1}, + { keytype_arrow_left, "←", "←", "←", NULL, 0, 1}, + { keytype_arrow_right, "→", "→", "→", NULL, 0, 1}, + { keytype_arrow_down, "↓", "↓", "↓", NULL, 0, 1}, + { keytype_ctrl, "Ctrl", "Ctrl", "Ctrl", NULL, 0, 2} +}; + +static const struct key polish_keys[] = { + { keytype_default, "q", "Q", "1", "~", KEY_Q, 1}, + { keytype_default, "w", "W", "2", "+", KEY_W, 1}, + { keytype_default, "e", "E", "3", "-", KEY_E, 1}, + { keytype_default, "r", "R", "4", "=", KEY_R, 1}, + { keytype_default, "t", "T", "5", "%", KEY_T, 1}, + { keytype_default, "y", "Y", "6", "^", KEY_Y, 1}, + { keytype_default, "u", "U", "7", "&", KEY_U, 1}, + { keytype_default, "i", "I", "8", "*", KEY_I, 1}, + { keytype_default, "o", "O", "9", "[", KEY_O, 1}, + { keytype_default, "p", "P", "0", "]", KEY_P, 1}, + { keytype_backspace, "⌫", "⌫", "⌫", NULL, 0, 2}, + + { keytype_tab, "⇥", "⇥", "⇥", NULL, 0, 1}, + { keytype_default, "a", "A", "ą", "Ą", KEY_A, 1}, + { keytype_default, "s", "S", "ś", "Ś", KEY_S, 1}, + { keytype_default, "d", "D", "ę", "Ę", KEY_D, 1}, + { keytype_default, "f", "F", ":", "_", KEY_F, 1}, + { keytype_default, "g", "G", ";", "'", KEY_G, 1}, + { keytype_default, "h", "H", "(", "{", KEY_H, 1}, + { keytype_default, "j", "J", ")", "}", KEY_J, 1}, + { keytype_default, "k", "K", "ó", "Ó", KEY_K, 1}, + { keytype_default, "l", "L", "ł", "Ł", KEY_L, 1}, + { keytype_enter, "↵", "↵", "↵", NULL, 0, 2}, + + { keytype_caps, "ABC", "abc", "abc", NULL, 0, 2}, + { keytype_default, "z", "Z", "ż", "Ż", KEY_Z, 1}, + { keytype_default, "x", "X", "ź", "Ź", KEY_X, 1}, + { keytype_default, "c", "C", "ć", "Ć", KEY_C, 1}, + { keytype_default, "v", "V", "–", "$", KEY_V, 1}, + { keytype_default, "b", "B", "?", "€", KEY_B, 1}, + { keytype_default, "n", "N", "!", "#", KEY_N, 1}, + { keytype_default, "m", "M", "„", "»", KEY_M, 1}, + { keytype_default, ",", ",", "”", "«", KEY_COMMA, 1}, + { keytype_default, ".", ".", "@", "…", KEY_DOT, 1}, + { keytype_caps, "ABC", "abc", "abc", NULL, 0, 1}, + + { keytype_altgr, "ą7?", "ą7?", "Ą%^", "ą7?", 0, 1}, + { keytype_space, "", "", "", NULL, 0, 5}, + { keytype_arrow_up, "↑", "↑", "↑", NULL, 0, 1}, + { keytype_arrow_left, "←", "←", "←", NULL, 0, 1}, + { keytype_arrow_right, "→", "→", "→", NULL, 0, 1}, + { keytype_arrow_down, "↓", "↓", "↓", NULL, 0, 1}, + { keytype_ctrl, "Ctrl", "Ctrl", "Ctrl", NULL, 0, 2} }; static const struct key numeric_keys[] = { - { keytype_default, "1", "1", "1", 0, 1}, - { keytype_default, "2", "2", "2", 0, 1}, - { keytype_default, "3", "3", "3", 0, 1}, - { keytype_default, "4", "4", "4", 0, 1}, - { keytype_default, "5", "5", "5", 0, 1}, - { keytype_default, "6", "6", "6", 0, 1}, - { keytype_default, "7", "7", "7", 0, 1}, - { keytype_default, "8", "8", "8", 0, 1}, - { keytype_default, "9", "9", "9", 0, 1}, - { keytype_default, "0", "0", "0", 0, 1}, - { keytype_backspace, "<--", "<--", "<--", 0, 2}, - - { keytype_space, "", "", "", 0, 4}, - { keytype_enter, "Enter", "Enter", "Enter", 0, 2}, - { keytype_arrow_up, "/\\", "/\\", "/\\", 0, 1}, - { keytype_arrow_left, "<", "<", "<", 0, 1}, - { keytype_arrow_right, ">", ">", ">", 0, 1}, - { keytype_arrow_down, "\\/", "\\/", "\\/", 0, 1}, - //{ keytype_style, "", "", "", 0, 2} + { keytype_default, "1", "1", "1", NULL, 0, 1}, + { keytype_default, "2", "2", "2", NULL, 0, 1}, + { keytype_default, "3", "3", "3", NULL, 0, 1}, + { keytype_default, "4", "4", "4", NULL, 0, 1}, + { keytype_default, "5", "5", "5", NULL, 0, 1}, + { keytype_default, "6", "6", "6", NULL, 0, 1}, + { keytype_default, "7", "7", "7", NULL, 0, 1}, + { keytype_default, "8", "8", "8", NULL, 0, 1}, + { keytype_default, "9", "9", "9", NULL, 0, 1}, + { keytype_default, "0", "0", "0", NULL, 0, 1}, + { keytype_backspace, "<--", "<--", "<--", NULL, 0, 2}, + + { keytype_space, "", "", "", NULL, 0, 4}, + { keytype_enter, "Enter", "Enter", "Enter", NULL, 0, 2}, + { keytype_arrow_up, "/\\", "/\\", "/\\", NULL, 0, 1}, + { keytype_arrow_left, "<", "<", "<", NULL, 0, 1}, + { keytype_arrow_right, ">", ">", ">", NULL, 0, 1}, + { keytype_arrow_down, "\\/", "\\/", "\\/", NULL, 0, 1}, }; static const struct key arabic_keys[] = { - { keytype_default, "ض", "ﹶ", "۱",0, 1}, - { keytype_default, "ص", "ﹰ", "۲",0, 1}, - { keytype_default, "ث", "ﹸ", "۳",0, 1}, - { keytype_default, "ق", "ﹲ", "۴",0, 1}, - { keytype_default, "ف", "ﻹ", "۵",0, 1}, - { keytype_default, "غ", "ﺇ", "۶",0, 1}, - { keytype_default, "ع", "`", "۷",0, 1}, - { keytype_default, "ه", "٪", "۸",0, 1}, - { keytype_default, "خ", ">", "۹",0, 1}, - { keytype_default, "ح", "<", "۰",0, 1}, - { keytype_backspace, "-->", "-->", "-->", 0, 2}, - - { keytype_tab, "->|", "->|", "->|", 0, 1}, - { keytype_default, "ش", "ﹺ", "ﹼ",0, 1}, - { keytype_default, "س", "ﹴ", "!",0, 1}, - { keytype_default, "ي", "[", "@",0, 1}, - { keytype_default, "ب", "]", "#",0, 1}, - { keytype_default, "ل", "ﻷ", "$",0, 1}, - { keytype_default, "ا", "أ", "%",0, 1}, - { keytype_default, "ت", "-", "^",0, 1}, - { keytype_default, "ن", "x", "&", 0, 1}, - { keytype_default, "م", "/", "*",0, 1}, - { keytype_default, "ك", ":", "_",0, 1}, - { keytype_default, "د", "\"", "+",0, 1}, - { keytype_enter, "Enter", "Enter", "Enter", 0, 2}, - - { keytype_caps, "Shift", "Base", "Shift", 0, 2}, - { keytype_default, "ئ", "~", ")",0, 1}, - { keytype_default, "ء", "°", "(",0, 1}, - { keytype_default, "ؤ", "{", "\"",0, 1}, - { keytype_default, "ر", "}", "\'",0, 1}, - { keytype_default, "ى", "ﺁ", "؟",0, 1}, - { keytype_default, "ة", "'", "!",0, 1}, - { keytype_default, "و", ",", ";",0, 1}, - { keytype_default, "ﺯ", ".", "\\",0, 1}, - { keytype_default, "ظ", "؟", "=",0, 1}, - { keytype_caps, "Shift", "Base", "Shift", 0, 2}, - - { keytype_altgr, "؟٣٢١", "؟٣٢١", "Base", 0, 1}, - { keytype_default, "ﻻ", "ﻵ", "|",0, 1}, - { keytype_default, ",", "،", "،", 0, 1}, - { keytype_space, "", "", "", 0, 6}, - { keytype_default, ".", "ذ", "]",0, 1}, - { keytype_default, "ط", "ﺝ", "[",0, 1}, - //{ keytype_style, "", "", "", 0, 2} + { keytype_default, "ض", "ﹶ", "۱", NULL, 0, 1}, + { keytype_default, "ص", "ﹰ", "۲", NULL, 0, 1}, + { keytype_default, "ث", "ﹸ", "۳", NULL, 0, 1}, + { keytype_default, "ق", "ﹲ", "۴", NULL, 0, 1}, + { keytype_default, "ف", "ﻹ", "۵", NULL, 0, 1}, + { keytype_default, "غ", "ﺇ", "۶", NULL, 0, 1}, + { keytype_default, "ع", "`", "۷", NULL, 0, 1}, + { keytype_default, "ه", "٪", "۸", NULL, 0, 1}, + { keytype_default, "خ", ">", "۹", NULL, 0, 1}, + { keytype_default, "ح", "<", "۰", NULL, 0, 1}, + { keytype_backspace, "-->", "-->", "-->", NULL, 0, 2}, + + { keytype_tab, "->|", "->|", "->|", NULL, 0, 1}, + { keytype_default, "ش", "ﹺ", "ﹼ", NULL, 0, 1}, + { keytype_default, "س", "ﹴ", "!", NULL, 0, 1}, + { keytype_default, "ي", "[", "@", NULL, 0, 1}, + { keytype_default, "ب", "]", "#", NULL, 0, 1}, + { keytype_default, "ل", "ﻷ", "$", NULL, 0, 1}, + { keytype_default, "ا", "أ", "%", NULL, 0, 1}, + { keytype_default, "ت", "-", "^", NULL, 0, 1}, + { keytype_default, "ن", "x", "&", NULL, 0, 1}, + { keytype_default, "م", "/", "*", NULL, 0, 1}, + { keytype_default, "ك", ":", "_", NULL, 0, 1}, + { keytype_default, "د", "\"", "+", NULL, 0, 1}, + { keytype_enter, "Enter", "Enter", "Enter", NULL, 0, 2}, + + { keytype_caps, "Shift", "Base", "Shift", NULL, 0, 2}, + { keytype_default, "ئ", "~", ")", NULL, 0, 1}, + { keytype_default, "ء", "°", "(", NULL, 0, 1}, + { keytype_default, "ؤ", "{", "\"", NULL, 0, 1}, + { keytype_default, "ر", "}", "\'", NULL, 0, 1}, + { keytype_default, "ى", "ﺁ", "؟", NULL, 0, 1}, + { keytype_default, "ة", "'", "!", NULL, 0, 1}, + { keytype_default, "و", ",", ";", NULL, 0, 1}, + { keytype_default, "ﺯ", ".", "\\", NULL, 0, 1}, + { keytype_default, "ظ", "؟", "=", NULL, 0, 1}, + { keytype_caps, "Shift", "Base", "Shift", NULL, 0, 2}, + + { keytype_altgr, "؟٣٢١", "؟٣٢١", "Base", NULL, 0, 1}, + { keytype_default, "ﻻ", "ﻵ", "|", NULL, 0, 1}, + { keytype_default, ",", "،", "،", NULL, 0, 1}, + { keytype_space, "", "", "", NULL, 0, 6}, + { keytype_default, ".", "ذ", "]", NULL, 0, 1}, + { keytype_default, "ط", "ﺝ", "[", NULL, 0, 1}, }; static const struct layout normal_layout = { normal_keys, sizeof(normal_keys) / sizeof(*normal_keys), + keymap_normal, 12, 4, "en", - 0 + false, }; static const struct layout numeric_layout = { numeric_keys, sizeof(numeric_keys) / sizeof(*numeric_keys), + NULL, 12, 2, "en", - 0 + false, }; static const struct layout arabic_layout = { arabic_keys, sizeof(arabic_keys) / sizeof(*arabic_keys), + NULL, 13, 4, "ar", - 0 + false, }; +static const struct layout polish_layout = { + polish_keys, + sizeof(polish_keys) / sizeof(*polish_keys), + keymap_polish, + 12, + 4, + "pl", + true, +}; + +static const struct layout* layouts[] = { + &normal_layout, + &polish_layout, + &arabic_layout, +}; + +static const unsigned layouts_count = sizeof(layouts) / sizeof (*layouts); + +static const char* default_keymap_str = keymap_normal; + static const double key_width = 60; static const double key_height = 50; enum keyboard_state { KEYBOARD_STATE_DEFAULT, KEYBOARD_STATE_UPPERCASE, - KEYBOARD_STATE_SYMBOLS + KEYBOARD_STATE_SYMBOLS, + KEYBOARD_STATE_SYMBOLS_UPPER, }; struct keyboard { @@ -302,6 +384,7 @@ static const char* dbus_path_name = "/sm/puri/OSK0"; static GDBusProxy *_proxy; static SmPuriOSK0 *dbus_interface = NULL; +static GSettings *settings = NULL; static void __attribute__ ((format (printf, 1, 2))) dbg(const char *fmt, ...) @@ -335,8 +418,10 @@ label_from_key(struct keyboard *keyboard, return key->uppercase; case KEYBOARD_STATE_SYMBOLS: return key->symbol; + case KEYBOARD_STATE_SYMBOLS_UPPER: + return key->symbol_upper ? key->symbol_upper : key->symbol; default: - return ""; + dbg("Keyboard state invalid\n"); } return ""; @@ -396,12 +481,16 @@ get_current_layout(struct virtual_keyboard *keyboard) case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DIGITS: case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NUMBER: return &numeric_layout; - default: - if (keyboard->preferred_language && - strcmp(keyboard->preferred_language, "ar") == 0) + default: // TODO: iterate over a layout table instead + if (!keyboard->preferred_layout) { + return &normal_layout; + } else if (strcmp(keyboard->preferred_layout, "ar") == 0) { return &arabic_layout; - else + } else if (strcmp(keyboard->preferred_layout, "pl") == 0) { + return &polish_layout; + } else { return &normal_layout; + } } } @@ -585,17 +674,19 @@ append(char *s1, const char *s2) } static void keyboard_update_mods(struct keyboard *keyboard) { - unsigned mods = keyboard->ctrl_on << 2; + unsigned mods = keyboard->ctrl_on ? modifier_ctrl : modifier_none; unsigned locked = 0; switch(keyboard->state) { case KEYBOARD_STATE_DEFAULT: break; case KEYBOARD_STATE_UPPERCASE: - locked |= 2; + locked |= modifier_capslock; break; case KEYBOARD_STATE_SYMBOLS: - mods |= 128; + mods |= modifier_altgr; break; + case KEYBOARD_STATE_SYMBOLS_UPPER: + mods |= modifier_altgr | modifier_shift; default: break; } @@ -604,23 +695,12 @@ static void keyboard_update_mods(struct keyboard *keyboard) { } static void -keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *key, struct input *input, enum wl_pointer_button_state state) +keyboard_handle_key(struct keyboard *keyboard, const struct layout *layout, + uint32_t time, const struct key *key, + struct input *input, + enum wl_pointer_button_state state) { - const char *label = NULL; - - switch(keyboard->state) { - case KEYBOARD_STATE_DEFAULT : - label = key->label; - break; - case KEYBOARD_STATE_UPPERCASE : - label = key->uppercase; - break; - case KEYBOARD_STATE_SYMBOLS : - label = key->symbol; - break; - default: - dbg("Keyboard state invalid\n"); - } + const char *label = label_from_key(keyboard, key); uint32_t key_state = (state == WL_POINTER_BUTTON_STATE_PRESSED) ? WL_KEYBOARD_KEY_STATE_PRESSED : WL_KEYBOARD_KEY_STATE_RELEASED; @@ -700,6 +780,9 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key * case KEYBOARD_STATE_SYMBOLS: keyboard->state = KEYBOARD_STATE_UPPERCASE; break; + case KEYBOARD_STATE_SYMBOLS_UPPER: + keyboard->state = KEYBOARD_STATE_DEFAULT; + break; default: dbg("Keyboard state invalid\n"); } @@ -716,7 +799,14 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key * keyboard->state = KEYBOARD_STATE_SYMBOLS; break; case KEYBOARD_STATE_SYMBOLS: - keyboard->state = KEYBOARD_STATE_DEFAULT; + if (layout->has_symbol_upper) { + keyboard->state = KEYBOARD_STATE_SYMBOLS_UPPER; + } else { + keyboard->state = KEYBOARD_STATE_DEFAULT; + } + break; + case KEYBOARD_STATE_SYMBOLS_UPPER: + keyboard->state = KEYBOARD_STATE_SYMBOLS; break; default: dbg("Keyboard state invalid\n"); @@ -775,21 +865,36 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key * } } -static void -make_virtual_keyboard(struct virtual_keyboard *virtual_keyboard) { - struct zwp_virtual_keyboard_v1 *vkeyboard; - vkeyboard = zwp_virtual_keyboard_manager_v1_create_virtual_keyboard( - virtual_keyboard->keyboard_manager, - virtual_keyboard->seat); - - const char *keymap_str = keymap_data; +static int +update_keymap(struct virtual_keyboard *virtual_keyboard) +{ + const char *keymap_str = default_keymap_str; + for (unsigned i = 0; i < layouts_count; i++) { + if (strcmp(layouts[i]->language, + virtual_keyboard->preferred_layout) == 0) { + keymap_str = layouts[i]->keymap_str; + break; + } + } #ifdef KEYMAP_FILE + // Testing only + char fname[80]; + snprintf(fname, 79, "./keymap_%s", + virtual_keyboard->preferred_layout + ? virtual_keyboard->preferred_layout : "en"); int ffd; struct stat sb; - ffd = open("./keymap", O_RDONLY); + ffd = open(fname, O_RDONLY); + if (ffd < 0) { + return -1; + } fstat(ffd, &sb); keymap_str = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, ffd, 0); + if (!keymap_str) { + close(ffd); + return -1; + } #endif size_t keymap_size = strlen(keymap_str) + 1; @@ -797,20 +902,31 @@ make_virtual_keyboard(struct virtual_keyboard *virtual_keyboard) { if (keymap_fd < 0) { goto err; } + // TODO: save those inside layouts void *ptr = mmap(NULL, keymap_size, PROT_READ | PROT_WRITE, MAP_SHARED, keymap_fd, 0); if (ptr == (void*)-1) { goto err2; } strcpy(ptr, keymap_str); - zwp_virtual_keyboard_v1_keymap(vkeyboard, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1, - keymap_fd, keymap_size); - virtual_keyboard->virtual_keyboard = vkeyboard; - return; + zwp_virtual_keyboard_v1_keymap(virtual_keyboard->virtual_keyboard, + WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1, + keymap_fd, keymap_size); + return 0; err2: close(keymap_fd); err: - return; + return 1; +} + +static void +make_virtual_keyboard(struct virtual_keyboard *virtual_keyboard) +{ + struct zwp_virtual_keyboard_v1 *vkeyboard; + vkeyboard = zwp_virtual_keyboard_manager_v1_create_virtual_keyboard( + virtual_keyboard->keyboard_manager, + virtual_keyboard->seat); + virtual_keyboard->virtual_keyboard = vkeyboard; } @@ -848,7 +964,10 @@ button_handler(struct widget *widget, struct input *input, uint32_t time, for (i = 0; i < layout->count; ++i) { col -= layout->keys[i].width; if (col < 0) { - keyboard_handle_key(keyboard, time, &layout->keys[i], input, state); + keyboard_handle_key(keyboard, layout, + time, &layout->keys[i], + input, + state); break; } } @@ -885,8 +1004,10 @@ touch_handler(struct input *input, uint32_t time, for (i = 0; i < layout->count; ++i) { col -= layout->keys[i].width; if (col < 0) { - keyboard_handle_key(keyboard, time, - &layout->keys[i], input, state); + keyboard_handle_key(keyboard, layout, + time, &layout->keys[i], + input, + state); break; } } @@ -1285,6 +1406,64 @@ dbus_osk_setup(struct virtual_keyboard *virtual_keyboard) return 0; } +static void +settings_set_layout(struct virtual_keyboard *virtual_keyboard) +{ + GVariant *inputs = g_settings_get_value(settings, "sources"); + guint32 index; + g_settings_get(settings, "current", "u", &index); + + GVariantIter *iter; + g_variant_get(inputs, "a(ss)", &iter); + + g_autofree char *type, *layout; + + bool found = false; + for (unsigned i = 0; + g_variant_iter_loop(iter, "(ss)", &type, &layout); + i++) { + if (i == index) { + dbg("Found layout %s %s\n", type, layout); + found = true; + break; + } + } + g_variant_iter_free(iter); + if (found) { + virtual_keyboard->preferred_layout = strdup(layout); + } +} + +static gboolean +settings_handle_layout_changed(GSettings *s, + gpointer keys, gint n_keys, + gpointer user_data) +{ + struct virtual_keyboard *keyboard = user_data; + settings_set_layout(keyboard); + update_keymap(keyboard); + if (!keyboard->keyboard->window) { + return TRUE; + } + + struct size size = keyboard_get_size(keyboard->keyboard); + window_schedule_resize(keyboard->keyboard->window, size.width, size.height); + widget_schedule_redraw(keyboard->keyboard->widget); + return TRUE; +} + +static int +settings_listen(struct virtual_keyboard *virtual_keyboard) +{ + settings = g_settings_new("org.gnome.desktop.input-sources"); + gulong conn_id = g_signal_connect(settings, "change-event", + G_CALLBACK(settings_handle_layout_changed), + virtual_keyboard) == 0; + settings_set_layout(virtual_keyboard); + update_keymap(virtual_keyboard); + return conn_id; +} + int main(int argc, char *argv[]) { @@ -1328,6 +1507,10 @@ main(int argc, char *argv[]) make_input_method(&virtual_keyboard); } make_virtual_keyboard(&virtual_keyboard); + if (settings_listen(&virtual_keyboard) != 0) { + fprintf(stderr, "Could not connect to gsettings updates, layout" + " changing unavailable\n"); + } keyboard_create(&virtual_keyboard); if (dbus_osk_setup(&virtual_keyboard) != 0) { @@ -1335,11 +1518,11 @@ main(int argc, char *argv[]) return -1; } - //keyboard_create(&virtual_keyboard); - session_register(); display_run(virtual_keyboard.display); + + g_object_unref(settings); return 0; } diff --git a/clients/keymap.h b/clients/keymap.h index 5610e91730ab31b4829a414e453d9e3a4481b414..c6ddcd9c640264c1efae002c77600b3ca405384e 100644 --- a/clients/keymap.h +++ b/clients/keymap.h @@ -1,4 +1,4 @@ -static const char keymap_data[] = "xkb_keymap {\ +static const char keymap_normal[] = "xkb_keymap {\ xkb_keycodes \"(unnamed)\" {\ minimum = 8;\ maximum = 255;\ @@ -1460,3 +1460,1464 @@ xkb_symbols \"(unnamed)\" {\ \ };\ "; + +static const char keymap_polish[] = "xkb_keymap {\ + xkb_keycodes \"(unnamed)\" {\ + minimum = 8;\ + maximum = 255;\ + = 9;\ + = 10;\ + = 11;\ + = 12;\ + = 13;\ + = 14;\ + = 15;\ + = 16;\ + = 17;\ + = 18;\ + = 19;\ + = 20;\ + = 21;\ + = 22;\ + = 23;\ + = 24;\ + = 25;\ + = 26;\ + = 27;\ + = 28;\ + = 29;\ + = 30;\ + = 31;\ + = 32;\ + = 33;\ + = 34;\ + = 35;\ + = 36;\ + = 37;\ + = 38;\ + = 39;\ + = 40;\ + = 41;\ + = 42;\ + = 43;\ + = 44;\ + = 45;\ + = 46;\ + = 47;\ + = 48;\ + = 49;\ + = 50;\ + = 51;\ + = 52;\ + = 53;\ + = 54;\ + = 55;\ + = 56;\ + = 57;\ + = 58;\ + = 59;\ + = 60;\ + = 61;\ + = 62;\ + = 63;\ + = 64;\ + = 65;\ + = 66;\ + = 67;\ + = 68;\ + = 69;\ + = 70;\ + = 71;\ + = 72;\ + = 73;\ + = 74;\ + = 75;\ + = 76;\ + = 77;\ + = 78;\ + = 79;\ + = 80;\ + = 81;\ + = 82;\ + = 83;\ + = 84;\ + = 85;\ + = 86;\ + = 87;\ + = 88;\ + = 89;\ + = 90;\ + = 91;\ + = 92;\ + = 94;\ + = 95;\ + = 96;\ + = 97;\ + = 98;\ + = 99;\ + = 100;\ + = 101;\ + = 102;\ + = 103;\ + = 104;\ + = 105;\ + = 106;\ + = 107;\ + = 108;\ + = 109;\ + = 110;\ + = 111;\ + = 112;\ + = 113;\ + = 114;\ + = 115;\ + = 116;\ + = 117;\ + = 118;\ + = 119;\ + = 120;\ + = 121;\ + = 122;\ + = 123;\ + = 124;\ + = 125;\ + = 126;\ + = 127;\ + = 128;\ + = 129;\ + = 130;\ + = 131;\ + = 132;\ + = 133;\ + = 134;\ + = 135;\ + = 136;\ + = 137;\ + = 138;\ + = 139;\ + = 140;\ + = 141;\ + = 142;\ + = 143;\ + = 144;\ + = 145;\ + = 146;\ + = 147;\ + = 148;\ + = 149;\ + = 150;\ + = 151;\ + = 152;\ + = 153;\ + = 154;\ + = 155;\ + = 156;\ + = 157;\ + = 158;\ + = 159;\ + = 160;\ + = 161;\ + = 162;\ + = 163;\ + = 164;\ + = 165;\ + = 166;\ + = 167;\ + = 168;\ + = 169;\ + = 170;\ + = 171;\ + = 172;\ + = 173;\ + = 174;\ + = 175;\ + = 176;\ + = 177;\ + = 178;\ + = 179;\ + = 180;\ + = 181;\ + = 182;\ + = 183;\ + = 184;\ + = 185;\ + = 186;\ + = 187;\ + = 188;\ + = 189;\ + = 190;\ + = 191;\ + = 192;\ + = 193;\ + = 194;\ + = 195;\ + = 196;\ + = 197;\ + = 198;\ + = 199;\ + = 200;\ + = 201;\ + = 202;\ + = 203;\ + = 204;\ + = 205;\ + = 206;\ + = 207;\ + = 208;\ + = 209;\ + = 210;\ + = 211;\ + = 212;\ + = 213;\ + = 214;\ + = 215;\ + = 216;\ + = 217;\ + = 218;\ + = 219;\ + = 220;\ + = 221;\ + = 222;\ + = 223;\ + = 224;\ + = 225;\ + = 226;\ + = 227;\ + = 228;\ + = 229;\ + = 230;\ + = 231;\ + = 232;\ + = 233;\ + = 234;\ + = 235;\ + = 236;\ + = 237;\ + = 238;\ + = 239;\ + = 240;\ + = 241;\ + = 242;\ + = 243;\ + = 244;\ + = 245;\ + = 246;\ + = 247;\ + = 248;\ + = 249;\ + = 250;\ + = 251;\ + = 252;\ + = 253;\ + = 254;\ + = 255;\ + indicator 1 = \"Caps Lock\";\ + indicator 2 = \"Num Lock\";\ + indicator 3 = \"Scroll Lock\";\ + indicator 4 = \"Compose\";\ + indicator 5 = \"Kana\";\ + indicator 6 = \"Sleep\";\ + indicator 7 = \"Suspend\";\ + indicator 8 = \"Mute\";\ + indicator 9 = \"Misc\";\ + indicator 10 = \"Mail\";\ + indicator 11 = \"Charging\";\ + indicator 12 = \"Shift Lock\";\ + indicator 13 = \"Group 2\";\ + indicator 14 = \"Mouse Keys\";\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + };\ + \ + xkb_types \"(unnamed)\" {\ + virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;\ + \ + type \"ONE_LEVEL\" {\ + modifiers= none;\ + level_name[Level1]= \"Any\";\ + };\ + type \"TWO_LEVEL\" {\ + modifiers= Shift;\ + map[Shift]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + };\ + type \"ALPHABETIC\" {\ + modifiers= Shift+Lock;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Caps\";\ + };\ + type \"SHIFT+ALT\" {\ + modifiers= Shift+Alt;\ + map[Shift+Alt]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift+Alt\";\ + };\ + type \"PC_SUPER_LEVEL2\" {\ + modifiers= Mod4;\ + map[Mod4]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Super\";\ + };\ + type \"PC_CONTROL_LEVEL2\" {\ + modifiers= Control;\ + map[Control]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Control\";\ + };\ + type \"PC_LCONTROL_LEVEL2\" {\ + modifiers= LControl;\ + map[LControl]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"LControl\";\ + };\ + type \"PC_RCONTROL_LEVEL2\" {\ + modifiers= RControl;\ + map[RControl]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"RControl\";\ + };\ + type \"PC_ALT_LEVEL2\" {\ + modifiers= Alt;\ + map[Alt]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Alt\";\ + };\ + type \"PC_LALT_LEVEL2\" {\ + modifiers= LAlt;\ + map[LAlt]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"LAlt\";\ + };\ + type \"PC_RALT_LEVEL2\" {\ + modifiers= RAlt;\ + map[RAlt]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"RAlt\";\ + };\ + type \"CTRL+ALT\" {\ + modifiers= Shift+Control+Alt+LevelThree;\ + map[Shift]= Level2;\ + preserve[Shift]= Shift;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + preserve[Shift+LevelThree]= Shift;\ + map[Control+Alt]= Level5;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"Ctrl+Alt\";\ + };\ + type \"LOCAL_EIGHT_LEVEL\" {\ + modifiers= Shift+Lock+Control+LevelThree;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+Lock+LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level4;\ + map[Control]= Level5;\ + map[Shift+Lock+Control]= Level5;\ + map[Shift+Control]= Level6;\ + map[Lock+Control]= Level6;\ + map[Control+LevelThree]= Level7;\ + map[Shift+Lock+Control+LevelThree]= Level7;\ + map[Shift+Control+LevelThree]= Level8;\ + map[Lock+Control+LevelThree]= Level8;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Level3\";\ + level_name[Level4]= \"Shift Level3\";\ + level_name[Level5]= \"Ctrl\";\ + level_name[Level6]= \"Shift Ctrl\";\ + level_name[Level7]= \"Level3 Ctrl\";\ + level_name[Level8]= \"Shift Level3 Ctrl\";\ + };\ + type \"THREE_LEVEL\" {\ + modifiers= Shift+LevelThree;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level3;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Level3\";\ + };\ + type \"EIGHT_LEVEL\" {\ + modifiers= Shift+LevelThree+LevelFive;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[LevelFive]= Level5;\ + map[Shift+LevelFive]= Level6;\ + map[LevelThree+LevelFive]= Level7;\ + map[Shift+LevelThree+LevelFive]= Level8;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"X\";\ + level_name[Level6]= \"X Shift\";\ + level_name[Level7]= \"X Alt Base\";\ + level_name[Level8]= \"X Shift Alt\";\ + };\ + type \"EIGHT_LEVEL_ALPHABETIC\" {\ + modifiers= Shift+Lock+LevelThree+LevelFive;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level4;\ + map[Shift+Lock+LevelThree]= Level3;\ + map[LevelFive]= Level5;\ + map[Shift+LevelFive]= Level6;\ + map[Lock+LevelFive]= Level6;\ + map[LevelThree+LevelFive]= Level7;\ + map[Shift+LevelThree+LevelFive]= Level8;\ + map[Lock+LevelThree+LevelFive]= Level8;\ + map[Shift+Lock+LevelThree+LevelFive]= Level7;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"X\";\ + level_name[Level6]= \"X Shift\";\ + level_name[Level7]= \"X Alt Base\";\ + level_name[Level8]= \"X Shift Alt\";\ + };\ + type \"EIGHT_LEVEL_LEVEL_FIVE_LOCK\" {\ + modifiers= Shift+Lock+NumLock+LevelThree+LevelFive;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[LevelFive]= Level5;\ + map[Shift+LevelFive]= Level6;\ + preserve[Shift+LevelFive]= Shift;\ + map[LevelThree+LevelFive]= Level7;\ + map[Shift+LevelThree+LevelFive]= Level8;\ + map[NumLock]= Level5;\ + map[Shift+NumLock]= Level6;\ + preserve[Shift+NumLock]= Shift;\ + map[NumLock+LevelThree]= Level7;\ + map[Shift+NumLock+LevelThree]= Level8;\ + map[Shift+NumLock+LevelFive]= Level2;\ + map[NumLock+LevelThree+LevelFive]= Level3;\ + map[Shift+NumLock+LevelThree+LevelFive]= Level4;\ + map[Shift+Lock]= Level2;\ + map[Lock+LevelThree]= Level3;\ + map[Shift+Lock+LevelThree]= Level4;\ + map[Lock+LevelFive]= Level5;\ + map[Shift+Lock+LevelFive]= Level6;\ + preserve[Shift+Lock+LevelFive]= Shift;\ + map[Lock+LevelThree+LevelFive]= Level7;\ + map[Shift+Lock+LevelThree+LevelFive]= Level8;\ + map[Lock+NumLock]= Level5;\ + map[Shift+Lock+NumLock]= Level6;\ + preserve[Shift+Lock+NumLock]= Shift;\ + map[Lock+NumLock+LevelThree]= Level7;\ + map[Shift+Lock+NumLock+LevelThree]= Level8;\ + map[Shift+Lock+NumLock+LevelFive]= Level2;\ + map[Lock+NumLock+LevelThree+LevelFive]= Level3;\ + map[Shift+Lock+NumLock+LevelThree+LevelFive]= Level4;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"X\";\ + level_name[Level6]= \"X Shift\";\ + level_name[Level7]= \"X Alt Base\";\ + level_name[Level8]= \"X Shift Alt\";\ + };\ + type \"EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK\" {\ + modifiers= Shift+Lock+NumLock+LevelThree+LevelFive;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[LevelFive]= Level5;\ + map[Shift+LevelFive]= Level6;\ + preserve[Shift+LevelFive]= Shift;\ + map[LevelThree+LevelFive]= Level7;\ + map[Shift+LevelThree+LevelFive]= Level8;\ + map[NumLock]= Level5;\ + map[Shift+NumLock]= Level6;\ + preserve[Shift+NumLock]= Shift;\ + map[NumLock+LevelThree]= Level7;\ + map[Shift+NumLock+LevelThree]= Level8;\ + map[Shift+NumLock+LevelFive]= Level2;\ + map[NumLock+LevelThree+LevelFive]= Level3;\ + map[Shift+NumLock+LevelThree+LevelFive]= Level4;\ + map[Lock]= Level2;\ + map[Lock+LevelThree]= Level3;\ + map[Shift+Lock+LevelThree]= Level4;\ + map[Lock+LevelFive]= Level5;\ + map[Shift+Lock+LevelFive]= Level6;\ + map[Lock+LevelThree+LevelFive]= Level7;\ + map[Shift+Lock+LevelThree+LevelFive]= Level8;\ + map[Lock+NumLock]= Level5;\ + map[Shift+Lock+NumLock]= Level6;\ + map[Lock+NumLock+LevelThree]= Level7;\ + map[Shift+Lock+NumLock+LevelThree]= Level8;\ + map[Lock+NumLock+LevelFive]= Level2;\ + map[Lock+NumLock+LevelThree+LevelFive]= Level4;\ + map[Shift+Lock+NumLock+LevelThree+LevelFive]= Level3;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"X\";\ + level_name[Level6]= \"X Shift\";\ + level_name[Level7]= \"X Alt Base\";\ + level_name[Level8]= \"X Shift Alt\";\ + };\ + type \"EIGHT_LEVEL_SEMIALPHABETIC\" {\ + modifiers= Shift+Lock+LevelThree+LevelFive;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level3;\ + preserve[Lock+LevelThree]= Lock;\ + map[Shift+Lock+LevelThree]= Level4;\ + preserve[Shift+Lock+LevelThree]= Lock;\ + map[LevelFive]= Level5;\ + map[Shift+LevelFive]= Level6;\ + map[Lock+LevelFive]= Level6;\ + preserve[Lock+LevelFive]= Lock;\ + map[Shift+Lock+LevelFive]= Level6;\ + preserve[Shift+Lock+LevelFive]= Lock;\ + map[LevelThree+LevelFive]= Level7;\ + map[Shift+LevelThree+LevelFive]= Level8;\ + map[Lock+LevelThree+LevelFive]= Level7;\ + preserve[Lock+LevelThree+LevelFive]= Lock;\ + map[Shift+Lock+LevelThree+LevelFive]= Level8;\ + preserve[Shift+Lock+LevelThree+LevelFive]= Lock;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"X\";\ + level_name[Level6]= \"X Shift\";\ + level_name[Level7]= \"X Alt Base\";\ + level_name[Level8]= \"X Shift Alt\";\ + };\ + type \"FOUR_LEVEL\" {\ + modifiers= Shift+LevelThree;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + };\ + type \"FOUR_LEVEL_ALPHABETIC\" {\ + modifiers= Shift+Lock+LevelThree;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level4;\ + map[Shift+Lock+LevelThree]= Level3;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + };\ + type \"FOUR_LEVEL_SEMIALPHABETIC\" {\ + modifiers= Shift+Lock+LevelThree;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level3;\ + preserve[Lock+LevelThree]= Lock;\ + map[Shift+Lock+LevelThree]= Level4;\ + preserve[Shift+Lock+LevelThree]= Lock;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + };\ + type \"FOUR_LEVEL_MIXED_KEYPAD\" {\ + modifiers= Shift+NumLock+LevelThree;\ + map[NumLock]= Level2;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[NumLock+LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Shift+NumLock+LevelThree]= Level4;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Number\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + };\ + type \"FOUR_LEVEL_X\" {\ + modifiers= Shift+Control+Alt+LevelThree;\ + map[LevelThree]= Level2;\ + map[Shift+LevelThree]= Level3;\ + map[Control+Alt]= Level4;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Alt Base\";\ + level_name[Level3]= \"Shift Alt\";\ + level_name[Level4]= \"Ctrl+Alt\";\ + };\ + type \"SEPARATE_CAPS_AND_SHIFT_ALPHABETIC\" {\ + modifiers= Shift+Lock+LevelThree;\ + map[Shift]= Level2;\ + map[Lock]= Level4;\ + preserve[Lock]= Lock;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level3;\ + preserve[Lock+LevelThree]= Lock;\ + map[Shift+Lock+LevelThree]= Level3;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"AltGr Base\";\ + level_name[Level4]= \"Shift AltGr\";\ + };\ + type \"FOUR_LEVEL_PLUS_LOCK\" {\ + modifiers= Shift+Lock+LevelThree;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock]= Level5;\ + map[Shift+Lock]= Level2;\ + map[Lock+LevelThree]= Level3;\ + map[Shift+Lock+LevelThree]= Level4;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"Lock\";\ + };\ + type \"KEYPAD\" {\ + modifiers= Shift+NumLock;\ + map[Shift]= Level2;\ + map[NumLock]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Number\";\ + };\ + type \"FOUR_LEVEL_KEYPAD\" {\ + modifiers= Shift+NumLock+LevelThree;\ + map[Shift]= Level2;\ + map[NumLock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[NumLock+LevelThree]= Level4;\ + map[Shift+NumLock+LevelThree]= Level3;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Number\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Alt Number\";\ + };\ + };\ + \ + xkb_compatibility \"(unnamed)\" {\ + virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;\ + \ + interpret.useModMapMods= AnyLevel;\ + interpret.repeat= False;\ + interpret ISO_Level2_Latch+Exactly(Shift) {\ + useModMapMods=level1;\ + action= LatchMods(modifiers=Shift,clearLocks,latchToLock);\ + };\ + interpret Shift_Lock+AnyOf(Shift+Lock) {\ + action= LockMods(modifiers=Shift);\ + };\ + interpret Num_Lock+AnyOf(all) {\ + virtualModifier= NumLock;\ + action= LockMods(modifiers=NumLock);\ + };\ + interpret ISO_Level3_Shift+AnyOf(all) {\ + virtualModifier= LevelThree;\ + useModMapMods=level1;\ + action= SetMods(modifiers=LevelThree,clearLocks);\ + };\ + interpret ISO_Level3_Latch+AnyOf(all) {\ + virtualModifier= LevelThree;\ + useModMapMods=level1;\ + action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);\ + };\ + interpret ISO_Level3_Lock+AnyOf(all) {\ + virtualModifier= LevelThree;\ + useModMapMods=level1;\ + action= LockMods(modifiers=LevelThree);\ + };\ + interpret Alt_L+AnyOf(all) {\ + virtualModifier= Alt;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Alt_R+AnyOf(all) {\ + virtualModifier= Alt;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Meta_L+AnyOf(all) {\ + virtualModifier= Meta;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Meta_R+AnyOf(all) {\ + virtualModifier= Meta;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Super_L+AnyOf(all) {\ + virtualModifier= Super;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Super_R+AnyOf(all) {\ + virtualModifier= Super;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Hyper_L+AnyOf(all) {\ + virtualModifier= Hyper;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Hyper_R+AnyOf(all) {\ + virtualModifier= Hyper;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Scroll_Lock+AnyOf(all) {\ + virtualModifier= ScrollLock;\ + action= LockMods(modifiers=modMapMods);\ + };\ + interpret ISO_Level5_Shift+AnyOf(all) {\ + virtualModifier= LevelFive;\ + useModMapMods=level1;\ + action= SetMods(modifiers=LevelFive,clearLocks);\ + };\ + interpret ISO_Level5_Latch+AnyOf(all) {\ + virtualModifier= LevelFive;\ + useModMapMods=level1;\ + action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);\ + };\ + interpret ISO_Level5_Lock+AnyOf(all) {\ + virtualModifier= LevelFive;\ + useModMapMods=level1;\ + action= LockMods(modifiers=LevelFive);\ + };\ + interpret Mode_switch+AnyOfOrNone(all) {\ + virtualModifier= AltGr;\ + useModMapMods=level1;\ + action= SetGroup(group=+1);\ + };\ + interpret ISO_Level3_Shift+AnyOfOrNone(all) {\ + action= SetMods(modifiers=LevelThree,clearLocks);\ + };\ + interpret ISO_Level3_Latch+AnyOfOrNone(all) {\ + action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);\ + };\ + interpret ISO_Level3_Lock+AnyOfOrNone(all) {\ + action= LockMods(modifiers=LevelThree);\ + };\ + interpret ISO_Group_Latch+AnyOfOrNone(all) {\ + virtualModifier= AltGr;\ + useModMapMods=level1;\ + action= LatchGroup(group=2);\ + };\ + interpret ISO_Next_Group+AnyOfOrNone(all) {\ + virtualModifier= AltGr;\ + useModMapMods=level1;\ + action= LockGroup(group=+1);\ + };\ + interpret ISO_Prev_Group+AnyOfOrNone(all) {\ + virtualModifier= AltGr;\ + useModMapMods=level1;\ + action= LockGroup(group=-1);\ + };\ + interpret ISO_First_Group+AnyOfOrNone(all) {\ + action= LockGroup(group=1);\ + };\ + interpret ISO_Last_Group+AnyOfOrNone(all) {\ + action= LockGroup(group=2);\ + };\ + interpret KP_1+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=+1);\ + };\ + interpret KP_End+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=+1);\ + };\ + interpret KP_2+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+0,y=+1);\ + };\ + interpret KP_Down+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+0,y=+1);\ + };\ + interpret KP_3+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=+1);\ + };\ + interpret KP_Next+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=+1);\ + };\ + interpret KP_4+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=+0);\ + };\ + interpret KP_Left+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=+0);\ + };\ + interpret KP_6+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=+0);\ + };\ + interpret KP_Right+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=+0);\ + };\ + interpret KP_7+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=-1);\ + };\ + interpret KP_Home+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=-1);\ + };\ + interpret KP_8+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+0,y=-1);\ + };\ + interpret KP_Up+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+0,y=-1);\ + };\ + interpret KP_9+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=-1);\ + };\ + interpret KP_Prior+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=-1);\ + };\ + interpret KP_5+AnyOfOrNone(all) {\ + repeat= True;\ + action= PtrBtn(button=default);\ + };\ + interpret KP_Begin+AnyOfOrNone(all) {\ + repeat= True;\ + action= PtrBtn(button=default);\ + };\ + interpret KP_F2+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=1);\ + };\ + interpret KP_Divide+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=1);\ + };\ + interpret KP_F3+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=2);\ + };\ + interpret KP_Multiply+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=2);\ + };\ + interpret KP_F4+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=3);\ + };\ + interpret KP_Subtract+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=3);\ + };\ + interpret KP_Separator+AnyOfOrNone(all) {\ + repeat= True;\ + action= PtrBtn(button=default,count=2);\ + };\ + interpret KP_Add+AnyOfOrNone(all) {\ + repeat= True;\ + action= PtrBtn(button=default,count=2);\ + };\ + interpret KP_0+AnyOfOrNone(all) {\ + repeat= True;\ + action= LockPtrBtn(button=default,affect=lock);\ + };\ + interpret KP_Insert+AnyOfOrNone(all) {\ + repeat= True;\ + action= LockPtrBtn(button=default,affect=lock);\ + };\ + interpret KP_Decimal+AnyOfOrNone(all) {\ + repeat= True;\ + action= LockPtrBtn(button=default,affect=unlock);\ + };\ + interpret KP_Delete+AnyOfOrNone(all) {\ + repeat= True;\ + action= LockPtrBtn(button=default,affect=unlock);\ + };\ + interpret F25+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=1);\ + };\ + interpret F26+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=2);\ + };\ + interpret F27+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=-1);\ + };\ + interpret F29+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=-1);\ + };\ + interpret F31+AnyOfOrNone(all) {\ + repeat= True;\ + action= PtrBtn(button=default);\ + };\ + interpret F33+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=+1);\ + };\ + interpret F35+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=+1);\ + };\ + interpret Pointer_Button_Dflt+AnyOfOrNone(all) {\ + action= PtrBtn(button=default);\ + };\ + interpret Pointer_Button1+AnyOfOrNone(all) {\ + action= PtrBtn(button=1);\ + };\ + interpret Pointer_Button2+AnyOfOrNone(all) {\ + action= PtrBtn(button=2);\ + };\ + interpret Pointer_Button3+AnyOfOrNone(all) {\ + action= PtrBtn(button=3);\ + };\ + interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {\ + action= PtrBtn(button=default,count=2);\ + };\ + interpret Pointer_DblClick1+AnyOfOrNone(all) {\ + action= PtrBtn(button=1,count=2);\ + };\ + interpret Pointer_DblClick2+AnyOfOrNone(all) {\ + action= PtrBtn(button=2,count=2);\ + };\ + interpret Pointer_DblClick3+AnyOfOrNone(all) {\ + action= PtrBtn(button=3,count=2);\ + };\ + interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {\ + action= LockPtrBtn(button=default);\ + };\ + interpret Pointer_Drag1+AnyOfOrNone(all) {\ + action= LockPtrBtn(button=1);\ + };\ + interpret Pointer_Drag2+AnyOfOrNone(all) {\ + action= LockPtrBtn(button=2);\ + };\ + interpret Pointer_Drag3+AnyOfOrNone(all) {\ + action= LockPtrBtn(button=3);\ + };\ + interpret Pointer_EnableKeys+AnyOfOrNone(all) {\ + action= LockControls(controls=MouseKeys);\ + };\ + interpret Pointer_Accelerate+AnyOfOrNone(all) {\ + action= LockControls(controls=MouseKeysAccel);\ + };\ + interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {\ + action= SetPtrDflt(affect=button,button=+1);\ + };\ + interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {\ + action= SetPtrDflt(affect=button,button=-1);\ + };\ + interpret AccessX_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=AccessXKeys);\ + };\ + interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=AccessXFeedback);\ + };\ + interpret RepeatKeys_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=RepeatKeys);\ + };\ + interpret SlowKeys_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=SlowKeys);\ + };\ + interpret BounceKeys_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=BounceKeys);\ + };\ + interpret StickyKeys_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=StickyKeys);\ + };\ + interpret MouseKeys_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=MouseKeys);\ + };\ + interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=MouseKeysAccel);\ + };\ + interpret Overlay1_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=none);\ + };\ + interpret Overlay2_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=none);\ + };\ + interpret AudibleBell_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=AudibleBell);\ + };\ + interpret Terminate_Server+AnyOfOrNone(all) {\ + action= Terminate();\ + };\ + interpret Alt_L+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Alt,clearLocks);\ + };\ + interpret Alt_R+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Alt,clearLocks);\ + };\ + interpret Meta_L+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Meta,clearLocks);\ + };\ + interpret Meta_R+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Meta,clearLocks);\ + };\ + interpret Super_L+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Super,clearLocks);\ + };\ + interpret Super_R+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Super,clearLocks);\ + };\ + interpret Hyper_L+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Hyper,clearLocks);\ + };\ + interpret Hyper_R+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Hyper,clearLocks);\ + };\ + interpret Shift_L+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Shift,clearLocks);\ + };\ + interpret XF86Switch_VT_1+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=1,!same);\ + };\ + interpret XF86Switch_VT_2+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=2,!same);\ + };\ + interpret XF86Switch_VT_3+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=3,!same);\ + };\ + interpret XF86Switch_VT_4+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=4,!same);\ + };\ + interpret XF86Switch_VT_5+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=5,!same);\ + };\ + interpret XF86Switch_VT_6+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=6,!same);\ + };\ + interpret XF86Switch_VT_7+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=7,!same);\ + };\ + interpret XF86Switch_VT_8+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=8,!same);\ + };\ + interpret XF86Switch_VT_9+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=9,!same);\ + };\ + interpret XF86Switch_VT_10+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=10,!same);\ + };\ + interpret XF86Switch_VT_11+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=11,!same);\ + };\ + interpret XF86Switch_VT_12+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=12,!same);\ + };\ + interpret XF86LogGrabInfo+AnyOfOrNone(all) {\ + repeat= True;\ + action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00);\ + };\ + interpret XF86LogWindowTree+AnyOfOrNone(all) {\ + repeat= True;\ + action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00);\ + };\ + interpret XF86Next_VMode+AnyOfOrNone(all) {\ + repeat= True;\ + action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);\ + };\ + interpret XF86Prev_VMode+AnyOfOrNone(all) {\ + repeat= True;\ + action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);\ + };\ + interpret ISO_Level5_Shift+AnyOfOrNone(all) {\ + action= SetMods(modifiers=LevelFive,clearLocks);\ + };\ + interpret ISO_Level5_Latch+AnyOfOrNone(all) {\ + action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);\ + };\ + interpret ISO_Level5_Lock+AnyOfOrNone(all) {\ + action= LockMods(modifiers=LevelFive);\ + };\ + interpret Caps_Lock+AnyOfOrNone(all) {\ + action= LockMods(modifiers=Lock);\ + };\ + interpret Any+Exactly(Lock) {\ + action= LockMods(modifiers=Lock);\ + };\ + interpret Any+AnyOf(all) {\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + indicator \"Caps Lock\" {\ + whichModState= locked;\ + modifiers= Lock;\ + };\ + indicator \"Num Lock\" {\ + whichModState= locked;\ + modifiers= NumLock;\ + };\ + indicator \"Scroll Lock\" {\ + whichModState= locked;\ + modifiers= ScrollLock;\ + };\ + indicator \"Shift Lock\" {\ + whichModState= locked;\ + modifiers= Shift;\ + };\ + indicator \"Group 2\" {\ + groups= 0xfe;\ + };\ + indicator \"Mouse Keys\" {\ + controls= MouseKeys;\ + };\ + };\ + \ + xkb_symbols \"(unnamed)\" {\ + name[group1]=\"English (US)\";\ + \ + key { [ Escape ] };\ + key { [ 1, exclam ] };\ + key { [ 2, at ] };\ + key { [ 3, numbersign ] };\ + key { [ 4, dollar ] };\ + key { [ 5, percent ] };\ + key { [ 6, asciicircum ] };\ + key { [ 7, ampersand ] };\ + key { [ 8, asterisk ] };\ + key { [ 9, parenleft ] };\ + key { [ 0, parenright ] };\ + key { [ minus, underscore ] };\ + key { [ equal, plus ] };\ + key { [ BackSpace, BackSpace ] };\ + key { [ Tab, ISO_Left_Tab ] };\ + key { [ q, Q, 1, asciitilde ] };\ + key { [ w, W, 2, plus ] };\ + key { [ e, E, 3, minus ] };\ + key { [ r, R, 4, equal ] };\ + key { [ t, T, 5, percent ] };\ + key { [ y, Y, 6, asciicircum ] };\ + key { [ u, U, 7, ampersand ] };\ + key { [ i, I, 8, asterisk ] };\ + key { [ o, O, 9, bracketleft ] };\ + key { [ p, P, 0, bracketright ] };\ + key { [ bracketleft, braceleft ] };\ + key { [ bracketright, braceright ] };\ + key { [ Return ] };\ + key { [ Control_L ] };\ + key { [ a, A, aogonek, Aogonek ] };\ + key { [ s, S, sacute, Sacute ] };\ + key { [ d, D, eogonek, Eogonek ] };\ + key { [ f, F, colon, underscore ] };\ + key { [ g, G, semicolon, apostrophe ] };\ + key { [ h, H, parenleft, braceleft ] };\ + key { [ j, J, parenright, braceright ] };\ + key { [ k, K, oacute, Oacute ] };\ + key { [ l, L, lstroke, Lstroke ] };\ + key { [ semicolon, colon ] };\ + key { [ apostrophe, quotedbl ] };\ + key { [ grave, asciitilde ] };\ + key { [ Shift_L ] };\ + key { [ backslash, bar ] };\ + key { [ z, Z, zabovedot, Zabovedot ] };\ + key { [ x, X, zacute, Zacute ] };\ + key { [ c, C, cacute, Cacute ] };\ + key { [ v, V, U2013, dollar ] };\ + key { [ b, B, question, EuroSign ] };\ + key { [ n, N, exclam, numbersign ] };\ + key { [ m, M, U201E, guillemotright ] };\ + key { [ comma, less, U201D, guillemotleft] };\ + key { [ period, greater, bar, ellipsis ] };\ + key { [ slash, question ] };\ + key { [ Shift_R ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ]\ + };\ + key { [ Alt_L, Meta_L ] };\ + key { [ space ] };\ + key { [ Caps_Lock ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ]\ + };\ + key { [ Num_Lock ] };\ + key { [ Scroll_Lock ] };\ + key { [ KP_Home, KP_7 ] };\ + key { [ KP_Up, KP_8 ] };\ + key { [ KP_Prior, KP_9 ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ]\ + };\ + key { [ KP_Left, KP_4 ] };\ + key { [ KP_Begin, KP_5 ] };\ + key { [ KP_Right, KP_6 ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ]\ + };\ + key { [ KP_End, KP_1 ] };\ + key { [ KP_Down, KP_2 ] };\ + key { [ KP_Next, KP_3 ] };\ + key { [ KP_Insert, KP_0 ] };\ + key { [ KP_Delete, KP_Decimal ] };\ + key { [ ISO_Level3_Shift ] };\ + key { [ less, greater, bar, brokenbar ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ]\ + };\ + key { [ Katakana ] };\ + key { [ Hiragana ] };\ + key { [ Henkan_Mode ] };\ + key { [ Hiragana_Katakana ] };\ + key { [ Muhenkan ] };\ + key { [ KP_Enter ] };\ + key { [ Control_R ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ]\ + };\ + key {\ + type= \"PC_ALT_LEVEL2\",\ + symbols[Group1]= [ Print, Sys_Req ]\ + };\ + key {\ + type= \"TWO_LEVEL\",\ + symbols[Group1]= [ Alt_R, Meta_R ]\ + };\ + key { [ Linefeed ] };\ + key { [ Home ] };\ + key { [ Up ] };\ + key { [ Prior ] };\ + key { [ Left ] };\ + key { [ Right ] };\ + key { [ End ] };\ + key { [ Down ] };\ + key { [ Next ] };\ + key { [ Insert ] };\ + key { [ Delete ] };\ + key { [ XF86AudioMute ] };\ + key { [ XF86AudioLowerVolume ] };\ + key { [ XF86AudioRaiseVolume ] };\ + key { [ XF86PowerOff ] };\ + key { [ KP_Equal ] };\ + key { [ plusminus ] };\ + key {\ + type= \"PC_CONTROL_LEVEL2\",\ + symbols[Group1]= [ Pause, Break ]\ + };\ + key { [ XF86LaunchA ] };\ + key { [ KP_Decimal, KP_Decimal ] };\ + key { [ Hangul ] };\ + key { [ Hangul_Hanja ] };\ + key { [ Super_L ] };\ + key { [ Super_R ] };\ + key { [ Menu ] };\ + key { [ Cancel ] };\ + key { [ Redo ] };\ + key { [ SunProps ] };\ + key { [ Undo ] };\ + key { [ SunFront ] };\ + key { [ XF86Copy ] };\ + key { [ XF86Open ] };\ + key { [ XF86Paste ] };\ + key { [ Find ] };\ + key { [ XF86Cut ] };\ + key { [ Help ] };\ + key { [ XF86MenuKB ] };\ + key { [ XF86Calculator ] };\ + key { [ XF86Sleep ] };\ + key { [ XF86WakeUp ] };\ + key { [ XF86Explorer ] };\ + key { [ XF86Send ] };\ + key { [ XF86Xfer ] };\ + key { [ XF86Launch1 ] };\ + key { [ XF86Launch2 ] };\ + key { [ XF86WWW ] };\ + key { [ XF86DOS ] };\ + key { [ XF86ScreenSaver ] };\ + key { [ XF86RotateWindows ] };\ + key { [ XF86TaskPane ] };\ + key { [ XF86Mail ] };\ + key { [ XF86Favorites ] };\ + key { [ XF86MyComputer ] };\ + key { [ XF86Back ] };\ + key { [ XF86Forward ] };\ + key { [ XF86Eject ] };\ + key { [ XF86Eject, XF86Eject ] };\ + key { [ XF86AudioNext ] };\ + key { [ XF86AudioPlay, XF86AudioPause ] };\ + key { [ XF86AudioPrev ] };\ + key { [ XF86AudioStop, XF86Eject ] };\ + key { [ XF86AudioRecord ] };\ + key { [ XF86AudioRewind ] };\ + key { [ XF86Phone ] };\ + key { [ XF86Tools ] };\ + key { [ XF86HomePage ] };\ + key { [ XF86Reload ] };\ + key { [ XF86Close ] };\ + key { [ XF86ScrollUp ] };\ + key { [ XF86ScrollDown ] };\ + key { [ parenleft ] };\ + key { [ parenright ] };\ + key { [ XF86New ] };\ + key { [ Redo ] };\ + key { [ XF86Tools ] };\ + key { [ XF86Launch5 ] };\ + key { [ XF86Launch6 ] };\ + key { [ XF86Launch7 ] };\ + key { [ XF86Launch8 ] };\ + key { [ XF86Launch9 ] };\ + key { [ XF86AudioMicMute ] };\ + key { [ XF86TouchpadToggle ] };\ + key { [ XF86TouchpadOn ] };\ + key { [ XF86TouchpadOff ] };\ + key { [ Mode_switch ] };\ + key { [ NoSymbol, Alt_L ] };\ + key { [ NoSymbol, Meta_L ] };\ + key { [ NoSymbol, Super_L ] };\ + key { [ NoSymbol, Hyper_L ] };\ + key { [ XF86AudioPlay ] };\ + key { [ XF86AudioPause ] };\ + key { [ XF86Launch3 ] };\ + key { [ XF86Launch4 ] };\ + key { [ XF86LaunchB ] };\ + key { [ XF86Suspend ] };\ + key { [ XF86Close ] };\ + key { [ XF86AudioPlay ] };\ + key { [ XF86AudioForward ] };\ + key { [ Print ] };\ + key { [ XF86WebCam ] };\ + key { [ XF86AudioPreset ] };\ + key { [ XF86Mail ] };\ + key { [ XF86Messenger ] };\ + key { [ XF86Search ] };\ + key { [ XF86Go ] };\ + key { [ XF86Finance ] };\ + key { [ XF86Game ] };\ + key { [ XF86Shop ] };\ + key { [ Cancel ] };\ + key { [ XF86MonBrightnessDown ] };\ + key { [ XF86MonBrightnessUp ] };\ + key { [ XF86AudioMedia ] };\ + key { [ XF86Display ] };\ + key { [ XF86KbdLightOnOff ] };\ + key { [ XF86KbdBrightnessDown ] };\ + key { [ XF86KbdBrightnessUp ] };\ + key { [ XF86Send ] };\ + key { [ XF86Reply ] };\ + key { [ XF86MailForward ] };\ + key { [ XF86Save ] };\ + key { [ XF86Documents ] };\ + key { [ XF86Battery ] };\ + key { [ XF86Bluetooth ] };\ + key { [ XF86WLAN ] };\ + key { [ XF86UWB ] };\ + key { [ XF86WWAN ] };\ + key { [ XF86RFKill ] };\ + modifier_map Shift { , };\ + modifier_map Lock { };\ + modifier_map Control { , };\ + modifier_map Mod1 { , , };\ + modifier_map Mod2 { };\ + modifier_map Mod4 { , , , };\ + modifier_map Mod5 { , };\ + };\ +};"; diff --git a/debian/changelog b/debian/changelog index 2830f475f876f0112066ad54aa89b096a2811139..512896355310c3a0d6b9a8be06eaa18e23c15c8d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +virtboard (0.0.5) unstable; urgency=medium + + * Added Polish keyboard layout + * Added gsettings-controlled layout switching + + -- Dorota Czaplejewicz Fri, 02 Nov 2018 16:08:31 +0000 + virtboard (0.0.4) unstable; urgency=medium * Removed panel when inactive diff --git a/meson.build b/meson.build index c148055f80b3000dd3e6bf5f1d6fb5be2cc6e425..bdeda8558139ed5d7961c07d6a7d18c5ac377eb3 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'virtboard', 'c', - version: '0.0.4', + version: '0.0.5', license: 'MIT', meson_version: '>=0.43.0', default_options: [ 'warning_level=1', 'c_std=gnu11' ]