From 7e7fab861a7e5baae9182419f7f320af36ce1ec4 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Wed, 29 Sep 2021 12:59:39 -0700 Subject: Feat(wm): prepararation for layout mechanism --- sys/cmd/wm/output.c | 75 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 14 deletions(-) (limited to 'sys/cmd/wm/output.c') diff --git a/sys/cmd/wm/output.c b/sys/cmd/wm/output.c index 46e702f..910f57b 100644 --- a/sys/cmd/wm/output.c +++ b/sys/cmd/wm/output.c @@ -64,7 +64,7 @@ render_clients(Monitor *monitor, struct timespec *now) struct wlr_surface *surface; output = monitor->output; - wl_list_for_each_reverse(client, &server.clients, link) { + wl_list_for_each_reverse(client, &server.client.stack, stack) { if(!client->ismapped) continue; @@ -108,11 +108,20 @@ void render_monitor(struct wl_listener *l, void *data) { int w, h; + Client *client; Monitor *monitor; struct timespec now; - monitor = wl_container_of(l, monitor, event.render); clock_gettime(CLOCK_MONOTONIC, &now); + monitor = wl_container_of(l, monitor, event.render); + + /* + wl_list_for_each(client, &server.client.list, link) { + if(client->resize) { + wlr_surface_send_frame_done(client->xdg->surface, &now); + } + } + */ if(!wlr_output_attach_render(monitor->output, nil)) return; @@ -135,6 +144,7 @@ static void free_monitor(struct wl_listener *l, void *data) { + /* int len, i = 0; struct wlr_output *output = data; Monitor *monitor = output->data; @@ -146,6 +156,8 @@ free_monitor(struct wl_listener *l, void *data) 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); @@ -160,25 +172,60 @@ free_monitor(struct wl_listener *l, void *data) void make_monitor(struct wl_listener *l, void *data) { + Client *client; + Monitor *monitor; + MonitorRule *rule; struct wlr_output_mode *mode; - struct Monitor *monitor; - struct wlr_output *output = data; - - if (!wl_list_empty(&output->modes)) { - mode = wlr_output_preferred_mode(output); - wlr_output_set_mode(output, mode); - wlr_output_enable(output, true); - if (!wlr_output_commit(output)) { - return; - } - } + 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->layout[0] = monitor->layout[1] = 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_auto(server.monitor.layout, output); + 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->geo.x+monitor->window.width, client->geo.y, + client->geo.width, client->geo.height, 0); + } + return; + } } -- cgit v1.2.1