all repos — ryudo @ b171a66b5c1e83abe1173c6ab02e465ab996f630

the floatiling window manager that flows; fork of rio from plan9port

monitor.c (raw)

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 <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
#include "dat.h"
#include "fns.h"

int nmonitors = 0;
XRRMonitorInfo* monitorinfo;

void fetchmonitorinfo() {
  if (monitorinfo)
    XRRFreeMonitors(monitorinfo);

  monitorinfo = XRRGetMonitors(dpy, DefaultRootWindow(dpy), 1, &nmonitors);
}

int getmonitorbyclient(Client* c) {
  XRRMonitorInfo m;
  int cx, cy, i, p;
  cx = c->x + c->dx / 2;
  cy = c->y + c->dy / 2;

  p = 0;

  for (i = 0; i < nmonitors; i++) {
    m = monitorinfo[i];
    if (cx >= m.x && cx < m.x + m.width && cy >= m.y && cy < m.y + m.height) {
      return i;
    }

    if (m.primary) {
      p = i;
    }
  }

  /* if center is not within any window, return primary */
  return p;
}

int getmonitorbymouse() {
  Window w;
  int x, y, i;
  unsigned int mask;
  XRRMonitorInfo m;

  XQueryPointer(dpy, DefaultRootWindow(dpy), &w, &w, &x, &y, &x, &y, &mask);
  for (i = 0; i < nmonitors; i++) {
    m = monitorinfo[i];
    if (x >= m.x && x < m.x + m.width && y >= m.y && y < m.y + m.height) {
      return i;
    }
  }
  /* should never reach here, but return first monitor if we do */
  return 0;
}