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; } |