add cleanup listener for keyboards

main
Devin J. Pohly 2020-07-23 18:13:42 -04:00
parent 89e9a4be33
commit d42d8bda42
1 changed files with 14 additions and 0 deletions

14
dwl.c
View File

@ -99,6 +99,7 @@ typedef struct {
struct wl_listener modifiers; struct wl_listener modifiers;
struct wl_listener key; struct wl_listener key;
struct wl_listener destroy;
} Keyboard; } Keyboard;
typedef struct { typedef struct {
@ -153,6 +154,7 @@ static void arrange(Monitor *m);
static void axisnotify(struct wl_listener *listener, void *data); static void axisnotify(struct wl_listener *listener, void *data);
static void buttonpress(struct wl_listener *listener, void *data); static void buttonpress(struct wl_listener *listener, void *data);
static void chvt(const Arg *arg); static void chvt(const Arg *arg);
static void cleanupkeyboard(struct wl_listener *listener, void *data);
static void cleanupmon(struct wl_listener *listener, void *data); static void cleanupmon(struct wl_listener *listener, void *data);
static void createkeyboard(struct wlr_input_device *device); static void createkeyboard(struct wlr_input_device *device);
static void createmon(struct wl_listener *listener, void *data); static void createmon(struct wl_listener *listener, void *data);
@ -395,6 +397,16 @@ chvt(const Arg *arg)
wlr_session_change_vt(s, arg->ui); wlr_session_change_vt(s, arg->ui);
} }
void
cleanupkeyboard(struct wl_listener *listener, void *data)
{
struct wlr_input_device *device = data;
Keyboard *kb = device->data;
wl_list_remove(&kb->destroy.link);
free(kb);
}
void void
cleanupmon(struct wl_listener *listener, void *data) cleanupmon(struct wl_listener *listener, void *data)
{ {
@ -430,6 +442,8 @@ createkeyboard(struct wlr_input_device *device)
wl_signal_add(&device->keyboard->events.modifiers, &kb->modifiers); wl_signal_add(&device->keyboard->events.modifiers, &kb->modifiers);
kb->key.notify = keypress; kb->key.notify = keypress;
wl_signal_add(&device->keyboard->events.key, &kb->key); wl_signal_add(&device->keyboard->events.key, &kb->key);
kb->destroy.notify = cleanupkeyboard;
wl_signal_add(&device->events.destroy, &kb->destroy);
wlr_seat_set_keyboard(seat, device); wlr_seat_set_keyboard(seat, device);