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:
		@ -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