aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2020-06-04 16:06:50 -0700
committerNicholas Noll <nbnoll@eml.cc>2020-06-04 16:06:50 -0700
commitea50cbe1bf103372a3461c80cb172f4fb4167088 (patch)
tree3428dbe77ced15b44af41b93991d57f9486a4627 /sys/cmd
parentc85ebc8fe50be0ba7e87d21302337b5263052741 (diff)
checkin: before refactoring
Diffstat (limited to 'sys/cmd')
-rw-r--r--sys/cmd/dway/dway.c80
-rw-r--r--sys/cmd/dway/dway.h30
2 files changed, 106 insertions, 4 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
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;
@@ -121,9 +139,14 @@ struct Monitor
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);