aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/wm/output.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/wm/output.c')
-rw-r--r--sys/cmd/wm/output.c75
1 files changed, 61 insertions, 14 deletions
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;
+ }
}