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 key *keys;
uint32_t keyheight; //absolute height (pixels)
const char * keymap_name;
};
struct kbd {
@ -166,6 +167,9 @@ kbd_unpress_key(struct kbd *kb, uint32_t time) {
if (compose >= 2) {
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;
kbd_draw_layout(kb);
}
@ -191,6 +195,9 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) {
if (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->layout = k->layout;
kbd_draw_layout(kb);
@ -224,12 +231,17 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) {
break;
case 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);
case Copy:
kb->last_press = k;
kbd_draw_key(kb, k, true);
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_key(kb->vkbd, time, 127, //COMP key
WL_KEYBOARD_KEY_STATE_PRESSED);

1477
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 */
#define KBD_PIXEL_OVERSCAN_WIDTH 5
/* Maximum number of keys */
#define KBD_POINTS 66
/* spacing between keys */
#define KBD_KEY_BORDER 2
#include "keyboard.h"
/* font (see `man fonts-conf` for instructions) */
static const char *fc_font_pattern =
"Monospace:size=16:antialias=true:hinting=true";
@ -23,6 +21,7 @@ enum layout_names {
Full = 0,
Special,
Simple,
Cyrillic,
ComposeA,
ComposeE,
ComposeY,
@ -52,7 +51,7 @@ enum layout_names {
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_e[],
keys_compose_y[],
@ -81,35 +80,36 @@ static struct key keys_full[], keys_special[], keys_simple[],
keys_compose_m[];
static struct layout layouts[NumLayouts] = {
[Full] = {keys_full},
[Special] = {keys_special},
[Simple] = {keys_simple},
[ComposeA] = {keys_compose_a},
[ComposeE] = {keys_compose_e},
[ComposeY] = {keys_compose_y},
[ComposeU] = {keys_compose_u},
[ComposeI] = {keys_compose_i},
[ComposeO] = {keys_compose_o},
[ComposeQ] = {keys_compose_q},
[ComposeW] = {keys_compose_w},
[ComposeR] = {keys_compose_r},
[ComposeT] = {keys_compose_t},
[ComposeP] = {keys_compose_p},
[ComposeS] = {keys_compose_s},
[ComposeD] = {keys_compose_d},
[ComposeF] = {keys_compose_f},
[ComposeG] = {keys_compose_g},
[ComposeH] = {keys_compose_h},
[ComposeJ] = {keys_compose_j},
[ComposeK] = {keys_compose_k},
[ComposeL] = {keys_compose_l},
[ComposeZ] = {keys_compose_z},
[ComposeX] = {keys_compose_x},
[ComposeC] = {keys_compose_c},
[ComposeV] = {keys_compose_v},
[ComposeB] = {keys_compose_b},
[ComposeN] = {keys_compose_n},
[ComposeM] = {keys_compose_m},
[Full] = {keys_full, 0, "latin"}, //third parameter is the keymap name
[Special] = {keys_special, 0, "latin"},
[Simple] = {keys_simple, 0, "latin"},
[Cyrillic] = {keys_cyrillic,0, "cyrillic"},
[ComposeA] = {keys_compose_a, 0, "latin"},
[ComposeE] = {keys_compose_e, 0, "latin"},
[ComposeY] = {keys_compose_y, 0, "latin"},
[ComposeU] = {keys_compose_u, 0, "latin"},
[ComposeI] = {keys_compose_i, 0, "latin"},
[ComposeO] = {keys_compose_o, 0, "latin"},
[ComposeQ] = {keys_compose_q, 0, "latin"},
[ComposeW] = {keys_compose_w, 0, "latin"},
[ComposeR] = {keys_compose_r, 0, "latin"},
[ComposeT] = {keys_compose_t, 0, "latin"},
[ComposeP] = {keys_compose_p, 0, "latin"},
[ComposeS] = {keys_compose_s, 0, "latin"},
[ComposeD] = {keys_compose_d, 0, "latin"},
[ComposeF] = {keys_compose_f, 0, "latin"},
[ComposeG] = {keys_compose_g, 0, "latin"},
[ComposeH] = {keys_compose_h, 0, "latin"},
[ComposeJ] = {keys_compose_j, 0, "latin"},
[ComposeK] = {keys_compose_k, 0, "latin"},
[ComposeL] = {keys_compose_l, 0, "latin"},
[ComposeZ] = {keys_compose_z, 0, "latin"},
[ComposeX] = {keys_compose_x, 0, "latin"},
[ComposeC] = {keys_compose_c, 0, "latin"},
[ComposeV] = {keys_compose_v, 0, "latin"},
[ComposeB] = {keys_compose_b, 0, "latin"},
[ComposeN] = {keys_compose_n, 0, "latin"},
[ComposeM] = {keys_compose_m, 0, "latin"},
};
const enum layout_names DefaultLayout = Full;
@ -331,7 +331,7 @@ static struct key keys_simple[] = {
{"", "", 1.5, Code, KEY_BACKSPACE},
{"", "", 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},
{",", "'", 1.0, Code, KEY_COMMA},
{"", "", 4.0, Code, KEY_SPACE},
@ -343,6 +343,73 @@ static struct key keys_simple[] = {
{"", "", 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[] = {
{"à", "À", 1.0, Copy, 0x00E0, 0, 0x00C0},
{"á", "Á", 1.0, Copy, 0x00E1, 0, 0x00C1},

10
main.c
View File

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