aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/wm/monitor.c
blob: 7fa4d573679358264df449173793c2bef8954ce5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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++;
    }
}