aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/wm/monitor.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/wm/monitor.c')
-rw-r--r--sys/cmd/wm/monitor.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/sys/cmd/wm/monitor.c b/sys/cmd/wm/monitor.c
new file mode 100644
index 0000000..7fa4d57
--- /dev/null
+++ b/sys/cmd/wm/monitor.c
@@ -0,0 +1,56 @@
+#include "wm.h"
+
+void
+arrange(Monitor *monitor)
+{
+ if(monitor->layout->arrange)
+ monitor->layout->arrange(monitor);
+}
+
+Client *
+focused_client(Monitor *monitor)
+{
+ Client *client;
+ wl_list_for_each(client, &server.client.focus, focus) {
+ if(VISIBLE_ON(client, monitor))
+ return client;
+ }
+
+ return nil;
+}
+
+void
+tile(Monitor *monitor)
+{
+ Client *client;
+ uint i, n, h, mw, my, ty;
+
+ n = 0;
+ wl_list_for_each(client, &server.client.list, link) {
+ if(VISIBLE_ON(client, monitor) && !client->isfloating) {
+ n++;
+ }
+ }
+ if(!n) return;
+
+ if(n > monitor->master.len)
+ mw = monitor->master.len ? monitor->window.width * monitor->master.frac : 0;
+ else
+ mw = monitor->window.width;
+
+ i = my = ty = 0;
+ wl_list_for_each(client, &server.client.list, link) {
+ if(!VISIBLE_ON(client,monitor) || client->isfloating || client->isfullscreen)
+ continue;
+ if(i < monitor->master.len) {
+ h = (monitor->window.height - my) / (MIN(n, monitor->master.len) - i);
+ resize(client, monitor->window.x, monitor->window.y + my, mw, h, 0);
+ my += client->geometry.height;
+ } else {
+ h = (monitor->window.height - ty) / (n - i);
+ resize(client, monitor->window.x + mw, monitor->window.y + ty, monitor->window.width - mw, h, 0);
+ ty += client->geometry.height;
+ }
+ i++;
+ }
+}