mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-11-02 09:01:39 -05:00
Update modifier state on focus in and out.
This commit is contained in:
parent
3c38fa0c3e
commit
99f090db3e
1 changed files with 32 additions and 17 deletions
49
window.c
49
window.c
|
|
@ -436,15 +436,9 @@ struct key {
|
||||||
#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
|
#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
|
||||||
|
|
||||||
static void
|
static void
|
||||||
window_handle_key(void *data, struct wl_input_device *input_device,
|
window_update_modifiers(struct window *window, uint32_t key, uint32_t state)
|
||||||
uint32_t key, uint32_t state)
|
|
||||||
{
|
{
|
||||||
struct window *window = data;
|
|
||||||
uint32_t mod = 0;
|
uint32_t mod = 0;
|
||||||
uint32_t unicode = 0;
|
|
||||||
|
|
||||||
if (window->keyboard_device != input_device)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case KEY_LEFTSHIFT:
|
case KEY_LEFTSHIFT:
|
||||||
|
|
@ -459,22 +453,34 @@ window_handle_key(void *data, struct wl_input_device *input_device,
|
||||||
case KEY_RIGHTALT:
|
case KEY_RIGHTALT:
|
||||||
mod = WINDOW_MODIFIER_ALT;
|
mod = WINDOW_MODIFIER_ALT;
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
if (key < ARRAY_LENGTH(evdev_keymap)) {
|
|
||||||
if (window->modifiers & WINDOW_MODIFIER_CONTROL)
|
|
||||||
unicode = evdev_keymap[key].code[2];
|
|
||||||
else if (window->modifiers & WINDOW_MODIFIER_SHIFT)
|
|
||||||
unicode = evdev_keymap[key].code[1];
|
|
||||||
else
|
|
||||||
unicode = evdev_keymap[key].code[0];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state)
|
if (state)
|
||||||
window->modifiers |= mod;
|
window->modifiers |= mod;
|
||||||
else
|
else
|
||||||
window->modifiers &= ~mod;
|
window->modifiers &= ~mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
window_handle_key(void *data, struct wl_input_device *input_device,
|
||||||
|
uint32_t key, uint32_t state)
|
||||||
|
{
|
||||||
|
struct window *window = data;
|
||||||
|
uint32_t unicode = 0;
|
||||||
|
|
||||||
|
if (window->keyboard_device != input_device)
|
||||||
|
return;
|
||||||
|
|
||||||
|
window_update_modifiers(window, key, state);
|
||||||
|
|
||||||
|
if (key < ARRAY_LENGTH(evdev_keymap)) {
|
||||||
|
if (window->modifiers & WINDOW_MODIFIER_CONTROL)
|
||||||
|
unicode = evdev_keymap[key].code[2];
|
||||||
|
else if (window->modifiers & WINDOW_MODIFIER_SHIFT)
|
||||||
|
unicode = evdev_keymap[key].code[1];
|
||||||
|
else
|
||||||
|
unicode = evdev_keymap[key].code[0];
|
||||||
|
}
|
||||||
|
|
||||||
if (window->key_handler)
|
if (window->key_handler)
|
||||||
(*window->key_handler)(window, key, unicode,
|
(*window->key_handler)(window, key, unicode,
|
||||||
|
|
@ -495,6 +501,7 @@ window_handle_keyboard_focus(void *data,
|
||||||
struct wl_array *keys)
|
struct wl_array *keys)
|
||||||
{
|
{
|
||||||
struct window *window = data;
|
struct window *window = data;
|
||||||
|
uint32_t *k, *end;
|
||||||
|
|
||||||
if (window->keyboard_device == input_device && surface != window->surface)
|
if (window->keyboard_device == input_device && surface != window->surface)
|
||||||
window->keyboard_device = NULL;
|
window->keyboard_device = NULL;
|
||||||
|
|
@ -503,6 +510,14 @@ window_handle_keyboard_focus(void *data,
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (window->keyboard_device) {
|
||||||
|
end = keys->data + keys->size;
|
||||||
|
for (k = keys->data; k < end; k++)
|
||||||
|
window_update_modifiers(window, *k, 1);
|
||||||
|
} else {
|
||||||
|
window->modifiers = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (window->keyboard_focus_handler)
|
if (window->keyboard_focus_handler)
|
||||||
(*window->keyboard_focus_handler)(window,
|
(*window->keyboard_focus_handler)(window,
|
||||||
window->keyboard_device,
|
window->keyboard_device,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue