#include #include #include "xinerama.h" #define max_monitors 16 struct monitor { int x; int y; int width; int height; }; static struct monitor monitors[max_monitors]; static int monitor_count; static int point_in_monitor(int x, int y, int monitor) { if (x < monitors[monitor].x || y < monitors[monitor].y) return 0; if (x >= monitors[monitor].x + monitors[monitor].width) return 0; if (y >= monitors[monitor].y + monitors[monitor].height) return 0; return 1; } int xinerama_init(Display *display, Window root_window) { XWindowAttributes root_attrs; XineramaScreenInfo *screen_info; int i, j, major, minor; monitor_count = 1; if (!XGetWindowAttributes(display, root_window, &root_attrs)) return monitor_count; monitors[0].x = 0; monitors[0].y = 0; monitors[0].width = root_attrs.width; monitors[0].height = root_attrs.height; if (!XineramaQueryExtension(display, &major, &minor) || !XineramaIsActive(display)) return monitor_count; screen_info = XineramaQueryScreens(display, &j); if (screen_info == None || j < 1) return monitor_count; monitor_count = j; if (monitor_count > max_monitors) monitor_count = max_monitors; for (i = 0; i < monitor_count; i++) { monitors[i].x = screen_info[i].x_org; monitors[i].y = screen_info[i].y_org; monitors[i].width = screen_info[i].width; monitors[i].height = screen_info[i].height; } XFree(screen_info); return monitor_count; } int xinerama_monitor_for_point(int x, int y) { int i; for (i = 0; i < monitor_count; i++) if (point_in_monitor(x, y, i)) return i; return 0; } int xinerama_monitor_for_window(Display *display, Window root_window, Window window) { XWindowAttributes window_attrs; int x, y; (void)root_window; if (!XGetWindowAttributes(display, window, &window_attrs)) return 0; x = window_attrs.x + (window_attrs.width / 2); y = window_attrs.y + (window_attrs.height / 2); return xinerama_monitor_for_point(x, y); } int xinerama_monitor_geometry(int monitor, int *x, int *y, int *width, int *height) { if (monitor < 0 || monitor >= monitor_count) return 0; if (x != NULL) *x = monitors[monitor].x; if (y != NULL) *y = monitors[monitor].y; if (width != NULL) *width = monitors[monitor].width; if (height != NULL) *height = monitors[monitor].height; return 1; }