Use groups to reference keysyms in the keymap
This commit is contained in:
@ -1,7 +1,10 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<geometry version="0.90">
|
<geometry version="0.90">
|
||||||
<bounds x="0" y="10.000000" width="426.0000" height="296.5853"/>
|
<bounds x="0" y="10.000000" width="426.0000" height="296.5853"/>
|
||||||
<!-- keycodes correspond to those used in /usr/share/X11/xkb/keycodes -->
|
<!-- Keycodes correspond to those used in /usr/share/X11/xkb/keycodes/evdev.
|
||||||
|
For Squeekboard, the values have no connection to evdev. They are only
|
||||||
|
used as indices into the keymap sent to the compositor. They must have
|
||||||
|
values in the range from 8 to 255. -->
|
||||||
<section angle="0">
|
<section angle="0">
|
||||||
<row orientation="1">
|
<row orientation="1">
|
||||||
<key name="AD01" keycode="24" oref="outline2" />
|
<key name="AD01" keycode="24" oref="outline2" />
|
||||||
|
|||||||
@ -156,6 +156,7 @@ eekboard_context_service_real_create_keyboard (EekboardContextService *self,
|
|||||||
g_error("Bad keymap");
|
g_error("Bad keymap");
|
||||||
}
|
}
|
||||||
keyboard->keymap = keymap;
|
keyboard->keymap = keymap;
|
||||||
|
|
||||||
char *keymap_str = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
|
char *keymap_str = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
|
||||||
keyboard->keymap_len = strlen(keymap_str) + 1;
|
keyboard->keymap_len = strlen(keymap_str) + 1;
|
||||||
|
|
||||||
|
|||||||
@ -137,6 +137,7 @@ int send_virtual_keyboard_key(
|
|||||||
unsigned is_press,
|
unsigned is_press,
|
||||||
uint32_t timestamp
|
uint32_t timestamp
|
||||||
) {
|
) {
|
||||||
|
g_debug("send_virtual_keyboard_key: %u", keycode);
|
||||||
zwp_virtual_keyboard_v1_key(keyboard, timestamp, keycode, (unsigned)is_press);
|
zwp_virtual_keyboard_v1_key(keyboard, timestamp, keycode, (unsigned)is_press);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -158,6 +159,7 @@ send_fake_modifiers_events (SeatEmitter *emitter,
|
|||||||
if (modifiers & EEK_MOD1_MASK) {
|
if (modifiers & EEK_MOD1_MASK) {
|
||||||
proto_modifiers |= 1<<MOD_IDX_ALT;
|
proto_modifiers |= 1<<MOD_IDX_ALT;
|
||||||
}
|
}
|
||||||
|
g_debug("send_fake_modifiers_events: %u", proto_modifiers);
|
||||||
zwp_virtual_keyboard_v1_modifiers(emitter->virtual_keyboard, proto_modifiers, 0, 0, emitter->group);
|
zwp_virtual_keyboard_v1_modifiers(emitter->virtual_keyboard, proto_modifiers, 0, 0, emitter->group);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,6 +174,7 @@ send_fake_key_event (SeatEmitter *emitter,
|
|||||||
guint old_keysym = xkeysym;
|
guint old_keysym = xkeysym;
|
||||||
|
|
||||||
g_return_if_fail (xkeysym > 0);
|
g_return_if_fail (xkeysym > 0);
|
||||||
|
g_debug("send_fake_key_event: %i %i", xkeysym, keyboard_modifiers);
|
||||||
|
|
||||||
guint keycode;
|
guint keycode;
|
||||||
if (!get_keycode_from_gdk_keymap (emitter, xkeysym, &keycode, &modifiers)) {
|
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))
|
if (eek_symbol_is_modifier (symbol))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
g_debug("symbol: %s", eek_symbol_get_name(symbol));
|
||||||
/* If symbol is a text, convert chars in it to keysym */
|
/* If symbol is a text, convert chars in it to keysym */
|
||||||
if (EEK_IS_TEXT(symbol)) {
|
if (EEK_IS_TEXT(symbol)) {
|
||||||
const gchar *utf8 = eek_text_get_text (EEK_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)) {
|
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));
|
guint xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
|
||||||
send_fake_key_event (emitter, xkeysym, keyboard_modifiers, pressed, timestamp);
|
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<<MOD_IDX_SHIFT;
|
||||||
|
|
||||||
|
zwp_virtual_keyboard_v1_modifiers(emitter->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
|
void
|
||||||
emit_key_activated (EekboardContextService *manager,
|
emit_key_activated (EekboardContextService *manager,
|
||||||
EekKeyboard *keyboard,
|
EekKeyboard *keyboard,
|
||||||
@ -293,6 +322,8 @@ emit_key_activated (EekboardContextService *manager,
|
|||||||
gboolean pressed,
|
gboolean pressed,
|
||||||
uint32_t timestamp)
|
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
|
/* FIXME: figure out how to deal with Client after key presses go through
|
||||||
if (g_strcmp0 (eek_symbol_get_name (symbol), "cycle-keyboard") == 0) {
|
if (g_strcmp0 (eek_symbol_get_name (symbol), "cycle-keyboard") == 0) {
|
||||||
client->keyboards_head = g_slist_next (client->keyboards_head);
|
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.virtual_keyboard = manager->virtual_keyboard;
|
||||||
emitter.keymap = keyboard->keymap;
|
emitter.keymap = keyboard->keymap;
|
||||||
update_modifier_info (&emitter);
|
update_modifier_info (&emitter);
|
||||||
send_fake_key_events (&emitter, symbol, modifiers, pressed, timestamp);
|
send_fake_key (&emitter, keyboard, keycode, modifiers, pressed, timestamp);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -261,26 +261,22 @@ xkb_keycodes \"squeekboard\" {\
|
|||||||
};\
|
};\
|
||||||
\
|
\
|
||||||
xkb_symbols \"squeekboard\" {\
|
xkb_symbols \"squeekboard\" {\
|
||||||
key <AE04> { [ 4, dollar, EuroSign, onequarter ] };\
|
\
|
||||||
|
name[Group1] = \"Letters\";\
|
||||||
|
name[Group2] = \"Numbers/Symbols\";\
|
||||||
|
\
|
||||||
|
key <AD01> { [ q, Q ], [ 1, asciitilde ] };\
|
||||||
|
key <AD02> { [ w, W ], [ 2, quoteleft ] };\
|
||||||
|
key <AE04> { [ 4, dollar ], [ EuroSign, onequarter ] };\
|
||||||
};\
|
};\
|
||||||
\
|
\
|
||||||
xkb_types \"squeekboard\" {\
|
xkb_types \"squeekboard\" {\
|
||||||
type \"ONE_LEVEL\" {\
|
\
|
||||||
modifiers= none;\
|
|
||||||
level_name[Level1]= \"Any\";\
|
|
||||||
};\
|
|
||||||
type \"TWO_LEVEL\" {\
|
type \"TWO_LEVEL\" {\
|
||||||
modifiers= Shift;\
|
modifiers = Shift;\
|
||||||
map[Shift]= Level2;\
|
map[Shift] = Level2;\
|
||||||
level_name[Level1]= \"Base\";\
|
level_name[Level1] = \"Base\";\
|
||||||
level_name[Level2]= \"Shift\";\
|
level_name[Level2] = \"Shift\";\
|
||||||
};\
|
|
||||||
type \"ALPHABETIC\" {\
|
|
||||||
modifiers= Shift+Lock;\
|
|
||||||
map[Shift]= Level2;\
|
|
||||||
map[Lock]= Level2;\
|
|
||||||
level_name[Level1]= \"Base\";\
|
|
||||||
level_name[Level2]= \"Caps\";\
|
|
||||||
};\
|
};\
|
||||||
};\
|
};\
|
||||||
\
|
\
|
||||||
|
|||||||
Reference in New Issue
Block a user