From ea50cbe1bf103372a3461c80cb172f4fb4167088 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Thu, 4 Jun 2020 16:06:50 -0700 Subject: checkin: before refactoring --- sys/cmd/dway/dway.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++-- sys/cmd/dway/dway.h | 30 +++++++++++++++++++- 2 files changed, 106 insertions(+), 4 deletions(-) (limited to 'sys/cmd') 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 diff --git a/sys/cmd/dway/dway.h b/sys/cmd/dway/dway.h index 838e035..ad2dfb3 100644 --- a/sys/cmd/dway/dway.h +++ b/sys/cmd/dway/dway.h @@ -53,6 +53,7 @@ typedef struct Monitor Monitor; typedef struct Layout Layout; typedef struct Client Client; typedef struct Deco Deco; +typedef struct Layer Layer; typedef struct Payload Payload; typedef struct Rule Rule; @@ -93,7 +94,6 @@ struct Mouse } ev; }; - struct Key { uint32 mod; @@ -112,6 +112,24 @@ struct Keyboard } ev; }; +struct Layer +{ + struct wl_list link; + struct wlr_layer_surface_v1 *surf; + + struct { + struct wl_listener map; + struct wl_listener unmap; + struct wl_listener free; + struct wl_listener commit; + struct wl_listener kill; + /* struct wl_listener popup; */ + } ev; + + struct wlr_box dim; + enum zwlr_layer_shell_v1_layer z; +}; + struct Monitor { struct wl_list link; @@ -120,10 +138,15 @@ struct Monitor struct wl_listener draw; struct wl_listener free; } ev; + struct { + struct wl_signal kill; + } sig; struct { struct wlr_box all; struct wlr_box win; } area; + + Layer layers[4]; const Layout *lt[2]; uint seltags; uint sellt; @@ -233,6 +256,11 @@ static void ev·freedecoration(struct wl_listener *ev, void *arg); static void ev·modedecoration(struct wl_listener *ev, void *arg); static void ev·newlayershell(struct wl_listener *ev, void *arg); +static void ev·freelayershell(struct wl_listener *ev, void *arg); +static void ev·maplayershell(struct wl_listener *ev, void *arg); +static void ev·unmaplayershell(struct wl_listener *ev, void *arg); +static void ev·commitlayershell(struct wl_listener *ev, void *arg); +static void ev·killlayershell(struct wl_listener *ev, void *arg); static void ev·setcursor(struct wl_listener *ev, void *arg); static void ev·setsel(struct wl_listener *ev, void *arg); -- cgit v1.2.1