keyboard grab enter with modifiers

This commit is contained in:
Tony Crisci 2018-01-06 11:06:09 -05:00
parent 2bd3a75f80
commit b40a5f084a
5 changed files with 47 additions and 29 deletions

View file

@ -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,
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
}

View file

@ -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,
struct wlr_surface *surface) {
wlr_seat_keyboard_enter(grab->seat, surface);
struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes,
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,
@ -851,14 +852,19 @@ void wlr_seat_keyboard_send_modifiers(struct wlr_seat *seat,
uint32_t serial = wl_display_next_serial(seat->display);
struct wl_resource *resource;
wl_resource_for_each(resource, &client->keyboards) {
wl_keyboard_send_modifiers(resource, serial,
modifiers->depressed, modifiers->latched,
modifiers->locked, modifiers->group);
if (modifiers == NULL) {
wl_keyboard_send_modifiers(resource, serial, 0, 0, 0, 0);
} else {
wl_keyboard_send_modifiers(resource, serial,
modifiers->depressed, modifiers->latched,
modifiers->locked, modifiers->group);
}
}
}
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) {
// this surface already got an enter notify
return;
@ -886,19 +892,17 @@ void wlr_seat_keyboard_enter(struct wlr_seat *seat,
}
// enter the current surface
if (client != NULL && seat->keyboard_state.keyboard != NULL) {
struct wlr_keyboard *keyboard = seat->keyboard_state.keyboard;
if (client != NULL) {
struct wl_array 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));
if (!p) {
wlr_log(L_ERROR, "Cannot allocate memory, skipping keycode: %d\n",
keyboard->keycodes[i]);
keycodes[i]);
continue;
}
*p = keyboard->keycodes[i];
*p = keycodes[i];
}
uint32_t serial = wl_display_next_serial(seat->display);
struct wl_resource *resource;
@ -930,24 +934,23 @@ void wlr_seat_keyboard_enter(struct wlr_seat *seat,
seat->keyboard_state.focused_client = client;
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,
// as it targets seat->keyboard_state.focused_client
wlr_seat_keyboard_send_modifiers(seat,
seat->keyboard_state.keyboard->modifiers);
wlr_seat_keyboard_send_modifiers(seat, modifiers);
}
}
void wlr_seat_keyboard_notify_enter(struct wlr_seat *seat, struct
wlr_surface *surface) {
void wlr_seat_keyboard_notify_enter(struct wlr_seat *seat,
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;
grab->interface->enter(grab, surface);
grab->interface->enter(grab, surface, keycodes, num_keycodes, modifiers);
}
void wlr_seat_keyboard_clear_focus(struct wlr_seat *seat) {
struct wl_array keys;
wl_array_init(&keys);
wlr_seat_keyboard_enter(seat, NULL);
// TODO respect grabs here?
wlr_seat_keyboard_enter(seat, NULL, NULL, 0, NULL);
}
bool wlr_seat_keyboard_has_grab(struct wlr_seat *seat) {

View file

@ -103,7 +103,9 @@ static const struct wlr_pointer_grab_interface xdg_pointer_grab_impl = {
.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
}