diff --git a/data/keyboards/geometry/extended.xml b/data/keyboards/geometry/extended.xml index c73217e0..50938efb 100644 --- a/data/keyboards/geometry/extended.xml +++ b/data/keyboards/geometry/extended.xml @@ -1,7 +1,10 @@ - +
diff --git a/eekboard/eekboard-context-service.c b/eekboard/eekboard-context-service.c index 67c8b2d7..434e5756 100644 --- a/eekboard/eekboard-context-service.c +++ b/eekboard/eekboard-context-service.c @@ -156,6 +156,7 @@ eekboard_context_service_real_create_keyboard (EekboardContextService *self, g_error("Bad keymap"); } keyboard->keymap = keymap; + char *keymap_str = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1); keyboard->keymap_len = strlen(keymap_str) + 1; diff --git a/eekboard/key-emitter.c b/eekboard/key-emitter.c index 539c2331..9a07e015 100644 --- a/eekboard/key-emitter.c +++ b/eekboard/key-emitter.c @@ -137,14 +137,15 @@ int send_virtual_keyboard_key( unsigned is_press, uint32_t timestamp ) { + g_debug("send_virtual_keyboard_key: %u", keycode); zwp_virtual_keyboard_v1_key(keyboard, timestamp, keycode, (unsigned)is_press); return 0; } static void send_fake_modifiers_events (SeatEmitter *emitter, - EekModifierType modifiers, - uint32_t timestamp) + EekModifierType modifiers, + uint32_t timestamp) { (void)timestamp; @@ -158,6 +159,7 @@ send_fake_modifiers_events (SeatEmitter *emitter, if (modifiers & EEK_MOD1_MASK) { proto_modifiers |= 1<virtual_keyboard, proto_modifiers, 0, 0, emitter->group); } @@ -172,6 +174,7 @@ send_fake_key_event (SeatEmitter *emitter, guint old_keysym = xkeysym; g_return_if_fail (xkeysym > 0); + g_debug("send_fake_key_event: %i %i", xkeysym, keyboard_modifiers); guint keycode; if (!get_keycode_from_gdk_keymap (emitter, xkeysym, &keycode, &modifiers)) { @@ -214,6 +217,7 @@ send_fake_key_events (SeatEmitter *emitter, if (eek_symbol_is_modifier (symbol)) return; + g_debug("symbol: %s", eek_symbol_get_name(symbol)); /* If symbol is a text, convert chars in it to keysym */ if (EEK_IS_TEXT(symbol)) { const gchar *utf8 = eek_text_get_text (EEK_TEXT(symbol)); @@ -243,6 +247,7 @@ send_fake_key_events (SeatEmitter *emitter, } if (EEK_IS_KEYSYM(symbol)) { + g_debug("keysym: %u", eek_keysym_get_xkeysym(EEK_KEYSYM(symbol))); guint xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol)); send_fake_key_event (emitter, xkeysym, keyboard_modifiers, pressed, timestamp); } @@ -284,6 +289,30 @@ update_modifier_info (SeatEmitter *client) }*/ } +static void +send_fake_key (SeatEmitter *emitter, + EekKeyboard *keyboard, + 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); + + g_debug("send_fake_key: %u %u", keycode, keyboard_modifiers); + g_debug("level: %u", level); + g_debug("group: %u", group); + + if (keyboard_modifiers & EEK_SHIFT_MASK) + proto_modifiers |= 1<virtual_keyboard, proto_modifiers, 0, 0, group); + send_virtual_keyboard_key (emitter->virtual_keyboard, keycode - 8, (unsigned)pressed, timestamp); + zwp_virtual_keyboard_v1_modifiers(emitter->virtual_keyboard, proto_modifiers, 0, 0, group); +} + void emit_key_activated (EekboardContextService *manager, EekKeyboard *keyboard, @@ -293,6 +322,8 @@ emit_key_activated (EekboardContextService *manager, gboolean pressed, uint32_t timestamp) { + g_debug("symbol: %s", eek_symbol_get_name(symbol)); + g_debug("keycode: %u", keycode); /* FIXME: figure out how to deal with Client after key presses go through if (g_strcmp0 (eek_symbol_get_name (symbol), "cycle-keyboard") == 0) { client->keyboards_head = g_slist_next (client->keyboards_head); @@ -324,5 +355,5 @@ emit_key_activated (EekboardContextService *manager, emitter.virtual_keyboard = manager->virtual_keyboard; emitter.keymap = keyboard->keymap; update_modifier_info (&emitter); - send_fake_key_events (&emitter, symbol, modifiers, pressed, timestamp); + send_fake_key (&emitter, keyboard, keycode, modifiers, pressed, timestamp); } diff --git a/eekboard/keymap.h b/eekboard/keymap.h index 13b3cc80..e360bd67 100644 --- a/eekboard/keymap.h +++ b/eekboard/keymap.h @@ -261,26 +261,22 @@ xkb_keycodes \"squeekboard\" {\ };\ \ xkb_symbols \"squeekboard\" {\ - key { [ 4, dollar, EuroSign, onequarter ] };\ +\ + name[Group1] = \"Letters\";\ + name[Group2] = \"Numbers/Symbols\";\ +\ + key { [ q, Q ], [ 1, asciitilde ] };\ + key { [ w, W ], [ 2, quoteleft ] };\ + key { [ 4, dollar ], [ EuroSign, onequarter ] };\ };\ \ xkb_types \"squeekboard\" {\ - type \"ONE_LEVEL\" {\ - modifiers= none;\ - level_name[Level1]= \"Any\";\ - };\ +\ type \"TWO_LEVEL\" {\ - modifiers= Shift;\ - map[Shift]= Level2;\ - level_name[Level1]= \"Base\";\ - level_name[Level2]= \"Shift\";\ - };\ - type \"ALPHABETIC\" {\ - modifiers= Shift+Lock;\ - map[Shift]= Level2;\ - map[Lock]= Level2;\ - level_name[Level1]= \"Base\";\ - level_name[Level2]= \"Caps\";\ + modifiers = Shift;\ + map[Shift] = Level2;\ + level_name[Level1] = \"Base\";\ + level_name[Level2] = \"Shift\";\ };\ };\ \