swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

commit 11c628c071c2767e96bfa17eb2182041b0276d88
parent c49dfd702a9e6249b9d810999f55db60f05570a9
Author: Michael Forney <mforney@mforney.org>
Date:   Thu, 29 Aug 2019 19:51:41 -0700

keyboard: Move away from global state

Diffstat:
Mlibswc/keyboard.c | 35++++++++++++++++++++++-------------
Mlibswc/keyboard.h | 4++--
Mlibswc/seat.c | 21++++++++++-----------
3 files changed, 34 insertions(+), 26 deletions(-)

diff --git a/libswc/keyboard.c b/libswc/keyboard.c @@ -175,33 +175,39 @@ error0: return false; } -bool -keyboard_initialize(struct keyboard *keyboard) +struct keyboard * +keyboard_create(void) { - struct xkb *xkb = &keyboard->xkb; + struct keyboard *keyboard; + struct xkb *xkb; + keyboard = malloc(sizeof(*keyboard)); + if (!keyboard) + goto error0; + + xkb = &keyboard->xkb; if (!(xkb->context = xkb_context_new(0))) { ERROR("Could not create XKB context\n"); - goto error0; + goto error1; } if (!(xkb->keymap.map = xkb_keymap_new_from_names(xkb->context, NULL, 0))) { ERROR("Could not create XKB keymap\n"); - goto error1; + goto error2; } if (!(xkb->state = xkb_state_new(xkb->keymap.map))) { ERROR("Could not create XKB state\n"); - goto error2; + goto error3; } if (!update_keymap(xkb)) { ERROR("Could not update XKB keymap\n"); - goto error3; + goto error4; } if (!input_focus_initialize(&keyboard->focus, &keyboard->focus_handler)) - goto error3; + goto error4; keyboard->modifier_state = (struct keyboard_modifier_state){0}; keyboard->modifiers = 0; @@ -214,20 +220,22 @@ keyboard_initialize(struct keyboard *keyboard) wl_list_init(&keyboard->handlers); wl_list_insert(&keyboard->handlers, &keyboard->client_handler.link); - return true; + return keyboard; -error3: +error4: xkb_state_unref(keyboard->xkb.state); -error2: +error3: xkb_keymap_unref(keyboard->xkb.keymap.map); -error1: +error2: xkb_context_unref(keyboard->xkb.context); +error1: + free(keyboard); error0: return false; } void -keyboard_finalize(struct keyboard *keyboard) +keyboard_destroy(struct keyboard *keyboard) { wl_array_release(&keyboard->client_keys); wl_array_release(&keyboard->keys); @@ -237,6 +245,7 @@ keyboard_finalize(struct keyboard *keyboard) xkb_state_unref(keyboard->xkb.state); xkb_keymap_unref(keyboard->xkb.keymap.map); xkb_context_unref(keyboard->xkb.context); + free(keyboard); } bool diff --git a/libswc/keyboard.h b/libswc/keyboard.h @@ -83,8 +83,8 @@ struct keyboard { uint32_t modifiers; }; -bool keyboard_initialize(struct keyboard *keyboard); -void keyboard_finalize(struct keyboard *keyboard); +struct keyboard *keyboard_create(void); +void keyboard_destroy(struct keyboard *keyboard); bool keyboard_reset(struct keyboard *keyboard); void keyboard_set_focus(struct keyboard *keyboard, struct compositor_view *view); struct wl_resource *keyboard_bind(struct keyboard *keyboard, struct wl_client *client, uint32_t version, uint32_t id); diff --git a/libswc/seat.c b/libswc/seat.c @@ -61,7 +61,6 @@ struct seat { struct wl_listener swc_listener; - struct keyboard keyboard; struct wl_listener keyboard_focus_listener; struct pointer pointer; struct data_device data_device; @@ -98,8 +97,8 @@ handle_data_device_event(struct wl_listener *listener, void *data) if (ev->type != DATA_DEVICE_EVENT_SELECTION_CHANGED) return; - if (seat->keyboard.focus.client) - data_device_offer_selection(&seat->data_device, seat->keyboard.focus.client); + if (seat->base.keyboard->focus.client) + data_device_offer_selection(&seat->data_device, seat->base.keyboard->focus.client); } static void @@ -111,7 +110,7 @@ handle_swc_event(struct wl_listener *listener, void *data) switch (ev->type) { case SWC_EVENT_DEACTIVATED: libinput_suspend(seat->libinput); - keyboard_reset(&seat->keyboard); + keyboard_reset(seat->base.keyboard); break; case SWC_EVENT_ACTIVATED: if (libinput_resume(seat->libinput) != 0) @@ -134,7 +133,7 @@ get_keyboard(struct wl_client *client, struct wl_resource *resource, uint32_t id { struct seat *seat = wl_resource_get_user_data(resource); - keyboard_bind(&seat->keyboard, client, wl_resource_get_version(resource), id); + keyboard_bind(seat->base.keyboard, client, wl_resource_get_version(resource), id); } static void @@ -260,7 +259,7 @@ handle_libinput_data(int fd, uint32_t mask, void *data) time = libinput_event_keyboard_get_time(event.k); key = libinput_event_keyboard_get_key(event.k); state = libinput_event_keyboard_get_key_state(event.k); - keyboard_handle_key(&seat->keyboard, time, key, state); + keyboard_handle_key(seat->base.keyboard, time, key, state); break; case LIBINPUT_EVENT_POINTER_MOTION: event.p = libinput_event_get_pointer_event(generic_event); @@ -394,13 +393,13 @@ seat_create(struct wl_display *display, const char *seat_name) seat->data_device_listener.notify = &handle_data_device_event; wl_signal_add(&seat->data_device.event_signal, &seat->data_device_listener); - if (!keyboard_initialize(&seat->keyboard)) { + seat->base.keyboard = keyboard_create(); + if (!seat->base.keyboard) { ERROR("Could not initialize keyboard\n"); goto error4; } - seat->base.keyboard = &seat->keyboard; seat->keyboard_focus_listener.notify = handle_keyboard_focus_event; - wl_signal_add(&seat->keyboard.focus.event_signal, &seat->keyboard_focus_listener); + wl_signal_add(&seat->base.keyboard->focus.event_signal, &seat->keyboard_focus_listener); if (!pointer_initialize(&seat->pointer)) { ERROR("Could not initialize pointer\n"); @@ -416,7 +415,7 @@ seat_create(struct wl_display *display, const char *seat_name) error6: pointer_finalize(&seat->pointer); error5: - keyboard_finalize(&seat->keyboard); + keyboard_destroy(seat->base.keyboard); error4: data_device_finalize(&seat->data_device); error3: @@ -441,7 +440,7 @@ seat_destroy(struct swc_seat *seat_base) #endif pointer_finalize(&seat->pointer); - keyboard_finalize(&seat->keyboard); + keyboard_destroy(seat->base.keyboard); data_device_finalize(&seat->data_device); wl_global_destroy(seat->global);