mirror of
https://github.com/jjsullivan5196/wvkbd.git
synced 2025-03-14 03:12:47 +01:00
implemented support for multiple keymaps
This commit is contained in:
parent
cf77edf11c
commit
20b2dc61c3
14
keyboard.h
14
keyboard.h
@ -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);
|
||||||
|
135
layout.mobile.h
135
layout.mobile.h
@ -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
10
main.c
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user