diff options
| -rw-r--r-- | dwl.c | 18 | 
1 files changed, 17 insertions, 1 deletions
| @@ -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); @@ -394,6 +396,16 @@ chvt(const Arg *arg)  }  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)  {  	struct xkb_context *context; @@ -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; | 
