implemented support for multiple keymaps

This commit is contained in:
Maarten van Gompel 2021-08-23 20:04:35 +02:00 committed by John Sullivan
parent cf77edf11c
commit 20b2dc61c3
4 changed files with 1592 additions and 44 deletions

View File

@ -57,6 +57,7 @@ struct key {
struct layout { struct layout {
struct key *keys; struct key *keys;
uint32_t keyheight; //absolute height (pixels) uint32_t keyheight; //absolute height (pixels)
const char * keymap_name;
}; };
struct kbd { struct kbd {
@ -166,6 +167,9 @@ kbd_unpress_key(struct kbd *kb, uint32_t time) {
if (compose >= 2) { if (compose >= 2) {
compose = 0; compose = 0;
if ((!kb->prevlayout) || (strcmp(kb->prevlayout->keymap_name, kb->layout->keymap_name) != 0)) {
create_and_upload_keymap(kb->layout->keymap_name, 0, 0);
}
kb->layout = kb->prevlayout; kb->layout = kb->prevlayout;
kbd_draw_layout(kb); kbd_draw_layout(kb);
} }
@ -191,6 +195,9 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) {
if (compose) { if (compose) {
fprintf(stderr,"showing compose %d\n", compose); fprintf(stderr,"showing compose %d\n", compose);
} }
if ((!kb->prevlayout) || (strcmp(kb->prevlayout->keymap_name, kb->layout->keymap_name) != 0)) {
create_and_upload_keymap(kb->layout->keymap_name, 0, 0);
}
kb->prevlayout = kb->layout; kb->prevlayout = kb->layout;
kb->layout = k->layout; kb->layout = k->layout;
kbd_draw_layout(kb); kbd_draw_layout(kb);
@ -224,12 +231,17 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) {
break; break;
case Layout: case Layout:
kb->layout = k->layout; kb->layout = k->layout;
if ((!kb->prevlayout) || (strcmp(kb->prevlayout->keymap_name, kb->layout->keymap_name) != 0)) {
fprintf(stderr, "Switching to keymap %s\n", kb->layout->keymap_name);
create_and_upload_keymap(kb->layout->keymap_name, 0, 0);
}
kb->prevlayout = kb->layout;
kbd_draw_layout(kb); kbd_draw_layout(kb);
case Copy: case Copy:
kb->last_press = k; kb->last_press = k;
kbd_draw_key(kb, k, true); kbd_draw_key(kb, k, true);
fprintf(stderr,"pressing copy key\n"); fprintf(stderr,"pressing copy key\n");
create_and_upload_keymap(k->code, k->code_mod); create_and_upload_keymap(kb->layout->keymap_name, k->code, k->code_mod);
zwp_virtual_keyboard_v1_modifiers(kb->vkbd, kb->mods, 0, 0, 0); zwp_virtual_keyboard_v1_modifiers(kb->vkbd, kb->mods, 0, 0, 0);
zwp_virtual_keyboard_v1_key(kb->vkbd, time, 127, //COMP key zwp_virtual_keyboard_v1_key(kb->vkbd, time, 127, //COMP key
WL_KEYBOARD_KEY_STATE_PRESSED); WL_KEYBOARD_KEY_STATE_PRESSED);

1471
keymap.h

File diff suppressed because it is too large Load Diff

View File

@ -6,14 +6,12 @@
/* if your layout leaves an empty margin, increase this to fix it */ /* if your layout leaves an empty margin, increase this to fix it */
#define KBD_PIXEL_OVERSCAN_WIDTH 5 #define KBD_PIXEL_OVERSCAN_WIDTH 5
/* Maximum number of keys */
#define KBD_POINTS 66
/* spacing between keys */ /* spacing between keys */
#define KBD_KEY_BORDER 2 #define KBD_KEY_BORDER 2
#include "keyboard.h" #include "keyboard.h"
/* font (see `man fonts-conf` for instructions) */ /* font (see `man fonts-conf` for instructions) */
static const char *fc_font_pattern = static const char *fc_font_pattern =
"Monospace:size=16:antialias=true:hinting=true"; "Monospace:size=16:antialias=true:hinting=true";
@ -23,6 +21,7 @@ enum layout_names {
Full = 0, Full = 0,
Special, Special,
Simple, Simple,
Cyrillic,
ComposeA, ComposeA,
ComposeE, ComposeE,
ComposeY, ComposeY,
@ -52,7 +51,7 @@ enum layout_names {
NumLayouts, NumLayouts,
}; };
static struct key keys_full[], keys_special[], keys_simple[], static struct key keys_full[], keys_special[], keys_simple[], keys_cyrillic[],
keys_compose_a[], keys_compose_a[],
keys_compose_e[], keys_compose_e[],
keys_compose_y[], keys_compose_y[],
@ -81,35 +80,36 @@ static struct key keys_full[], keys_special[], keys_simple[],
keys_compose_m[]; keys_compose_m[];
static struct layout layouts[NumLayouts] = { static struct layout layouts[NumLayouts] = {
[Full] = {keys_full}, [Full] = {keys_full, 0, "latin"}, //third parameter is the keymap name
[Special] = {keys_special}, [Special] = {keys_special, 0, "latin"},
[Simple] = {keys_simple}, [Simple] = {keys_simple, 0, "latin"},
[ComposeA] = {keys_compose_a}, [Cyrillic] = {keys_cyrillic,0, "cyrillic"},
[ComposeE] = {keys_compose_e}, [ComposeA] = {keys_compose_a, 0, "latin"},
[ComposeY] = {keys_compose_y}, [ComposeE] = {keys_compose_e, 0, "latin"},
[ComposeU] = {keys_compose_u}, [ComposeY] = {keys_compose_y, 0, "latin"},
[ComposeI] = {keys_compose_i}, [ComposeU] = {keys_compose_u, 0, "latin"},
[ComposeO] = {keys_compose_o}, [ComposeI] = {keys_compose_i, 0, "latin"},
[ComposeQ] = {keys_compose_q}, [ComposeO] = {keys_compose_o, 0, "latin"},
[ComposeW] = {keys_compose_w}, [ComposeQ] = {keys_compose_q, 0, "latin"},
[ComposeR] = {keys_compose_r}, [ComposeW] = {keys_compose_w, 0, "latin"},
[ComposeT] = {keys_compose_t}, [ComposeR] = {keys_compose_r, 0, "latin"},
[ComposeP] = {keys_compose_p}, [ComposeT] = {keys_compose_t, 0, "latin"},
[ComposeS] = {keys_compose_s}, [ComposeP] = {keys_compose_p, 0, "latin"},
[ComposeD] = {keys_compose_d}, [ComposeS] = {keys_compose_s, 0, "latin"},
[ComposeF] = {keys_compose_f}, [ComposeD] = {keys_compose_d, 0, "latin"},
[ComposeG] = {keys_compose_g}, [ComposeF] = {keys_compose_f, 0, "latin"},
[ComposeH] = {keys_compose_h}, [ComposeG] = {keys_compose_g, 0, "latin"},
[ComposeJ] = {keys_compose_j}, [ComposeH] = {keys_compose_h, 0, "latin"},
[ComposeK] = {keys_compose_k}, [ComposeJ] = {keys_compose_j, 0, "latin"},
[ComposeL] = {keys_compose_l}, [ComposeK] = {keys_compose_k, 0, "latin"},
[ComposeZ] = {keys_compose_z}, [ComposeL] = {keys_compose_l, 0, "latin"},
[ComposeX] = {keys_compose_x}, [ComposeZ] = {keys_compose_z, 0, "latin"},
[ComposeC] = {keys_compose_c}, [ComposeX] = {keys_compose_x, 0, "latin"},
[ComposeV] = {keys_compose_v}, [ComposeC] = {keys_compose_c, 0, "latin"},
[ComposeB] = {keys_compose_b}, [ComposeV] = {keys_compose_v, 0, "latin"},
[ComposeN] = {keys_compose_n}, [ComposeB] = {keys_compose_b, 0, "latin"},
[ComposeM] = {keys_compose_m}, [ComposeN] = {keys_compose_n, 0, "latin"},
[ComposeM] = {keys_compose_m, 0, "latin"},
}; };
const enum layout_names DefaultLayout = Full; const enum layout_names DefaultLayout = Full;
@ -331,7 +331,7 @@ static struct key keys_simple[] = {
{"", "", 1.5, Code, KEY_BACKSPACE}, {"", "", 1.5, Code, KEY_BACKSPACE},
{"", "", 0.0, EndRow}, {"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[(DefaultLayout == Simple) ? Special : DefaultLayout] }, {"Abc", "Abc", 1.0, Layout, 0, &layouts[(DefaultLayout == Simple) ? Special : Cyrillic] },
{"Ctr", "Ctr", 1.0, Mod, Ctrl}, {"Ctr", "Ctr", 1.0, Mod, Ctrl},
{",", "'", 1.0, Code, KEY_COMMA}, {",", "'", 1.0, Code, KEY_COMMA},
{"", "", 4.0, Code, KEY_SPACE}, {"", "", 4.0, Code, KEY_SPACE},
@ -343,6 +343,73 @@ static struct key keys_simple[] = {
{"", "", 0.0, Last}, {"", "", 0.0, Last},
}; };
static struct key keys_cyrillic[] = {
{"1", "!", 1.0, Code, KEY_1},
{"2", "@", 1.0, Code, KEY_2},
{"3", "#", 1.0, Code, KEY_3},
{"4", ";", 1.0, Code, KEY_4},
{"5", "%", 1.0, Code, KEY_5},
{"6", ":", 1.0, Code, KEY_6},
{"7", "&", 1.0, Code, KEY_7},
{"8", "*", 1.0, Code, KEY_8},
{"9", "(", 1.0, Code, KEY_9},
{"0", ")", 1.0, Code, KEY_0},
{"ю", "Ю", 1.0, Code, KEY_DOT},
{"э", "Э", 1.0, Code, KEY_APOSTROPHE},
{"ё", "Ё", 1.0, Code, KEY_GRAVE},
{"", "", 0.0, EndRow},
{"й", "Й", 1.0, Code, KEY_Q},
{"ц", "Ц", 1.0, Code, KEY_W},
{"у", "У", 1.0, Code, KEY_E},
{"к", "К", 1.0, Code, KEY_R},
{"е", "Е", 1.0, Code, KEY_T},
{"н", "Н", 1.0, Code, KEY_Y},
{"г", "Г", 1.0, Code, KEY_U},
{"ш", "ш", 1.0, Code, KEY_I},
{"щ", "щ", 1.0, Code, KEY_O},
{"з", "з", 1.0, Code, KEY_P},
{"х", "Х", 1.0, Code, KEY_LEFTBRACE},
{"ъ", "Ъ", 0.5, Code, KEY_RIGHTBRACE},
{"", "", 0.0, EndRow},
{"ф", "Ф", 1.0, Code, KEY_A},
{"ы", "Ы", 1.0, Code, KEY_S},
{"в", "В", 1.0, Code, KEY_D},
{"а", "А", 1.0, Code, KEY_F},
{"п", "П", 1.0, Code, KEY_G},
{"р", "Р", 1.0, Code, KEY_H},
{"о", "О", 1.0, Code, KEY_J},
{"л", "Л", 1.0, Code, KEY_K},
{"д", "Д", 1.0, Code, KEY_L},
{"ж", "Ж", 1.0, Code, KEY_SEMICOLON},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift},
{"я", "Я", 1.0, Code, KEY_Z},
{"ч", "Ч", 1.0, Code, KEY_X},
{"c", "С", 1.0, Code, KEY_C},
{"м", "М", 1.0, Code, KEY_V},
{"и", "И", 1.0, Code, KEY_B},
{"т", "Т", 1.0, Code, KEY_N},
{"ь", "Ь", 1.0, Code, KEY_M},
{"б", "Б", 1.0, Code, KEY_COMMA},
{"", "", 1.5, Code, KEY_BACKSPACE},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[(DefaultLayout == Cyrillic) ? Full : DefaultLayout] },
{"Ctr", "Ctr", 1.0, Mod, Ctrl},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
{"Entr", "Entr", 2.0, Code, KEY_ENTER},
/* end of layout */
{"", "", 0.0, Last},
};
static struct key keys_compose_a[] = { static struct key keys_compose_a[] = {
{"à", "À", 1.0, Copy, 0x00E0, 0, 0x00C0}, {"à", "À", 1.0, Copy, 0x00E0, 0, 0x00C0},
{"á", "Á", 1.0, Copy, 0x00E1, 0, 0x00C1}, {"á", "Á", 1.0, Copy, 0x00E1, 0, 0x00C1},

10
main.c
View File

@ -17,7 +17,7 @@
/* lazy die macro */ /* lazy die macro */
#define die(...) \ #define die(...) \
fprintf(stderr, __VA_ARGS__); \ fprintf(stderr, __VA_ARGS__); \
exit(0) exit(1)
/* client state */ /* client state */
static const char *namespace = "wlroots"; static const char *namespace = "wlroots";
@ -94,7 +94,7 @@ static void layer_surface_configure(void *data,
uint32_t serial, uint32_t w, uint32_t h); uint32_t serial, uint32_t w, uint32_t h);
static void layer_surface_closed(void *data, static void layer_surface_closed(void *data,
struct zwlr_layer_surface_v1 *surface); struct zwlr_layer_surface_v1 *surface);
static void create_and_upload_keymap(uint32_t comp_unichr, uint32_t comp_shift_unichr); static void create_and_upload_keymap(const char * name, uint32_t comp_unichr, uint32_t comp_shift_unichr);
/* event handlers */ /* event handlers */
static const struct wl_pointer_listener pointer_listener = { static const struct wl_pointer_listener pointer_listener = {
@ -277,8 +277,8 @@ layer_surface_closed(void *data, struct zwlr_layer_surface_v1 *surface) {
} }
void void
create_and_upload_keymap(uint32_t comp_unichr, uint32_t comp_shift_unichr) { create_and_upload_keymap(const char * name, uint32_t comp_unichr, uint32_t comp_shift_unichr) {
const char * keymap_str = get_keymap(comp_unichr, comp_shift_unichr); const char * keymap_str = get_keymap(name, comp_unichr, comp_shift_unichr);
size_t keymap_size = strlen(keymap_str) + 1; size_t keymap_size = strlen(keymap_str) + 1;
int keymap_fd = os_create_anonymous_file(keymap_size); int keymap_fd = os_create_anonymous_file(keymap_size);
if (keymap_fd < 0) { if (keymap_fd < 0) {
@ -327,7 +327,7 @@ main(int argc, char **argv) {
zwp_virtual_keyboard_manager_v1_create_virtual_keyboard(vkbd_mgr, seat); zwp_virtual_keyboard_manager_v1_create_virtual_keyboard(vkbd_mgr, seat);
/* upload keymap */ /* upload keymap */
create_and_upload_keymap(0,0); create_and_upload_keymap(layouts[DefaultLayout].keymap_name, 0,0);
/* assign kbd state */ /* assign kbd state */
keyboard.surf = &draw_surf; keyboard.surf = &draw_surf;