aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/dway/dway.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/dway/dway.c')
-rw-r--r--sys/cmd/dway/dway.c80
1 files changed, 77 insertions, 3 deletions
diff --git a/sys/cmd/dway/dway.c b/sys/cmd/dway/dway.c
index 3cfce9e..5eed96a 100644
--- a/sys/cmd/dway/dway.c
+++ b/sys/cmd/dway/dway.c
@@ -401,6 +401,8 @@ ev·newmonitor(struct wl_listener *ev, void *arg)
if (!wlr_output_commit(dev))
return;
+ wl_signal_init(&m->sig.kill);
+
wlr_output_layout_add_auto(dway.layout, dev);
dway.dim = *wlr_output_layout_get_box(dway.layout, nil);
}
@@ -412,6 +414,7 @@ ev·freemonitor(struct wl_listener *ev, void *arg)
Monitor *m;
m = wl_container_of(ev, m, ev.free);
+ wl_signal_emit(&m->sig.kill, m);
wl_list_remove(&m->link);
wl_list_remove(&m->ev.draw.link);
@@ -533,11 +536,81 @@ static
void
ev·newlayershell(struct wl_listener *ev, void *arg)
{
- struct wlr_layer_surface_v1 *layer;
+ Layer *layer;
+ struct wlr_layer_surface_v1 *surf;
+
+ surf = arg;
+ if (!surf->output)
+ surf->output = monitor->dev;
- layer = arg;
+ layer = surf->data = calloc(1, sizeof(*layer));
+ layer->surf = surf;
+
+ /* install callbacks */
+ layer->ev.free.notify = ev·freelayershell;
+ layer->ev.map.notify = ev·maplayershell;
+ layer->ev.unmap.notify = ev·unmaplayershell;
+ layer->ev.commit.notify = ev·commitlayershell;
+ layer->ev.kill.notify = ev·killlayershell;
+
+ wl_signal_add(&surf->events.destroy, &layer->ev.free);
+ wl_signal_add(&surf->events.map, &layer->ev.map);
+ wl_signal_add(&surf->events.unmap, &layer->ev.unmap);
+ wl_signal_add(&surf->surface->events.commit, &layer->ev.commit);
+ wl_signal_add(&monitor->sig.kill, &layer->ev.kill);
+}
+
+static
+void
+ev·maplayershell(struct wl_listener *ev, void *arg)
+{
+ Layer *l;
+ Monitor *m;
+
+ l = wl_container_of(ev, l, ev.map);
+ m = l->surf->output->data;
+ /* TODO: damage */
+ wlr_surface_send_enter(l->surf->surface, l->surf->output);
+ /* TODO: cursor */
+}
+
+static
+void
+ev·unmaplayershell(struct wl_listener *ev, void *arg)
+{
+ /* TODO: fill in */
+}
+
+static
+void
+ev·commitlayershell(struct wl_listener *ev, void *arg)
+{
+ /* TODO: fill in */
+}
+
+static
+void
+ev·freelayershell(struct wl_listener *ev, void *arg)
+{
+ Layer *l;
+
+ l = wl_container_of(ev, l, ev.map);
+
+ wl_list_remove(&l->link);
+ wl_list_remove(&l->ev.free.link);
+ wl_list_remove(&l->ev.map.link);
+ wl_list_remove(&l->ev.unmap.link);
+ wl_list_remove(&l->ev.kill.link);
+ wl_list_remove(&l->ev.commit.link);
+
+ free(l);
+}
+
+static
+void
+ev·killlayershell(struct wl_listener *ev, void *arg)
+{
- /* fill in */
}
/* decorations */
@@ -586,6 +659,7 @@ ev·modedecoration(struct wl_listener *ev, void *arg)
}
/* xdg-surfaces */
+
#define WLR_EDGE_ALL WLR_EDGE_TOP|WLR_EDGE_BOTTOM|WLR_EDGE_LEFT|WLR_EDGE_RIGHT
static
void