added cyrillic compose layers and made compose work with non-code keys

This commit is contained in:
Maarten van Gompel 2021-08-23 23:31:51 +02:00 committed by John Sullivan
parent e3f414536e
commit 8abc3326df
2 changed files with 247 additions and 35 deletions

View File

@ -180,6 +180,19 @@ kbd_unpress_key(struct kbd *kb, uint32_t time) {
void
kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) {
if ((compose == 1) && (k->type != Compose) && (k->type != Mod) && (k->layout)) {
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);
kb->surf->dirty = true;
return;
}
switch (k->type) {
case Code:
if (k->code_mod) {
@ -191,28 +204,13 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) {
} else {
zwp_virtual_keyboard_v1_modifiers(kb->vkbd, kb->mods, 0, 0, 0);
}
if (compose == 1) {
if (k->layout) {
compose++;
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);
}
} else {
kb->last_press = k;
kbd_draw_key(kb, k, true);
zwp_virtual_keyboard_v1_key(kb->vkbd, time, kb->last_press->code,
WL_KEYBOARD_KEY_STATE_PRESSED);
if (compose) {
fprintf(stderr,"pressing composed key\n");
compose++;
}
kb->last_press = k;
kbd_draw_key(kb, k, true);
zwp_virtual_keyboard_v1_key(kb->vkbd, time, kb->last_press->code,
WL_KEYBOARD_KEY_STATE_PRESSED);
if (compose) {
fprintf(stderr,"pressing composed key\n");
compose++;
}
break;
case Mod:

View File

@ -48,6 +48,16 @@ enum layout_names {
ComposeB,
ComposeN,
ComposeM,
ComposeCyrI,
ComposeCyrJ,
ComposeCyrE,
ComposeCyrU,
ComposeCyrL,
ComposeCyrN,
ComposeCyrTse,
ComposeCyrChe,
ComposeCyrG,
ComposeCyrK,
NumLayouts,
};
@ -77,7 +87,17 @@ static struct key keys_full[], keys_special[], keys_simple[], keys_cyrillic[],
keys_compose_v[],
keys_compose_b[],
keys_compose_n[],
keys_compose_m[];
keys_compose_m[],
keys_compose_cyr_i[],
keys_compose_cyr_j[],
keys_compose_cyr_e[],
keys_compose_cyr_u[],
keys_compose_cyr_l[],
keys_compose_cyr_n[],
keys_compose_cyr_tse[],
keys_compose_cyr_che[],
keys_compose_cyr_g[],
keys_compose_cyr_k[];
static struct layout layouts[NumLayouts] = {
[Full] = {keys_full, 0, "latin"}, //third parameter is the keymap name
@ -110,6 +130,16 @@ static struct layout layouts[NumLayouts] = {
[ComposeB] = {keys_compose_b, 0, "latin"},
[ComposeN] = {keys_compose_n, 0, "latin"},
[ComposeM] = {keys_compose_m, 0, "latin"},
[ComposeCyrI] = {keys_compose_cyr_i, 0, "cyrillic"},
[ComposeCyrJ] = {keys_compose_cyr_j, 0, "cyrillic"},
[ComposeCyrE] = {keys_compose_cyr_e, 0, "cyrillic"},
[ComposeCyrU] = {keys_compose_cyr_u, 0, "cyrillic"},
[ComposeCyrL] = {keys_compose_cyr_l, 0, "cyrillic"},
[ComposeCyrN] = {keys_compose_cyr_n, 0, "cyrillic"},
[ComposeCyrTse] = {keys_compose_cyr_tse, 0, "cyrillic"},
[ComposeCyrChe] = {keys_compose_cyr_che, 0, "cyrillic"},
[ComposeCyrG] = {keys_compose_cyr_g, 0, "cyrillic"},
[ComposeCyrK] = {keys_compose_cyr_k, 0, "cyrillic"},
};
const enum layout_names DefaultLayout = Full;
@ -363,17 +393,17 @@ static struct key keys_cyrillic[] = {
{"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},
{"э", "Э", 1.0, Code, KEY_APOSTROPHE, &layouts[ComposeCyrE]},
{"ё", "Ё", 1.0, Code, KEY_GRAVE, &layouts[ComposeCyrE]},
{"", "", 0.0, EndRow},
{"й", "Й", 1.0, Code, KEY_Q},
{"ц", "Ц", 1.0, Code, KEY_W},
{"й", "Й", 1.0, Code, KEY_Q, &layouts[ComposeCyrJ]},
{"ц", "Ц", 1.0, Code, KEY_W, &layouts[ComposeCyrTse]},
{"у", "У", 1.0, Code, KEY_E},
{"к", "К", 1.0, Code, KEY_R},
{"е", "Е", 1.0, Code, KEY_T},
{"к", "К", 1.0, Code, KEY_R, &layouts[ComposeCyrK]},
{"е", "Е", 1.0, Code, KEY_T, &layouts[ComposeCyrE]},
{"н", "Н", 1.0, Code, KEY_Y},
{"г", "Г", 1.0, Code, KEY_U},
{"г", "Г", 1.0, Code, KEY_U, &layouts[ComposeCyrG]},
{"ш", "ш", 1.0, Code, KEY_I},
{"щ", "щ", 1.0, Code, KEY_O},
{"з", "з", 1.0, Code, KEY_P},
@ -382,23 +412,23 @@ static struct key keys_cyrillic[] = {
{"", "", 0.0, EndRow},
{"ф", "Ф", 1.0, Code, KEY_A},
{"ы", "Ы", 1.0, Code, KEY_S},
{"ы", "Ы", 1.0, Code, KEY_S, &layouts[ComposeCyrI]},
{"в", "В", 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_K, &layouts[ComposeCyrL]},
{"д", "Д", 1.0, Code, KEY_L},
{"ж", "Ж", 1.0, Code, KEY_SEMICOLON},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme=1},
{"я", "Я", 1.0, Code, KEY_Z},
{"ч", "Ч", 1.0, Code, KEY_X},
{"ч", "Ч", 1.0, Code, KEY_X, &layouts[ComposeCyrChe]},
{"c", "С", 1.0, Code, KEY_C},
{"м", "М", 1.0, Code, KEY_V},
{"и", "И", 1.0, Code, KEY_B},
{"и", "И", 1.0, Code, KEY_B, &layouts[ComposeCyrI]},
{"т", "Т", 1.0, Code, KEY_N},
{"ь", "Ь", 1.0, Code, KEY_M},
{"б", "Б", 1.0, Code, KEY_COMMA},
@ -407,7 +437,7 @@ static struct key keys_cyrillic[] = {
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[(DefaultLayout == Cyrillic) ? Full : DefaultLayout] , .scheme=1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme=1},
{"Cmp", "Cmp", 1.0, Compose, .scheme=1},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
@ -1021,3 +1051,187 @@ static struct key keys_compose_m[] = {
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme=1},
{"", "", 0.0, Last},
};
static struct key keys_compose_cyr_i[] = {
{"і", "І", 1.0, Copy, 0x0456, 0, 0x0406},
{"ї", "Ї", 1.0, Copy, 0x0457, 0, 0x0407},
{"", "", 8.0, Pad },
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme=1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme=1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[Cyrillic], .scheme=1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme=1},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme=1},
{"", "", 0.0, Last},
};
static struct key keys_compose_cyr_j[] = {
{"ј", "Ј", 1.0, Copy, 0x0458, 0, 0x0408},
{"", "", 9.0, Pad },
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme=1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme=1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[Cyrillic], .scheme=1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme=1},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme=1},
{"", "", 0.0, Last},
};
static struct key keys_compose_cyr_e[] = {
{"є", "Є", 1.0, Copy, 0x0454, 0, 0x0404},
{"", "", 9.0, Pad },
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme=1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme=1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[Cyrillic], .scheme=1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme=1},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme=1},
{"", "", 0.0, Last},
};
static struct key keys_compose_cyr_u[] = {
{"ў", "Ў", 1.0, Copy, 0x045E, 0, 0x040E},
{"", "", 9.0, Pad },
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme=1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme=1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[Cyrillic], .scheme=1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme=1},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme=1},
{"", "", 0.0, Last},
};
static struct key keys_compose_cyr_l[] = {
{"љ", "Љ", 1.0, Copy, 0x0459, 0, 0x0409},
{"", "", 9.0, Pad },
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme=1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme=1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[Cyrillic], .scheme=1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme=1},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme=1},
{"", "", 0.0, Last},
};
static struct key keys_compose_cyr_n[] = {
{"њ", "Њ", 1.0, Copy, 0x045A, 0, 0x040A},
{"", "", 9.0, Pad },
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme=1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme=1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[Cyrillic], .scheme=1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme=1},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme=1},
{"", "", 0.0, Last},
};
static struct key keys_compose_cyr_che[] = {
{"ћ", "Ћ", 1.0, Copy, 0x045B, 0, 0x040B},
{"ђ", "Ђ", 1.0, Copy, 0x0452, 0, 0x0402},
{"", "", 8.0, Pad },
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme=1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme=1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[Cyrillic], .scheme=1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme=1},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme=1},
{"", "", 0.0, Last},
};
static struct key keys_compose_cyr_tse[] = {
{"џ", "Џ", 1.0, Copy, 0x045F, 0, 0x040F},
{"ѕ", "Ѕ", 1.0, Copy, 0x0455, 0, 0x0405},
{"", "", 8.0, Pad },
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme=1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme=1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[Cyrillic], .scheme=1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme=1},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme=1},
{"", "", 0.0, Last},
};
static struct key keys_compose_cyr_g[] = {
{"ѓ", "Ѓ", 1.0, Copy, 0x0453, 0, 0x0403},
{"", "", 9.0, Pad },
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme=1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme=1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[Cyrillic], .scheme=1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme=1},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme=1},
{"", "", 0.0, Last},
};
static struct key keys_compose_cyr_k[] = {
{"ќ", "Ќ", 1.0, Copy, 0x0453, 0, 0x040C},
{"", "", 9.0, Pad },
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme=1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme=1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, Layout, 0, &layouts[Cyrillic], .scheme=1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme=1},
{",", "'", 1.0, Code, KEY_EQUAL},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_SLASH},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme=1},
{"", "", 0.0, Last},
};