Skip to content
This repository has been archived by the owner on Nov 1, 2021. It is now read-only.

Commit

Permalink
input-method: move grab implementation to compositor
Browse files Browse the repository at this point in the history
  • Loading branch information
xdavidwu committed Jan 21, 2020
1 parent 0dc58e2 commit 3ad9e9a
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 86 deletions.
17 changes: 12 additions & 5 deletions include/wlr/types/wlr_input_method_v2.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,11 @@ struct wlr_input_method_v2 {
struct wlr_input_method_keyboard_grab_v2 {
struct wl_resource *resource;
struct wlr_input_method_v2 *input_method;

struct wlr_seat_keyboard_grab *grab;
bool grabbed;
struct wlr_seat_client *seat_client;
struct wlr_keyboard *keyboard;

struct wl_listener keymap_listener;
struct wl_listener repeat_info_listener;

uint32_t serial;
};

struct wlr_input_method_manager_v2 {
Expand Down Expand Up @@ -99,4 +96,14 @@ void wlr_input_method_v2_send_done(struct wlr_input_method_v2 *input_method);
void wlr_input_method_v2_send_unavailable(
struct wlr_input_method_v2 *input_method);

void wlr_input_method_keyboard_grab_v2_send_key(
struct wlr_input_method_keyboard_grab_v2 *im_keyboard_grab,
uint32_t time, uint32_t key, uint32_t state);
void wlr_input_method_keyboard_grab_v2_send_modifiers(
struct wlr_input_method_keyboard_grab_v2 *im_keyboard_grab,
struct wlr_keyboard_modifiers *modifiers);
void wlr_input_method_keyboard_grab_v2_set_keyboard(
struct wlr_input_method_keyboard_grab_v2 *im_keyboard_grab,
struct wlr_keyboard *keyboard);

#endif
124 changes: 43 additions & 81 deletions types/wlr_input_method_v2.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,7 @@ static void im_get_input_popup_surface(struct wl_client *client,

static void im_keyboard_grab_destroy(
struct wlr_input_method_keyboard_grab_v2 *im_keyboard_grab) {
if (im_keyboard_grab->grabbed) {
im_keyboard_grab->grabbed = false;
wlr_seat_keyboard_end_grab(im_keyboard_grab->grab->seat);
}
im_keyboard_grab->input_method->im_keyboard_grab = NULL;
free(im_keyboard_grab->grab);
free(im_keyboard_grab);
}

Expand All @@ -148,58 +143,25 @@ static const struct zwp_input_method_keyboard_grab_v2_interface im_keyboard_grab
.release = im_keyboard_grab_release,
};

static void im_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) {
wlr_seat_keyboard_enter(grab->seat, surface, keycodes, num_keycodes, modifiers);
}

static void im_keyboard_grab_key(struct wlr_seat_keyboard_grab *grab,
void wlr_input_method_keyboard_grab_v2_send_key(
struct wlr_input_method_keyboard_grab_v2 *im_keyboard_grab,
uint32_t time, uint32_t key, uint32_t state) {
struct wlr_input_method_keyboard_grab_v2 *im_keyboard_grab = grab->data;
struct wlr_keyboard *keyboard = grab->seat->keyboard_state.keyboard;
if (keyboard->virtual_keyboard) {
wlr_seat_keyboard_send_key(grab->seat, time, key, state);
} else {
zwp_input_method_keyboard_grab_v2_send_key(
im_keyboard_grab->resource, im_keyboard_grab->serial++,
time, key, state);
}
zwp_input_method_keyboard_grab_v2_send_key(
im_keyboard_grab->resource,
wlr_seat_client_next_serial(im_keyboard_grab->seat_client),
time, key, state);
}

static void im_keyboard_grab_modifiers(struct wlr_seat_keyboard_grab *grab,
void wlr_input_method_keyboard_grab_v2_send_modifiers(
struct wlr_input_method_keyboard_grab_v2 *im_keyboard_grab,
struct wlr_keyboard_modifiers *modifiers) {
struct wlr_input_method_keyboard_grab_v2 *im_keyboard_grab = grab->data;
struct wlr_keyboard *keyboard = grab->seat->keyboard_state.keyboard;
if (keyboard->virtual_keyboard) {
wlr_seat_keyboard_send_modifiers(grab->seat, modifiers);
} else {
zwp_input_method_keyboard_grab_v2_send_modifiers(
im_keyboard_grab->resource, im_keyboard_grab->serial++,
modifiers->depressed, modifiers->latched,
modifiers->locked, modifiers->group);
}
}

static void im_keyboard_grab_cancel(struct wlr_seat_keyboard_grab *grab) {
struct wlr_input_method_keyboard_grab_v2 *im_keyboard_grab = grab->data;
wl_list_remove(&im_keyboard_grab->keymap_listener.link);
wl_list_remove(&im_keyboard_grab->repeat_info_listener.link);
if (im_keyboard_grab->grabbed) {
im_keyboard_grab->grabbed = false;
struct wl_resource *resource = im_keyboard_grab->resource;
im_keyboard_grab_destroy(im_keyboard_grab);
wl_resource_set_user_data(resource, NULL);
}
zwp_input_method_keyboard_grab_v2_send_modifiers(
im_keyboard_grab->resource,
wlr_seat_client_next_serial(im_keyboard_grab->seat_client),
modifiers->depressed, modifiers->latched,
modifiers->locked, modifiers->group);
}

static const struct wlr_keyboard_grab_interface keyboard_grab_impl = {
.enter = im_keyboard_grab_enter,
.key = im_keyboard_grab_key,
.modifiers = im_keyboard_grab_modifiers,
.cancel = im_keyboard_grab_cancel,
};

static bool im_keyboard_grab_send_keymap(
struct wlr_input_method_keyboard_grab_v2 *im_keyboard_grab,
struct wlr_keyboard *keyboard) {
Expand Down Expand Up @@ -251,6 +213,32 @@ static void handle_keyboard_repeat_info(struct wl_listener *listener,
im_keyboard_grab_send_repeat_info(im_keyboard_grab, data);
}

void wlr_input_method_keyboard_grab_v2_set_keyboard(
struct wlr_input_method_keyboard_grab_v2 *im_keyboard_grab,
struct wlr_keyboard *keyboard) {
if (keyboard == im_keyboard_grab->keyboard) {
return;
}
if (im_keyboard_grab->keyboard) {
wl_list_remove(&im_keyboard_grab->keymap_listener.link);
wl_list_remove(&im_keyboard_grab->repeat_info_listener.link);
}

if (!im_keyboard_grab_send_keymap(im_keyboard_grab, keyboard)) {
wlr_log(WLR_ERROR, "Failed to send keymap for input-method keyboard grab");
return;
}
im_keyboard_grab_send_repeat_info(im_keyboard_grab, keyboard);

im_keyboard_grab->keymap_listener.notify = handle_keyboard_keymap;
wl_signal_add(&keyboard->events.keymap,
&im_keyboard_grab->keymap_listener);
im_keyboard_grab->repeat_info_listener.notify =
handle_keyboard_repeat_info;
wl_signal_add(&keyboard->events.repeat_info,
&im_keyboard_grab->repeat_info_listener);
};

static void im_grab_keyboard(struct wl_client *client,
struct wl_resource *resource, uint32_t keyboard) {
struct wlr_input_method_v2 *input_method =
Expand All @@ -268,12 +256,6 @@ static void im_grab_keyboard(struct wl_client *client,
wl_client_post_no_memory(client);
return;
}
struct wlr_seat_keyboard_grab *keyboard_grab = calloc(1,
sizeof(struct wlr_seat_keyboard_grab));
if (!keyboard_grab) {
wl_client_post_no_memory(client);
return;
}
struct wl_resource *im_keyboard_grab_resource = wl_resource_create(
client, &zwp_input_method_keyboard_grab_v2_interface,
wl_resource_get_version(resource), keyboard);
Expand All @@ -285,34 +267,14 @@ static void im_grab_keyboard(struct wl_client *client,
wl_resource_set_implementation(im_keyboard_grab_resource,
&im_keyboard_grab_impl, im_keyboard_grab,
im_keyboard_grab_resource_destroy);
keyboard_grab->interface = &keyboard_grab_impl;
keyboard_grab->data = im_keyboard_grab;
im_keyboard_grab->resource = im_keyboard_grab_resource;
im_keyboard_grab->grab = keyboard_grab;
im_keyboard_grab->input_method = input_method;
im_keyboard_grab->seat_client = wlr_seat_client_for_wl_client(
input_method->seat, client);
input_method->im_keyboard_grab = im_keyboard_grab;

struct wlr_keyboard *state_keyboard =
input_method->seat->keyboard_state.keyboard;
if (!im_keyboard_grab_send_keymap(im_keyboard_grab, state_keyboard)) {
// send initial keymap memory map failed
wl_client_post_no_memory(client);
wl_resource_destroy(im_keyboard_grab_resource);
return;
}
im_keyboard_grab_send_repeat_info(im_keyboard_grab, state_keyboard);
wlr_seat_keyboard_start_grab(input_method->seat, keyboard_grab);
wlr_seat_keyboard_notify_modifiers(input_method->seat,
&state_keyboard->modifiers);
im_keyboard_grab->grabbed = true;

im_keyboard_grab->keymap_listener.notify = handle_keyboard_keymap;
wl_signal_add(&state_keyboard->events.keymap,
&im_keyboard_grab->keymap_listener);
im_keyboard_grab->repeat_info_listener.notify =
handle_keyboard_repeat_info;
wl_signal_add(&state_keyboard->events.repeat_info,
&im_keyboard_grab->repeat_info_listener);
wlr_input_method_keyboard_grab_v2_set_keyboard(im_keyboard_grab,
input_method->seat->keyboard_state.keyboard);
}

static const struct zwp_input_method_v2_interface input_method_impl = {
Expand Down

0 comments on commit 3ad9e9a

Please sign in to comment.