mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-02 11:55:59 +01:00
Merge pull request #553 from acrisci/modifier-fixes
compositor modifier hooks
This commit is contained in:
commit
1fbd6cb0f0
8 changed files with 142 additions and 72 deletions
|
@ -32,6 +32,13 @@ enum wlr_keyboard_modifier {
|
||||||
|
|
||||||
struct wlr_keyboard_impl;
|
struct wlr_keyboard_impl;
|
||||||
|
|
||||||
|
struct wlr_keyboard_modifiers {
|
||||||
|
xkb_mod_mask_t depressed;
|
||||||
|
xkb_mod_mask_t latched;
|
||||||
|
xkb_mod_mask_t locked;
|
||||||
|
xkb_mod_mask_t group;
|
||||||
|
};
|
||||||
|
|
||||||
struct wlr_keyboard {
|
struct wlr_keyboard {
|
||||||
struct wlr_keyboard_impl *impl;
|
struct wlr_keyboard_impl *impl;
|
||||||
// TODO: Should this store key repeat info too?
|
// TODO: Should this store key repeat info too?
|
||||||
|
@ -45,12 +52,7 @@ struct wlr_keyboard {
|
||||||
|
|
||||||
uint32_t keycodes[WLR_KEYBOARD_KEYS_CAP];
|
uint32_t keycodes[WLR_KEYBOARD_KEYS_CAP];
|
||||||
size_t num_keycodes;
|
size_t num_keycodes;
|
||||||
struct {
|
struct wlr_keyboard_modifiers modifiers;
|
||||||
xkb_mod_mask_t depressed;
|
|
||||||
xkb_mod_mask_t latched;
|
|
||||||
xkb_mod_mask_t locked;
|
|
||||||
xkb_mod_mask_t group;
|
|
||||||
} modifiers;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
int32_t rate;
|
int32_t rate;
|
||||||
|
|
|
@ -68,10 +68,12 @@ struct wlr_seat_keyboard_grab;
|
||||||
|
|
||||||
struct wlr_keyboard_grab_interface {
|
struct wlr_keyboard_grab_interface {
|
||||||
void (*enter)(struct wlr_seat_keyboard_grab *grab,
|
void (*enter)(struct wlr_seat_keyboard_grab *grab,
|
||||||
struct wlr_surface *surface);
|
struct wlr_surface *surface, uint32_t keycodes[],
|
||||||
|
size_t num_keycodes, struct wlr_keyboard_modifiers *modifiers);
|
||||||
void (*key)(struct wlr_seat_keyboard_grab *grab, uint32_t time,
|
void (*key)(struct wlr_seat_keyboard_grab *grab, uint32_t time,
|
||||||
uint32_t key, uint32_t state);
|
uint32_t key, uint32_t state);
|
||||||
void (*modifiers)(struct wlr_seat_keyboard_grab *grab);
|
void (*modifiers)(struct wlr_seat_keyboard_grab *grab,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers);
|
||||||
void (*cancel)(struct wlr_seat_keyboard_grab *grab);
|
void (*cancel)(struct wlr_seat_keyboard_grab *grab);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -344,6 +346,11 @@ bool wlr_seat_pointer_has_grab(struct wlr_seat *seat);
|
||||||
*/
|
*/
|
||||||
void wlr_seat_set_keyboard(struct wlr_seat *seat, struct wlr_input_device *dev);
|
void wlr_seat_set_keyboard(struct wlr_seat *seat, struct wlr_input_device *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the active keyboard for the seat.
|
||||||
|
*/
|
||||||
|
struct wlr_keyboard *wlr_seat_get_keyboard(struct wlr_seat *seat);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start a grab of the keyboard of this seat. The grabber is responsible for
|
* Start a grab of the keyboard of this seat. The grabber is responsible for
|
||||||
* handling all keyboard events until the grab ends.
|
* handling all keyboard events until the grab ends.
|
||||||
|
@ -375,21 +382,24 @@ void wlr_seat_keyboard_notify_key(struct wlr_seat *seat, uint32_t time,
|
||||||
* Send the modifier state to focused keyboard resources. Compositors should use
|
* Send the modifier state to focused keyboard resources. Compositors should use
|
||||||
* `wlr_seat_keyboard_notify_modifiers()` to respect any keyboard grabs.
|
* `wlr_seat_keyboard_notify_modifiers()` to respect any keyboard grabs.
|
||||||
*/
|
*/
|
||||||
void wlr_seat_keyboard_send_modifiers(struct wlr_seat *seat);
|
void wlr_seat_keyboard_send_modifiers(struct wlr_seat *seat,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify the seat that the modifiers for the keyboard have changed. Defers to
|
* Notify the seat that the modifiers for the keyboard have changed. Defers to
|
||||||
* any keyboard grabs.
|
* any keyboard grabs.
|
||||||
*/
|
*/
|
||||||
void wlr_seat_keyboard_notify_modifiers(struct wlr_seat *seat);
|
void wlr_seat_keyboard_notify_modifiers(struct wlr_seat *seat,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify the seat that the keyboard focus has changed and request it to be the
|
* Notify the seat that the keyboard focus has changed and request it to be the
|
||||||
* focused surface for this keyboard. Defers to any current grab of the seat's
|
* focused surface for this keyboard. Defers to any current grab of the seat's
|
||||||
* keyboard.
|
* keyboard.
|
||||||
*/
|
*/
|
||||||
void wlr_seat_keyboard_notify_enter(struct wlr_seat *wlr_seat,
|
void wlr_seat_keyboard_notify_enter(struct wlr_seat *seat,
|
||||||
struct wlr_surface *surface);
|
struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a keyboard enter event to the given surface and consider it to be the
|
* Send a keyboard enter event to the given surface and consider it to be the
|
||||||
|
@ -398,8 +408,9 @@ void wlr_seat_keyboard_notify_enter(struct wlr_seat *wlr_seat,
|
||||||
* `wlr_seat_keyboard_notify_enter()` to change keyboard focus to respect
|
* `wlr_seat_keyboard_notify_enter()` to change keyboard focus to respect
|
||||||
* keyboard grabs.
|
* keyboard grabs.
|
||||||
*/
|
*/
|
||||||
void wlr_seat_keyboard_enter(struct wlr_seat *wlr_seat,
|
void wlr_seat_keyboard_enter(struct wlr_seat *seat,
|
||||||
struct wlr_surface *surface);
|
struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear the focused surface for the keyboard and leave all entered surfaces.
|
* Clear the focused surface for the keyboard and leave all entered surfaces.
|
||||||
|
|
|
@ -288,7 +288,8 @@ void roots_keyboard_handle_key(struct roots_keyboard *keyboard,
|
||||||
void roots_keyboard_handle_modifiers(struct roots_keyboard *r_keyboard) {
|
void roots_keyboard_handle_modifiers(struct roots_keyboard *r_keyboard) {
|
||||||
struct wlr_seat *seat = r_keyboard->seat->seat;
|
struct wlr_seat *seat = r_keyboard->seat->seat;
|
||||||
wlr_seat_set_keyboard(seat, r_keyboard->device);
|
wlr_seat_set_keyboard(seat, r_keyboard->device);
|
||||||
wlr_seat_keyboard_notify_modifiers(seat);
|
wlr_seat_keyboard_notify_modifiers(seat,
|
||||||
|
&r_keyboard->device->keyboard->modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void keyboard_config_merge(struct roots_keyboard_config *config,
|
static void keyboard_config_merge(struct roots_keyboard_config *config,
|
||||||
|
|
|
@ -662,7 +662,16 @@ void roots_seat_set_focus(struct roots_seat *seat, struct roots_view *view) {
|
||||||
seat->has_focus = true;
|
seat->has_focus = true;
|
||||||
wl_list_remove(&seat_view->link);
|
wl_list_remove(&seat_view->link);
|
||||||
wl_list_insert(&seat->views, &seat_view->link);
|
wl_list_insert(&seat->views, &seat_view->link);
|
||||||
wlr_seat_keyboard_notify_enter(seat->seat, view->wlr_surface);
|
|
||||||
|
struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat->seat);
|
||||||
|
if (keyboard != NULL) {
|
||||||
|
wlr_seat_keyboard_notify_enter(seat->seat, view->wlr_surface,
|
||||||
|
keyboard->keycodes, keyboard->num_keycodes,
|
||||||
|
&keyboard->modifiers);
|
||||||
|
} else {
|
||||||
|
wlr_seat_keyboard_notify_enter(seat->seat, view->wlr_surface,
|
||||||
|
NULL, 0, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void roots_seat_cycle_focus(struct roots_seat *seat) {
|
void roots_seat_cycle_focus(struct roots_seat *seat) {
|
||||||
|
|
|
@ -585,7 +585,8 @@ const struct wlr_touch_grab_interface wlr_data_device_touch_drag_interface = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static void keyboard_drag_enter(struct wlr_seat_keyboard_grab *grab,
|
static void keyboard_drag_enter(struct wlr_seat_keyboard_grab *grab,
|
||||||
struct wlr_surface *surface) {
|
struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers) {
|
||||||
// nothing has keyboard focus during drags
|
// nothing has keyboard focus during drags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -594,7 +595,8 @@ static void keyboard_drag_key(struct wlr_seat_keyboard_grab *grab,
|
||||||
// no keyboard input during drags
|
// no keyboard input during drags
|
||||||
}
|
}
|
||||||
|
|
||||||
static void keyboard_drag_modifiers(struct wlr_seat_keyboard_grab *grab) {
|
static void keyboard_drag_modifiers(struct wlr_seat_keyboard_grab *grab,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers) {
|
||||||
//struct wlr_keyboard *keyboard = grab->seat->keyboard_state.keyboard;
|
//struct wlr_keyboard *keyboard = grab->seat->keyboard_state.keyboard;
|
||||||
// TODO change the dnd action based on what modifier is pressed on the
|
// TODO change the dnd action based on what modifier is pressed on the
|
||||||
// keyboard
|
// keyboard
|
||||||
|
|
|
@ -11,6 +11,10 @@
|
||||||
int os_create_anonymous_file(off_t size);
|
int os_create_anonymous_file(off_t size);
|
||||||
|
|
||||||
static void keyboard_led_update(struct wlr_keyboard *keyboard) {
|
static void keyboard_led_update(struct wlr_keyboard *keyboard) {
|
||||||
|
if (keyboard->xkb_state == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t leds = 0;
|
uint32_t leds = 0;
|
||||||
for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) {
|
for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) {
|
||||||
if (xkb_state_led_index_is_active(keyboard->xkb_state,
|
if (xkb_state_led_index_is_active(keyboard->xkb_state,
|
||||||
|
@ -21,7 +25,15 @@ static void keyboard_led_update(struct wlr_keyboard *keyboard) {
|
||||||
wlr_keyboard_led_update(keyboard, leds);
|
wlr_keyboard_led_update(keyboard, leds);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void keyboard_modifier_update(struct wlr_keyboard *keyboard) {
|
/**
|
||||||
|
* Update the modifier state of the wlr-keyboard. Returns true if the modifier
|
||||||
|
* state changed.
|
||||||
|
*/
|
||||||
|
static bool keyboard_modifier_update(struct wlr_keyboard *keyboard) {
|
||||||
|
if (keyboard->xkb_state == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
xkb_mod_mask_t depressed = xkb_state_serialize_mods(keyboard->xkb_state,
|
xkb_mod_mask_t depressed = xkb_state_serialize_mods(keyboard->xkb_state,
|
||||||
XKB_STATE_MODS_DEPRESSED);
|
XKB_STATE_MODS_DEPRESSED);
|
||||||
xkb_mod_mask_t latched = xkb_state_serialize_mods(keyboard->xkb_state,
|
xkb_mod_mask_t latched = xkb_state_serialize_mods(keyboard->xkb_state,
|
||||||
|
@ -34,7 +46,7 @@ static void keyboard_modifier_update(struct wlr_keyboard *keyboard) {
|
||||||
latched == keyboard->modifiers.latched &&
|
latched == keyboard->modifiers.latched &&
|
||||||
locked == keyboard->modifiers.locked &&
|
locked == keyboard->modifiers.locked &&
|
||||||
group == keyboard->modifiers.group) {
|
group == keyboard->modifiers.group) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
keyboard->modifiers.depressed = depressed;
|
keyboard->modifiers.depressed = depressed;
|
||||||
|
@ -42,7 +54,7 @@ static void keyboard_modifier_update(struct wlr_keyboard *keyboard) {
|
||||||
keyboard->modifiers.locked = locked;
|
keyboard->modifiers.locked = locked;
|
||||||
keyboard->modifiers.group = group;
|
keyboard->modifiers.group = group;
|
||||||
|
|
||||||
wl_signal_emit(&keyboard->events.modifiers, keyboard);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://www.geeksforgeeks.org/move-zeroes-end-array/
|
// https://www.geeksforgeeks.org/move-zeroes-end-array/
|
||||||
|
@ -90,17 +102,21 @@ static void keyboard_key_update(struct wlr_keyboard *keyboard,
|
||||||
void wlr_keyboard_notify_modifiers(struct wlr_keyboard *keyboard,
|
void wlr_keyboard_notify_modifiers(struct wlr_keyboard *keyboard,
|
||||||
uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked,
|
uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked,
|
||||||
uint32_t group) {
|
uint32_t group) {
|
||||||
if (!keyboard->xkb_state) {
|
if (keyboard->xkb_state == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
xkb_state_update_mask(keyboard->xkb_state, mods_depressed, mods_latched,
|
xkb_state_update_mask(keyboard->xkb_state, mods_depressed, mods_latched,
|
||||||
mods_locked, 0, 0, group);
|
mods_locked, 0, 0, group);
|
||||||
keyboard_modifier_update(keyboard);
|
|
||||||
|
bool updated = keyboard_modifier_update(keyboard);
|
||||||
|
if (updated) {
|
||||||
|
wl_signal_emit(&keyboard->events.modifiers, keyboard);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_keyboard_notify_key(struct wlr_keyboard *keyboard,
|
void wlr_keyboard_notify_key(struct wlr_keyboard *keyboard,
|
||||||
struct wlr_event_keyboard_key *event) {
|
struct wlr_event_keyboard_key *event) {
|
||||||
if (!keyboard->xkb_state) {
|
if (keyboard->xkb_state == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (event->update_state) {
|
if (event->update_state) {
|
||||||
|
@ -109,7 +125,12 @@ void wlr_keyboard_notify_key(struct wlr_keyboard *keyboard,
|
||||||
event->state == WLR_KEY_PRESSED ? XKB_KEY_DOWN : XKB_KEY_UP);
|
event->state == WLR_KEY_PRESSED ? XKB_KEY_DOWN : XKB_KEY_UP);
|
||||||
}
|
}
|
||||||
keyboard_led_update(keyboard);
|
keyboard_led_update(keyboard);
|
||||||
keyboard_modifier_update(keyboard);
|
|
||||||
|
bool updated = keyboard_modifier_update(keyboard);
|
||||||
|
if (updated) {
|
||||||
|
wl_signal_emit(&keyboard->events.modifiers, keyboard);
|
||||||
|
}
|
||||||
|
|
||||||
keyboard_key_update(keyboard, event);
|
keyboard_key_update(keyboard, event);
|
||||||
wl_signal_emit(&keyboard->events.key, event);
|
wl_signal_emit(&keyboard->events.key, event);
|
||||||
}
|
}
|
||||||
|
@ -150,20 +171,16 @@ void wlr_keyboard_led_update(struct wlr_keyboard *kb, uint32_t leds) {
|
||||||
|
|
||||||
void wlr_keyboard_set_keymap(struct wlr_keyboard *kb,
|
void wlr_keyboard_set_keymap(struct wlr_keyboard *kb,
|
||||||
struct xkb_keymap *keymap) {
|
struct xkb_keymap *keymap) {
|
||||||
if (kb->keymap) {
|
char *keymap_str = NULL;
|
||||||
|
|
||||||
xkb_keymap_unref(kb->keymap);
|
xkb_keymap_unref(kb->keymap);
|
||||||
}
|
kb->keymap = xkb_keymap_ref(keymap);
|
||||||
xkb_keymap_ref(keymap);
|
|
||||||
kb->keymap = keymap;
|
|
||||||
|
|
||||||
if (kb->xkb_state) {
|
|
||||||
xkb_state_unref(kb->xkb_state);
|
xkb_state_unref(kb->xkb_state);
|
||||||
}
|
|
||||||
|
|
||||||
kb->xkb_state = xkb_state_new(kb->keymap);
|
kb->xkb_state = xkb_state_new(kb->keymap);
|
||||||
if (kb->xkb_state == NULL) {
|
if (kb->xkb_state == NULL) {
|
||||||
wlr_log(L_ERROR, "Failed to create XKB state");
|
wlr_log(L_ERROR, "Failed to create XKB state");
|
||||||
return;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *led_names[WLR_LED_COUNT] = {
|
const char *led_names[WLR_LED_COUNT] = {
|
||||||
|
@ -190,7 +207,7 @@ void wlr_keyboard_set_keymap(struct wlr_keyboard *kb,
|
||||||
kb->mod_indexes[i] = xkb_map_mod_get_index(kb->keymap, mod_names[i]);
|
kb->mod_indexes[i] = xkb_map_mod_get_index(kb->keymap, mod_names[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *keymap_str = xkb_keymap_get_as_string(kb->keymap,
|
keymap_str = xkb_keymap_get_as_string(kb->keymap,
|
||||||
XKB_KEYMAP_FORMAT_TEXT_V1);
|
XKB_KEYMAP_FORMAT_TEXT_V1);
|
||||||
kb->keymap_size = strlen(keymap_str) + 1;
|
kb->keymap_size = strlen(keymap_str) + 1;
|
||||||
if (kb->keymap_fd) {
|
if (kb->keymap_fd) {
|
||||||
|
@ -199,16 +216,34 @@ void wlr_keyboard_set_keymap(struct wlr_keyboard *kb,
|
||||||
kb->keymap_fd = os_create_anonymous_file(kb->keymap_size);
|
kb->keymap_fd = os_create_anonymous_file(kb->keymap_size);
|
||||||
if (kb->keymap_fd < 0) {
|
if (kb->keymap_fd < 0) {
|
||||||
wlr_log(L_ERROR, "creating a keymap file for %lu bytes failed", kb->keymap_size);
|
wlr_log(L_ERROR, "creating a keymap file for %lu bytes failed", kb->keymap_size);
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
void *ptr = mmap(NULL, kb->keymap_size,
|
void *ptr = mmap(NULL, kb->keymap_size,
|
||||||
PROT_READ | PROT_WRITE, MAP_SHARED, kb->keymap_fd, 0);
|
PROT_READ | PROT_WRITE, MAP_SHARED, kb->keymap_fd, 0);
|
||||||
if (ptr == (void*)-1) {
|
if (ptr == (void*)-1) {
|
||||||
wlr_log(L_ERROR, "failed to mmap() %lu bytes", kb->keymap_size);
|
wlr_log(L_ERROR, "failed to mmap() %lu bytes", kb->keymap_size);
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
strcpy(ptr, keymap_str);
|
strcpy(ptr, keymap_str);
|
||||||
free(keymap_str);
|
free(keymap_str);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < kb->num_keycodes; ++i) {
|
||||||
|
xkb_keycode_t keycode = kb->keycodes[i] + 8;
|
||||||
|
xkb_state_update_key(kb->xkb_state, keycode, XKB_KEY_DOWN);
|
||||||
|
}
|
||||||
|
|
||||||
|
keyboard_modifier_update(kb);
|
||||||
|
|
||||||
wl_signal_emit(&kb->events.keymap, kb);
|
wl_signal_emit(&kb->events.keymap, kb);
|
||||||
|
return;
|
||||||
|
|
||||||
|
err:
|
||||||
|
xkb_state_unref(kb->xkb_state);
|
||||||
|
kb->xkb_state = NULL;
|
||||||
|
xkb_keymap_unref(keymap);
|
||||||
|
kb->keymap = NULL;
|
||||||
|
close(kb->keymap_fd);
|
||||||
|
free(keymap_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_keyboard_set_repeat_info(struct wlr_keyboard *kb, int32_t rate,
|
void wlr_keyboard_set_repeat_info(struct wlr_keyboard *kb, int32_t rate,
|
||||||
|
|
|
@ -282,8 +282,9 @@ static const struct wlr_pointer_grab_interface default_pointer_grab_impl = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static void default_keyboard_enter(struct wlr_seat_keyboard_grab *grab,
|
static void default_keyboard_enter(struct wlr_seat_keyboard_grab *grab,
|
||||||
struct wlr_surface *surface) {
|
struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes,
|
||||||
wlr_seat_keyboard_enter(grab->seat, surface);
|
struct wlr_keyboard_modifiers *modifiers) {
|
||||||
|
wlr_seat_keyboard_enter(grab->seat, surface, keycodes, num_keycodes, modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void default_keyboard_key(struct wlr_seat_keyboard_grab *grab,
|
static void default_keyboard_key(struct wlr_seat_keyboard_grab *grab,
|
||||||
|
@ -291,8 +292,9 @@ static void default_keyboard_key(struct wlr_seat_keyboard_grab *grab,
|
||||||
wlr_seat_keyboard_send_key(grab->seat, time, key, state);
|
wlr_seat_keyboard_send_key(grab->seat, time, key, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void default_keyboard_modifiers(struct wlr_seat_keyboard_grab *grab) {
|
static void default_keyboard_modifiers(struct wlr_seat_keyboard_grab *grab,
|
||||||
wlr_seat_keyboard_send_modifiers(grab->seat);
|
struct wlr_keyboard_modifiers *modifiers) {
|
||||||
|
wlr_seat_keyboard_send_modifiers(grab->seat, modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void default_keyboard_cancel(struct wlr_seat_keyboard_grab *grab) {
|
static void default_keyboard_cancel(struct wlr_seat_keyboard_grab *grab) {
|
||||||
|
@ -773,6 +775,7 @@ void wlr_seat_set_keyboard(struct wlr_seat *seat,
|
||||||
|
|
||||||
if (keyboard) {
|
if (keyboard) {
|
||||||
assert(device->type == WLR_INPUT_DEVICE_KEYBOARD);
|
assert(device->type == WLR_INPUT_DEVICE_KEYBOARD);
|
||||||
|
seat->keyboard_state.keyboard = keyboard;
|
||||||
|
|
||||||
wl_signal_add(&device->events.destroy,
|
wl_signal_add(&device->events.destroy,
|
||||||
&seat->keyboard_state.keyboard_destroy);
|
&seat->keyboard_state.keyboard_destroy);
|
||||||
|
@ -787,14 +790,18 @@ void wlr_seat_set_keyboard(struct wlr_seat *seat,
|
||||||
|
|
||||||
struct wlr_seat_client *client;
|
struct wlr_seat_client *client;
|
||||||
wl_list_for_each(client, &seat->clients, link) {
|
wl_list_for_each(client, &seat->clients, link) {
|
||||||
seat_client_send_keymap(client, device->keyboard);
|
seat_client_send_keymap(client, keyboard);
|
||||||
seat_client_send_repeat_info(client, device->keyboard);
|
seat_client_send_repeat_info(client, keyboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wlr_seat_keyboard_send_modifiers(seat, &keyboard->modifiers);
|
||||||
|
} else {
|
||||||
|
seat->keyboard_state.keyboard = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
seat->keyboard_state.keyboard = keyboard;
|
struct wlr_keyboard *wlr_seat_get_keyboard(struct wlr_seat *seat) {
|
||||||
wlr_seat_keyboard_send_modifiers(seat);
|
return seat->keyboard_state.keyboard;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_seat_keyboard_start_grab(struct wlr_seat *wlr_seat,
|
void wlr_seat_keyboard_start_grab(struct wlr_seat *wlr_seat,
|
||||||
|
@ -835,28 +842,29 @@ static void keyboard_resource_destroy_notify(struct wl_listener *listener,
|
||||||
wlr_seat_keyboard_clear_focus(state->seat);
|
wlr_seat_keyboard_clear_focus(state->seat);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_seat_keyboard_send_modifiers(struct wlr_seat *seat) {
|
void wlr_seat_keyboard_send_modifiers(struct wlr_seat *seat,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers) {
|
||||||
struct wlr_seat_client *client = seat->keyboard_state.focused_client;
|
struct wlr_seat_client *client = seat->keyboard_state.focused_client;
|
||||||
if (client == NULL) {
|
if (client == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wlr_keyboard *keyboard = seat->keyboard_state.keyboard;
|
|
||||||
if (keyboard == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t serial = wl_display_next_serial(seat->display);
|
uint32_t serial = wl_display_next_serial(seat->display);
|
||||||
struct wl_resource *resource;
|
struct wl_resource *resource;
|
||||||
wl_resource_for_each(resource, &client->keyboards) {
|
wl_resource_for_each(resource, &client->keyboards) {
|
||||||
|
if (modifiers == NULL) {
|
||||||
|
wl_keyboard_send_modifiers(resource, serial, 0, 0, 0, 0);
|
||||||
|
} else {
|
||||||
wl_keyboard_send_modifiers(resource, serial,
|
wl_keyboard_send_modifiers(resource, serial,
|
||||||
keyboard->modifiers.depressed, keyboard->modifiers.latched,
|
modifiers->depressed, modifiers->latched,
|
||||||
keyboard->modifiers.locked, keyboard->modifiers.group);
|
modifiers->locked, modifiers->group);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_seat_keyboard_enter(struct wlr_seat *seat,
|
void wlr_seat_keyboard_enter(struct wlr_seat *seat,
|
||||||
struct wlr_surface *surface) {
|
struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers) {
|
||||||
if (seat->keyboard_state.focused_surface == surface) {
|
if (seat->keyboard_state.focused_surface == surface) {
|
||||||
// this surface already got an enter notify
|
// this surface already got an enter notify
|
||||||
return;
|
return;
|
||||||
|
@ -884,19 +892,17 @@ void wlr_seat_keyboard_enter(struct wlr_seat *seat,
|
||||||
}
|
}
|
||||||
|
|
||||||
// enter the current surface
|
// enter the current surface
|
||||||
if (client != NULL && seat->keyboard_state.keyboard != NULL) {
|
if (client != NULL) {
|
||||||
struct wlr_keyboard *keyboard = seat->keyboard_state.keyboard;
|
|
||||||
|
|
||||||
struct wl_array keys;
|
struct wl_array keys;
|
||||||
wl_array_init(&keys);
|
wl_array_init(&keys);
|
||||||
for (size_t i = 0; i < keyboard->num_keycodes; ++i) {
|
for (size_t i = 0; i < num_keycodes; ++i) {
|
||||||
uint32_t *p = wl_array_add(&keys, sizeof(uint32_t));
|
uint32_t *p = wl_array_add(&keys, sizeof(uint32_t));
|
||||||
if (!p) {
|
if (!p) {
|
||||||
wlr_log(L_ERROR, "Cannot allocate memory, skipping keycode: %d\n",
|
wlr_log(L_ERROR, "Cannot allocate memory, skipping keycode: %d\n",
|
||||||
keyboard->keycodes[i]);
|
keycodes[i]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
*p = keyboard->keycodes[i];
|
*p = keycodes[i];
|
||||||
}
|
}
|
||||||
uint32_t serial = wl_display_next_serial(seat->display);
|
uint32_t serial = wl_display_next_serial(seat->display);
|
||||||
struct wl_resource *resource;
|
struct wl_resource *resource;
|
||||||
|
@ -928,33 +934,34 @@ void wlr_seat_keyboard_enter(struct wlr_seat *seat,
|
||||||
seat->keyboard_state.focused_client = client;
|
seat->keyboard_state.focused_client = client;
|
||||||
seat->keyboard_state.focused_surface = surface;
|
seat->keyboard_state.focused_surface = surface;
|
||||||
|
|
||||||
if (client != NULL && seat->keyboard_state.keyboard != NULL) {
|
if (client != NULL) {
|
||||||
// tell new client about any modifier change last,
|
// tell new client about any modifier change last,
|
||||||
// as it targets seat->keyboard_state.focused_client
|
// as it targets seat->keyboard_state.focused_client
|
||||||
wlr_seat_keyboard_send_modifiers(seat);
|
wlr_seat_keyboard_send_modifiers(seat, modifiers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_seat_keyboard_notify_enter(struct wlr_seat *seat, struct
|
void wlr_seat_keyboard_notify_enter(struct wlr_seat *seat,
|
||||||
wlr_surface *surface) {
|
struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers) {
|
||||||
struct wlr_seat_keyboard_grab *grab = seat->keyboard_state.grab;
|
struct wlr_seat_keyboard_grab *grab = seat->keyboard_state.grab;
|
||||||
grab->interface->enter(grab, surface);
|
grab->interface->enter(grab, surface, keycodes, num_keycodes, modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_seat_keyboard_clear_focus(struct wlr_seat *seat) {
|
void wlr_seat_keyboard_clear_focus(struct wlr_seat *seat) {
|
||||||
struct wl_array keys;
|
// TODO respect grabs here?
|
||||||
wl_array_init(&keys);
|
wlr_seat_keyboard_enter(seat, NULL, NULL, 0, NULL);
|
||||||
wlr_seat_keyboard_enter(seat, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wlr_seat_keyboard_has_grab(struct wlr_seat *seat) {
|
bool wlr_seat_keyboard_has_grab(struct wlr_seat *seat) {
|
||||||
return seat->keyboard_state.grab->interface != &default_keyboard_grab_impl;
|
return seat->keyboard_state.grab->interface != &default_keyboard_grab_impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_seat_keyboard_notify_modifiers(struct wlr_seat *seat) {
|
void wlr_seat_keyboard_notify_modifiers(struct wlr_seat *seat,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers) {
|
||||||
clock_gettime(CLOCK_MONOTONIC, &seat->last_event);
|
clock_gettime(CLOCK_MONOTONIC, &seat->last_event);
|
||||||
struct wlr_seat_keyboard_grab *grab = seat->keyboard_state.grab;
|
struct wlr_seat_keyboard_grab *grab = seat->keyboard_state.grab;
|
||||||
grab->interface->modifiers(grab);
|
grab->interface->modifiers(grab, modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_seat_keyboard_notify_key(struct wlr_seat *seat, uint32_t time,
|
void wlr_seat_keyboard_notify_key(struct wlr_seat *seat, uint32_t time,
|
||||||
|
|
|
@ -103,7 +103,9 @@ static const struct wlr_pointer_grab_interface xdg_pointer_grab_impl = {
|
||||||
.axis = xdg_pointer_grab_axis,
|
.axis = xdg_pointer_grab_axis,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void xdg_keyboard_grab_enter(struct wlr_seat_keyboard_grab *grab, struct wlr_surface *surface) {
|
static void xdg_keyboard_grab_enter(struct wlr_seat_keyboard_grab *grab,
|
||||||
|
struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes,
|
||||||
|
struct wlr_keyboard_modifiers *modifiers) {
|
||||||
// keyboard focus should remain on the popup
|
// keyboard focus should remain on the popup
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,8 +114,9 @@ static void xdg_keyboard_grab_key(struct wlr_seat_keyboard_grab *grab, uint32_t
|
||||||
wlr_seat_keyboard_send_key(grab->seat, time, key, state);
|
wlr_seat_keyboard_send_key(grab->seat, time, key, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xdg_keyboard_grab_modifiers(struct wlr_seat_keyboard_grab *grab) {
|
static void xdg_keyboard_grab_modifiers(struct wlr_seat_keyboard_grab *grab,
|
||||||
wlr_seat_keyboard_send_modifiers(grab->seat);
|
struct wlr_keyboard_modifiers *modifiers) {
|
||||||
|
wlr_seat_keyboard_send_modifiers(grab->seat, modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xdg_keyboard_grab_cancel(struct wlr_seat_keyboard_grab *grab) {
|
static void xdg_keyboard_grab_cancel(struct wlr_seat_keyboard_grab *grab) {
|
||||||
|
|
Loading…
Reference in a new issue