aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-10-04 10:02:50 -0700
committerNicholas Noll <nbnoll@eml.cc>2021-10-04 10:02:50 -0700
commit8f224149f176fb8de90a82b44f4dd1c6a1b89a4f (patch)
tree3f1c8ad87b6454e3d81ea732d8d9cba61b75841d
parentd69354eedb0b25767293b7aac9ab32def01005f3 (diff)
feat(wm): tiling prototype working
-rw-r--r--compile_commands.json152
-rw-r--r--rules.mk3
-rw-r--r--sys/cmd/wm/client.c29
-rw-r--r--sys/cmd/wm/input.c10
-rw-r--r--sys/cmd/wm/main.c14
-rw-r--r--sys/cmd/wm/monitor.c199
-rw-r--r--sys/cmd/wm/render.c (renamed from sys/cmd/wm/output.c)100
-rw-r--r--sys/cmd/wm/rules.mk2
-rw-r--r--sys/cmd/wm/wm.h55
-rw-r--r--sys/cmd/wm/xdg.c7
10 files changed, 401 insertions, 170 deletions
diff --git a/compile_commands.json b/compile_commands.json
index 32f7c5e..d0d18b5 100644
--- a/compile_commands.json
+++ b/compile_commands.json
@@ -1141,31 +1141,6 @@
"-I",
"sys/cmd/wm",
"-o",
- ".build/sys/cmd/wm/output.o",
- "-c",
- "sys/cmd/wm/output.c"
- ],
- "file": "sys/cmd/wm/output.c"
- },
- {
- "directory": "/home/nolln/root",
- "arguments": [
- "gcc",
- "-MD",
- "-g",
- "-march=native",
- "-fno-strict-aliasing",
- "-fwrapv",
- "-fms-extensions",
- "-Wno-microsoft-anon-tag",
- "-I/home/nolln/root/include/vendor",
- "-I/usr/include/libdrm",
- "-I/usr/include/pixman-1",
- "-I",
- "include",
- "-I",
- "sys/cmd/wm",
- "-o",
".build/sys/cmd/wm/xdg.o",
"-c",
"sys/cmd/wm/xdg.c"
@@ -1355,5 +1330,132 @@
"sys/libmath/test.c"
],
"file": "sys/libmath/test.c"
+ },
+ {
+ "directory": "/home/nolln/root",
+ "arguments": [
+ "gcc",
+ "-MD",
+ "-g",
+ "-march=native",
+ "-fno-strict-aliasing",
+ "-fwrapv",
+ "-fms-extensions",
+ "-Wno-microsoft-anon-tag",
+ "-DWLR_USE_UNSTABLE",
+ "-I/home/nolln/root/include/vendor",
+ "-I/usr/include/libdrm",
+ "-I/usr/include/pixman-1",
+ "-I",
+ "include",
+ "-I",
+ "sys/cmd/tinywl",
+ "-o",
+ ".build/sys/cmd/tinywl/xdg-shell-protocol.o",
+ "-c",
+ "sys/cmd/tinywl/xdg-shell-protocol.c"
+ ],
+ "file": "sys/cmd/tinywl/xdg-shell-protocol.c"
+ },
+ {
+ "directory": "/home/nolln/root",
+ "arguments": [
+ "gcc",
+ "-MD",
+ "-g",
+ "-march=native",
+ "-fno-strict-aliasing",
+ "-fwrapv",
+ "-fms-extensions",
+ "-Wno-microsoft-anon-tag",
+ "-DWLR_USE_UNSTABLE",
+ "-I/home/nolln/root/include/vendor",
+ "-I/usr/include/libdrm",
+ "-I/usr/include/pixman-1",
+ "-I",
+ "include",
+ "-I",
+ "sys/cmd/tinywl",
+ "-o",
+ ".build/sys/cmd/tinywl/tinywl.o",
+ "-c",
+ "sys/cmd/tinywl/tinywl.c"
+ ],
+ "file": "sys/cmd/tinywl/tinywl.c"
+ },
+ {
+ "directory": "/home/nolln/root",
+ "arguments": [
+ "gcc",
+ "-MD",
+ "-g",
+ "-march=native",
+ "-fno-strict-aliasing",
+ "-fwrapv",
+ "-fms-extensions",
+ "-Wno-microsoft-anon-tag",
+ "-I/home/nolln/root/include/vendor",
+ "-I/usr/include/libdrm",
+ "-I/usr/include/pixman-1",
+ "-I",
+ "include",
+ "-I",
+ "sys/cmd/wm",
+ "-o",
+ ".build/sys/cmd/wm/util.o",
+ "-c",
+ "sys/cmd/wm/util.c"
+ ],
+ "file": "sys/cmd/wm/util.c"
+ },
+ {
+ "directory": "/home/nolln/root",
+ "arguments": [
+ "gcc",
+ "-MD",
+ "-g",
+ "-march=native",
+ "-fno-strict-aliasing",
+ "-fwrapv",
+ "-fms-extensions",
+ "-Wno-microsoft-anon-tag",
+ "-I/home/nolln/root/include/vendor",
+ "-I/usr/include/libdrm",
+ "-I/usr/include/pixman-1",
+ "-I",
+ "include",
+ "-I",
+ "sys/cmd/wm",
+ "-o",
+ ".build/sys/cmd/wm/render.o",
+ "-c",
+ "sys/cmd/wm/render.c"
+ ],
+ "file": "sys/cmd/wm/render.c"
+ },
+ {
+ "directory": "/home/nolln/root",
+ "arguments": [
+ "gcc",
+ "-MD",
+ "-g",
+ "-march=native",
+ "-fno-strict-aliasing",
+ "-fwrapv",
+ "-fms-extensions",
+ "-Wno-microsoft-anon-tag",
+ "-I/home/nolln/root/include/vendor",
+ "-I/usr/include/libdrm",
+ "-I/usr/include/pixman-1",
+ "-I",
+ "include",
+ "-I",
+ "sys/cmd/wm",
+ "-o",
+ ".build/sys/cmd/wm/monitor.o",
+ "-c",
+ "sys/cmd/wm/monitor.c"
+ ],
+ "file": "sys/cmd/wm/monitor.c"
}
]
diff --git a/rules.mk b/rules.mk
index 8e0c813..e40960f 100644
--- a/rules.mk
+++ b/rules.mk
@@ -75,3 +75,6 @@ install: targets
@if [ -n $$LIBS ]; then\
cp $(LIBS) $(LIB_DIR); \
fi
+
+database:
+ compiledb make -j4
diff --git a/sys/cmd/wm/client.c b/sys/cmd/wm/client.c
index 4132468..f626cfa 100644
--- a/sys/cmd/wm/client.c
+++ b/sys/cmd/wm/client.c
@@ -3,13 +3,15 @@
static char broken[] = "broken";
void
-focus(Client *client, struct wlr_surface *new, int lift)
+focus(Client *client, int lift)
{
struct wlr_seat *seat;
- struct wlr_surface *old;
+ struct wlr_surface *old, *new;
struct wlr_xdg_surface *xdg;
struct wlr_keyboard *keyboard;
+ new = server.input.seat->keyboard_state.focused_surface;
+
if(client && lift) {
wl_list_remove(&client->stack);
wl_list_insert(&server.client.stack, &client->stack);
@@ -112,7 +114,7 @@ setinteractive(Client *client, int mode, uint32 edges) {
static
void
-apply_bounds(Client *client, struct wlr_box *box)
+constrain(Client *client, struct wlr_box *box)
{
client->geometry.width = MAX(1, client->geometry.width);
client->geometry.height = MAX(1, client->geometry.height);
@@ -137,7 +139,7 @@ resize(Client *client, int x, int y, int w, int h, int interact)
client->geometry.width = w;
client->geometry.height = h;
- apply_bounds(client, box);
+ constrain(client, box);
client->resize = wlr_xdg_toplevel_set_size(client->xdg,
client->geometry.width - 2*client->border,
@@ -146,13 +148,12 @@ resize(Client *client, int x, int y, int w, int h, int interact)
}
void
-attach_to(Client *client, Monitor *monitor, uint tags)
+attach(Client *client, Monitor *monitor, uint tags)
{
- struct wlr_surface *surface;
Monitor *old = client->monitor;
-
if(old == monitor)
return;
+
client->monitor = monitor;
if(old) {
@@ -162,23 +163,22 @@ attach_to(Client *client, Monitor *monitor, uint tags)
if(monitor) {
/* make sure window actually overlaps with the monitor */
- apply_bounds(client, &monitor->geometry);
+ constrain(client, &monitor->geometry);
wlr_surface_send_enter(client->xdg->surface, monitor->output);
client->tags = tags ? tags : monitor->tag.set[monitor->tag.selected];
arrange(monitor);
}
- surface = server.input.seat->keyboard_state.focused_surface;
- focus(focused_client(server.monitor.selected), surface, 1);
+ focus(focused_client(server.monitor.selected), 1);
}
void
-apply_rules(Client *client)
+rules(Client *client)
{
/* rule matching */
- char *id, *title;
- uint i, tags;
Rule *rule;
+ uint i, tags;
+ char *id, *title;
Monitor *monitor, *it;
monitor = server.monitor.selected;
@@ -199,5 +199,6 @@ apply_rules(Client *client)
monitor = it;
}
}
- attach_to(client, monitor, tags);
+
+ attach(client, monitor, tags);
}
diff --git a/sys/cmd/wm/input.c b/sys/cmd/wm/input.c
index b4ceba5..d9e6285 100644
--- a/sys/cmd/wm/input.c
+++ b/sys/cmd/wm/input.c
@@ -227,14 +227,12 @@ cursor_button(struct wl_listener *l, void *data)
struct wlr_surface *surface;
struct wlr_event_pointer_button *event = data;
- wlr_seat_pointer_notify_button(server.input.seat,
- event->time_msec, event->button, event->state);
-
+ wlr_seat_pointer_notify_button(server.input.seat, event->time_msec, event->button, event->state);
client = client_at(server.cursor.dot->x, server.cursor.dot->y, &surface, &sx, &sy);
if (event->state == WLR_BUTTON_RELEASED)
server.cursor.mode = CursorPassthrough;
else
- focus(client, surface, 1);
+ focus(client, 1);
}
void
@@ -257,8 +255,8 @@ void
request_cursor(struct wl_listener *l, void *data)
{
struct wlr_seat_pointer_request_set_cursor_event *event = data;
- struct wlr_seat_client *focused_client = server.input.seat->pointer_state.focused_client;
- if(focused_client == event->seat_client)
+ struct wlr_seat_client *focused = server.input.seat->pointer_state.focused_client;
+ if(focused == event->seat_client)
wlr_cursor_set_surface(server.cursor.dot, event->surface, event->hotspot_x, event->hotspot_y);
}
diff --git a/sys/cmd/wm/main.c b/sys/cmd/wm/main.c
index 7cc2f92..25981ca 100644
--- a/sys/cmd/wm/main.c
+++ b/sys/cmd/wm/main.c
@@ -6,6 +6,10 @@ Server server = {
.make_monitor = { .notify = make_monitor },
.make_xdg_surface = { .notify = make_xdg_surface },
+ .monitor_change = { .notify = monitor_change },
+ .monitor_test = { .notify = monitor_test },
+ .monitor_apply = { .notify = monitor_apply },
+
.cursor_move = { .notify = cursor_move },
.cursor_move_abs = { .notify = cursor_move_abs },
.cursor_button = { .notify = cursor_button },
@@ -43,9 +47,15 @@ init_compositor(void)
wlr_data_device_manager_create(server.display);
server.monitor.layout = wlr_output_layout_create();
+ wl_signal_add(&server.monitor.layout->events.change, &server.event.monitor_change);
wl_list_init(&server.monitor.list);
wl_signal_add(&server.backend->events.new_output, &server.event.make_monitor);
+
+ /* rearrange monitor layouts */
+ server.monitor.manager = wlr_output_manager_v1_create(server.display);
+ wl_signal_add(&server.monitor.manager->events.test, &server.event.monitor_test);
+ wl_signal_add(&server.monitor.manager->events.apply, &server.event.monitor_apply);
}
static inline
@@ -156,6 +166,10 @@ main(int argc, char *argv[])
}
wlr_log(WLR_INFO, "Running Wayland compositor on WAYLAND_DISPLAY=%s", socket);
+ server.monitor.selected = monitor_at(server.cursor.dot->x, server.cursor.dot->y);
+ wlr_cursor_warp_closest(server.cursor.dot, nil, server.cursor.dot->x, server.cursor.dot->y);
+ wlr_xcursor_manager_set_cursor_image(server.cursor.manager, "left_ptr", server.cursor.dot);
+
wl_display_run(server.display); /* event loop */
cleanup();
diff --git a/sys/cmd/wm/monitor.c b/sys/cmd/wm/monitor.c
index 7fa4d57..9287bfc 100644
--- a/sys/cmd/wm/monitor.c
+++ b/sys/cmd/wm/monitor.c
@@ -1,5 +1,194 @@
#include "wm.h"
+/* callbacks */
+void
+monitor_change(struct wl_listener *l, void *data)
+{
+ Monitor *monitor;
+ struct wlr_output_configuration_v1 *config;
+
+ config = wlr_output_configuration_v1_create();
+ server.monitor.geometry = *wlr_output_layout_get_box(server.monitor.layout, nil);
+
+ wl_list_for_each(monitor, &server.monitor.list, link) {
+ struct wlr_output_configuration_head_v1 *head =
+ wlr_output_configuration_head_v1_create(config, monitor->output);
+
+ monitor->geometry = monitor->window = *wlr_output_layout_get_box(server.monitor.layout, monitor->output);
+ arrange(monitor);
+
+ head->state.enabled = monitor->output->enabled;
+ head->state.mode = monitor->output->current_mode;
+ head->state.x = monitor->geometry.x;
+ head->state.y = monitor->geometry.y;
+ }
+
+ wlr_output_manager_v1_set_configuration(server.monitor.manager, config);
+}
+
+static
+void
+trylayout(struct wlr_output_configuration_v1 *config, int force)
+{
+ int ok;
+ struct wlr_output_configuration_head_v1 *head;
+
+ ok = 1;
+ wl_list_for_each(head, &config->heads, link) {
+ struct wlr_output *output= head->state.output;
+ wlr_output_enable(output, head->state.enabled);
+ if (head->state.enabled) {
+ if (head->state.mode)
+ wlr_output_set_mode(output, head->state.mode);
+ else
+ wlr_output_set_custom_mode(
+ output,
+ head->state.custom_mode.width,
+ head->state.custom_mode.height,
+ head->state.custom_mode.refresh
+ );
+
+ wlr_output_layout_move(server.monitor.layout, output,
+ head->state.x, head->state.y);
+ wlr_output_set_transform(output, head->state.transform);
+ }
+
+ if(!(ok=wlr_output_test(output)))
+ break;
+ }
+
+ wl_list_for_each(head, &config->heads, link) {
+ if(ok && force)
+ wlr_output_commit(head->state.output);
+ else
+ wlr_output_rollback(head->state.output);
+ }
+
+ if(ok)
+ wlr_output_configuration_v1_send_succeeded(config);
+ else
+ wlr_output_configuration_v1_send_failed(config);
+
+ wlr_output_configuration_v1_destroy(config);
+}
+
+void
+monitor_apply(struct wl_listener *l, void *data)
+{
+ struct wlr_output_configuration_v1 *config = data;
+ trylayout(config, 1);
+}
+
+void
+monitor_test(struct wl_listener *l, void *data)
+{
+ struct wlr_output_configuration_v1 *config = data;
+ trylayout(config, 0);
+}
+
+void
+make_monitor(struct wl_listener *l, void *data)
+{
+ Client *client;
+ Monitor *monitor;
+ MonitorRule *rule;
+ struct wlr_output_mode *mode;
+ struct wlr_output *output = data;
+
+ /*
+ * XXX: needed?
+ if (wl_list_empty(&output->modes))
+ return;
+ */
+
+ monitor = output->data = calloc(1, sizeof(*monitor));
+ monitor->output = output;
+ monitor->tag.set[0] = monitor->tag.set[1] = 1;
+
+ for(rule=cfg·monitorrule; rule != cfg·endmonitorrule; ++rule) {
+ if(!rule->name || strstr(output->name, rule->name)) {
+ monitor->master.len = rule->master.len;
+ monitor->master.frac = rule->master.frac;
+
+ wlr_output_set_scale(output, rule->scale);
+ wlr_xcursor_manager_load(server.cursor.manager, rule->scale);
+ monitor->layouts[0] = monitor->layouts[1] = monitor->layout = rule->layout;
+
+ wlr_output_set_transform(output, rule->transform);
+ break;
+ }
+ }
+
+ mode = wlr_output_preferred_mode(output);
+ wlr_output_set_mode(output, mode);
+ wlr_output_enable_adaptive_sync(output, true);
+
+ monitor->event.render.notify = render_monitor;
+ wl_signal_add(&output->events.frame, &monitor->event.render);
+ monitor->event.destroy.notify = free_monitor;
+ wl_signal_add(&output->events.destroy, &monitor->event.destroy);
+
+ wlr_output_enable(output, true);
+ if(!wlr_output_commit(output))
+ return;
+
+ wl_list_insert(&server.monitor.list, &monitor->link);
+
+ wlr_output_layout_add(server.monitor.layout, output, rule->x, rule->y);
+ server.monitor.geometry = *wlr_output_layout_get_box(server.monitor.layout, nil);
+
+ /* update the geometries of all monitors */
+ wl_list_for_each(monitor, &server.monitor.list, link) {
+ /* first monitor in the list = most recently added */
+ wl_list_for_each(client, &server.client.list, link) {
+ if(client->isfloating)
+ resize(client, client->geometry.x+monitor->window.width, client->geometry.y,
+ client->geometry.width, client->geometry.height, 0);
+ }
+ return;
+ }
+}
+
+void
+free_monitor(struct wl_listener *l, void *data)
+{
+ int i, len;
+ Client *client;
+ struct wlr_output *output = data;
+ Monitor *monitor = output->data;
+
+ wl_list_remove(&monitor->event.destroy.link);
+ wl_list_remove(&monitor->event.render.link);
+ wl_list_remove(&monitor->link);
+
+ wlr_output_layout_remove(server.monitor.layout, monitor->output);
+
+ for(i=0, len=wl_list_length(&server.monitor.list); i < len; i++) {
+ server.monitor.selected = wl_container_of(server.monitor.list.prev, server.monitor.selected, link);
+ if(server.monitor.selected->output->enabled)
+ break;
+ }
+
+ focus(focused_client(server.monitor.selected), 1);
+
+ /* move closed monitor's clients to newly selected one */
+ wl_list_for_each(client, &server.client.list, link) {
+ if(client->isfloating && client->geometry.x > monitor->geometry.width)
+ resize(client,
+ client->geometry.x - monitor->window.width,
+ client->geometry.y,
+ client->geometry.width,
+ client->geometry.height,
+ 0
+ );
+ if(client->monitor == monitor)
+ attach(client, monitor, client->tags);
+ }
+
+ free(monitor);
+}
+
+/* methods */
void
arrange(Monitor *monitor)
{
@@ -27,9 +216,8 @@ tile(Monitor *monitor)
n = 0;
wl_list_for_each(client, &server.client.list, link) {
- if(VISIBLE_ON(client, monitor) && !client->isfloating) {
+ if(VISIBLE_ON(client, monitor) && !client->isfloating)
n++;
- }
}
if(!n) return;
@@ -54,3 +242,10 @@ tile(Monitor *monitor)
i++;
}
}
+
+Monitor *
+monitor_at(double x, double y)
+{
+ struct wlr_output *output = wlr_output_layout_output_at(server.monitor.layout, x, y);
+ return output ? output->data : nil;
+}
diff --git a/sys/cmd/wm/output.c b/sys/cmd/wm/render.c
index 1474a5f..3732ec5 100644
--- a/sys/cmd/wm/output.c
+++ b/sys/cmd/wm/render.c
@@ -65,7 +65,9 @@ render_clients(Monitor *monitor, struct timespec *now)
output = monitor->output;
wl_list_for_each_reverse(client, &server.client.stack, stack) {
- if(!client->ismapped)
+ if(!VISIBLE_ON(client, client->monitor))
+ continue;
+ if(!wlr_output_layout_intersects(server.monitor.layout, monitor->output, &client->geometry))
continue;
surface = client->xdg->surface;
@@ -103,7 +105,6 @@ render_clients(Monitor *monitor, struct timespec *now)
}
}
-static
void
render_monitor(struct wl_listener *l, void *data)
{
@@ -137,98 +138,3 @@ render_monitor(struct wl_listener *l, void *data)
wlr_renderer_end(server.renderer);
wlr_output_commit(monitor->output);
}
-
-static
-void
-free_monitor(struct wl_listener *l, void *data)
-{
- /*
- int len, i = 0;
- struct wlr_output *output = data;
- Monitor *monitor = output->data;
-
- wl_list_remove(&monitor->event.destroy.link);
- wl_list_remove(&monitor->event.render.link);
- wl_list_remove(&monitor->link);
-
- wlr_output_layout_remove(server.monitor.layout, monitor->output);
-
- len = wl_list_length(&server.monitor.list);
- */
-
- /*
- do // don't switch to disabled mons
- selmon = wl_container_of(mons.prev, selmon, link);
- while (!selmon->wlr_output->enabled && i++ < nmons);
- focusclient(focustop(selmon), 1);
-
- closemon(m);
- free(monitor);
- */
-}
-
-void
-make_monitor(struct wl_listener *l, void *data)
-{
- Client *client;
- Monitor *monitor;
- MonitorRule *rule;
- struct wlr_output_mode *mode;
- struct wlr_output *output = data;
-
- /*
- * XXX: needed?
- if (wl_list_empty(&output->modes))
- return;
- */
-
- monitor = calloc(1, sizeof(*monitor));
- monitor->output = output;
- for(rule=cfg·monitorrule; rule != cfg·endmonitorrule; ++rule) {
- if(!rule->name || strstr(output->name, rule->name)) {
- monitor->master.len = rule->master.len;
- monitor->master.frac = rule->master.frac;
-
- wlr_output_set_scale(output, rule->scale);
- wlr_xcursor_manager_load(server.cursor.manager, rule->scale);
- monitor->layouts[0] = monitor->layouts[1] = monitor->layout = rule->layout;
-
- wlr_output_set_transform(output, rule->transform);
- break;
- }
- }
-
- mode = wlr_output_preferred_mode(output);
- wlr_output_set_mode(output, mode);
- wlr_output_enable_adaptive_sync(output, true);
-
- monitor->event.render.notify = render_monitor;
- wl_signal_add(&output->events.frame, &monitor->event.render);
- monitor->event.destroy.notify = free_monitor;
- wl_signal_add(&output->events.destroy, &monitor->event.destroy);
-
- wlr_output_enable(output, true);
- if (!wlr_output_commit(output))
- return;
-
- wl_list_insert(&server.monitor.list, &monitor->link);
-
- wlr_output_layout_add(server.monitor.layout, output, rule->x, rule->y);
- server.monitor.geometry = *wlr_output_layout_get_box(server.monitor.layout, nil);
-
- /* update the geometries of all monitors */
- wl_list_for_each(monitor, &server.monitor.list, link) {
- /* first monitor in the list = most recently added */
- wl_list_for_each(client, &server.client.list, link) {
- if(client->isfloating)
- resize(client, client->geometry.x+monitor->window.width, client->geometry.y,
- client->geometry.width, client->geometry.height, 0);
- }
- return;
- }
-}
-
-void
-layout_change(struct wl_listener *l, void *data)
-{
-}
diff --git a/sys/cmd/wm/rules.mk b/sys/cmd/wm/rules.mk
index d1217fc..e50257f 100644
--- a/sys/cmd/wm/rules.mk
+++ b/sys/cmd/wm/rules.mk
@@ -7,7 +7,7 @@ SRCS_$(d) := \
$(d)/util.c \
$(d)/arg.c \
$(d)/input.c \
- $(d)/output.c \
+ $(d)/render.c \
$(d)/xdg.c \
$(d)/client.c \
$(d)/monitor.c \
diff --git a/sys/cmd/wm/wm.h b/sys/cmd/wm/wm.h
index cd51e29..f6ff752 100644
--- a/sys/cmd/wm/wm.h
+++ b/sys/cmd/wm/wm.h
@@ -217,10 +217,11 @@ struct Server
uint32 resize;
struct {
- struct wlr_output_layout *layout;
- struct wl_list list;
- struct wlr_box geometry;
- Monitor *selected;
+ struct wlr_output_layout *layout;
+ struct wl_list list;
+ struct wlr_box geometry;
+ struct wlr_output_manager_v1 *manager;
+ Monitor *selected;
} monitor;
struct {
@@ -240,7 +241,9 @@ struct Server
struct wl_listener make_xdg_surface;
struct wl_listener make_layer_surface;
- struct wl_listener layout_change;
+ struct wl_listener monitor_test;
+ struct wl_listener monitor_apply;
+ struct wl_listener monitor_change;
struct wl_listener cursor_move;
struct wl_listener cursor_move_abs;
@@ -259,41 +262,49 @@ extern struct Server server;
// functions
/* util.c */
-void scale_box(struct wlr_box *, float);
+void scale_box(struct wlr_box *, float);
-/* output.c */
-void make_monitor(struct wl_listener *, void *);
-void layout_change(struct wl_listener *, void *);
+/* render.c */
+void render_monitor(struct wl_listener *, void *);
/* xdg.c */
-void make_xdg_surface(struct wl_listener *, void *);
+void make_xdg_surface(struct wl_listener *, void *);
/* input.c */
-void make_input(struct wl_listener *, void *);
+void make_input(struct wl_listener *, void *);
-void cursor_axis(struct wl_listener *, void *);
-void cursor_frame(struct wl_listener *, void *);
-void cursor_button(struct wl_listener *, void *);
-void cursor_move(struct wl_listener *, void *);
-void cursor_move_abs(struct wl_listener *, void *);
+void cursor_axis(struct wl_listener *, void *);
+void cursor_frame(struct wl_listener *, void *);
+void cursor_button(struct wl_listener *, void *);
+void cursor_move(struct wl_listener *, void *);
+void cursor_move_abs(struct wl_listener *, void *);
-void request_cursor(struct wl_listener *, void *);
-void request_set_selection(struct wl_listener *, void *);
+void request_cursor(struct wl_listener *, void *);
+void request_set_selection(struct wl_listener *, void *);
/* client.c */
-void focus(Client *, struct wlr_surface *, int lift);
+void rules(Client *);
+void focus(Client *, int lift);
void resize(Client *, int x, int y, int w, int h, int interact);
+void attach(Client *, Monitor *, uint tags);
+
Client* client_at(double, double, struct wlr_surface **, double *, double *);
int client_has(Client *, double, double, struct wlr_surface **, double *, double *);
-/* XXX: deprecate */
-void setinteractive(Client *client, int mode, uint32 edges);
+void setinteractive(Client *client, int mode, uint32 edges); // XXX: deprecate
/* monitor.c */
void tile(Monitor *);
void arrange(Monitor *);
-Client * focused_client(Monitor *);
+Client *focused_client(Monitor *);
+Monitor *monitor_at(double x, double y);
+
+void monitor_test(struct wl_listener *, void *);
+void monitor_apply(struct wl_listener *, void *);
+void monitor_change(struct wl_listener *, void *);
+void free_monitor(struct wl_listener *, void *);
+void make_monitor(struct wl_listener *, void *);
#define CONFIG(a,b,...) extern a cfg·##b
#include "config.h"
diff --git a/sys/cmd/wm/xdg.c b/sys/cmd/wm/xdg.c
index d49cfb6..1d5ae68 100644
--- a/sys/cmd/wm/xdg.c
+++ b/sys/cmd/wm/xdg.c
@@ -5,7 +5,6 @@ void
map(struct wl_listener *l, void *data)
{
Client *client = wl_container_of(l, client, event.map);
- client->ismapped = true;
wl_list_insert(&server.client.list, &client->link);
wl_list_insert(&server.client.stack, &client->stack);
@@ -18,7 +17,8 @@ map(struct wl_listener *l, void *data)
wlr_xdg_toplevel_set_tiled(client->xdg,
WLR_EDGE_TOP|WLR_EDGE_BOTTOM|WLR_EDGE_LEFT|WLR_EDGE_RIGHT
);
- focus(client, client->xdg->surface, 1);
+
+ rules(client);
}
static
@@ -26,9 +26,10 @@ void
unmap(struct wl_listener *l, void *data)
{
Client *client = wl_container_of(l, client, event.unmap);
- client->ismapped = false;
wl_list_remove(&client->link);
+ attach(client, nil, 0);
+
wl_list_remove(&client->stack);
wl_list_remove(&client->focus);
}