Add an initial URL keyboard and support for text macros

Text associated with a symbol on a key is sent using the keymap
associated with each keyboard, so the individual symbols need to be
defined in order to be usable in a text macro.
This commit is contained in:
David Boddie
2019-07-22 16:36:17 +00:00
parent d6b59d16fd
commit ecc46733da
9 changed files with 412 additions and 4 deletions

View File

@ -84,14 +84,13 @@ update_modifier_info (SeatEmitter *client)
static void
send_fake_key (SeatEmitter *emitter,
EekKeyboard *keyboard,
guint level,
guint keycode,
guint keyboard_modifiers,
gboolean pressed,
uint32_t timestamp)
{
uint32_t proto_modifiers = 0;
guint level = eek_element_get_level(EEK_ELEMENT(keyboard));
uint32_t group = (level / 2);
if (keyboard_modifiers & EEK_SHIFT_MASK)
@ -102,6 +101,38 @@ send_fake_key (SeatEmitter *emitter,
zwp_virtual_keyboard_v1_modifiers(emitter->virtual_keyboard, proto_modifiers, 0, 0, group);
}
static void
send_fake_text (SeatEmitter *emitter,
EekKeyboard *keyboard,
gchar *text,
uint32_t timestamp)
{
while (*text) {
gchar buf[7];
gunichar c = g_utf8_get_char(text);
int n = g_unichar_to_utf8(c, buf);
*(buf + n) = 0;
EekKeyPress *key_press = eek_keyboard_get_key_press(keyboard, buf);
if (key_press) {
EekKey *key = key_press->key;
EekSymbolMatrix *matrix = eek_key_get_symbol_matrix(key);
EekSymbol *sym = eek_symbol_matrix_get_symbol(matrix, 0, key_press->level);
send_fake_key (emitter, key_press->level, eek_key_get_keycode(key),
(key_press->level % 2) == 1 ? EEK_SHIFT_MASK : 0,
1, timestamp);
send_fake_key (emitter, key_press->level, eek_key_get_keycode(key),
(key_press->level % 2) == 1 ? EEK_SHIFT_MASK : 0,
0, timestamp);
}
text = g_utf8_find_next_char(text, NULL);
}
}
void
emit_key_activated (EekboardContextService *manager,
EekKeyboard *keyboard,
@ -142,5 +173,12 @@ emit_key_activated (EekboardContextService *manager,
emitter.virtual_keyboard = manager->virtual_keyboard;
emitter.keymap = keyboard->keymap;
update_modifier_info (&emitter);
send_fake_key (&emitter, keyboard, keycode, modifiers, pressed, timestamp);
guint level = eek_element_get_level(EEK_ELEMENT(keyboard));
if (EEK_IS_TEXT(symbol) && pressed) {
gchar *text = (gchar *)eek_text_get_text(EEK_TEXT(symbol));
send_fake_text (&emitter, keyboard, text, timestamp);
} else
send_fake_key (&emitter, level, keycode, modifiers, pressed, timestamp);
}