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:
@ -309,6 +309,10 @@ settings_update_layout(EekboardContextService *context)
|
||||
case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PHONE:
|
||||
keyboard_layout = g_strdup("number");
|
||||
break;
|
||||
case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_URL:
|
||||
keyboard_layout = g_strdup("url");
|
||||
break;
|
||||
case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL:
|
||||
default:
|
||||
;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user