diff --git a/dwl.c b/dwl.c index 7c35ae9..07f74a8 100644 --- a/dwl.c +++ b/dwl.c @@ -110,6 +110,7 @@ struct Monitor { struct wl_list link; struct wlr_output *wlr_output; struct wl_listener frame; + struct wl_listener destroy; struct wlr_box m; /* monitor area, layout-relative */ struct wlr_box w; /* window area, layout-relative */ const Layout *lt[2]; @@ -152,6 +153,7 @@ static void arrange(Monitor *m); static void axisnotify(struct wl_listener *listener, void *data); static void buttonpress(struct wl_listener *listener, void *data); static void chvt(const Arg *arg); +static void cleanupmon(struct wl_listener *listener, void *data); static void createkeyboard(struct wlr_input_device *device); static void createmon(struct wl_listener *listener, void *data); static void createnotify(struct wl_listener *listener, void *data); @@ -393,6 +395,16 @@ chvt(const Arg *arg) wlr_session_change_vt(s, arg->ui); } +void +cleanupmon(struct wl_listener *listener, void *data) +{ + struct wlr_output *wlr_output = data; + Monitor *m = wlr_output->data; + + wl_list_remove(&m->destroy.link); + free(m); +} + void createkeyboard(struct wlr_input_device *device) { @@ -455,11 +467,15 @@ createmon(struct wl_listener *listener, void *data) break; } } - /* Sets up a listener for the frame notify event. */ + /* Set up event listeners */ m->frame.notify = rendermon; wl_signal_add(&wlr_output->events.frame, &m->frame); wl_list_insert(&mons, &m->link); + m->destroy.notify = cleanupmon; + wl_signal_add(&wlr_output->events.destroy, &m->destroy); + wl_list_insert(&mons, &m->link); + wlr_output_enable(wlr_output, 1); if (!wlr_output_commit(wlr_output)) return;