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,14 +137,15 @@ 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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
send_fake_modifiers_events (SeatEmitter         *emitter,
 | 
					send_fake_modifiers_events (SeatEmitter         *emitter,
 | 
				
			||||||
                              EekModifierType modifiers,
 | 
					                            EekModifierType      modifiers,
 | 
				
			||||||
                              uint32_t        timestamp)
 | 
					                            uint32_t             timestamp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    (void)timestamp;
 | 
					    (void)timestamp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -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