diff --git a/Makefile b/Makefile index 37bd046..cc7dff9 100644 --- a/Makefile +++ b/Makefile @@ -12,12 +12,12 @@ CFLAGS += -pipe CFLAGS += -Wall CPPFLAGS += -D_GNU_SOURCE ifndef NOLIBCAIRO -CFLAGS += $(shell pkg-config --cflags cairo xcb-keysyms xcb-dpms) -LIBS += $(shell pkg-config --libs cairo xcb-keysyms xcb-dpms xcb-image) +CFLAGS += $(shell pkg-config --cflags cairo xcb-keysyms xcb-dpms xcb-xinerama) +LIBS += $(shell pkg-config --libs cairo xcb-keysyms xcb-dpms xcb-xinerama xcb-image) else CPPFLAGS += -DNOLIBCAIRO -CFLAGS += $(shell pkg-config --cflags xcb-keysyms xcb-dpms) -LIBS += $(shell pkg-config --libs xcb-keysyms xcb-dpms xcb-image) +CFLAGS += $(shell pkg-config --cflags xcb-keysyms xcb-dpms xcb-xinerama) +LIBS += $(shell pkg-config --libs xcb-keysyms xcb-dpms xcb-image xcb-xinerama) endif LIBS += -lpam LIBS += -lev diff --git a/i3lock.c b/i3lock.c index 72bd646..d265009 100644 --- a/i3lock.c +++ b/i3lock.c @@ -36,6 +36,7 @@ #include "xcb.h" #include "cursors.h" #include "unlock_indicator.h" +#include "xinerama.h" char color[7] = "ffffff"; uint32_t last_resolution[2]; @@ -618,6 +619,9 @@ int main(int argc, char *argv[]) { xcb_connection_has_error(conn)) errx(EXIT_FAILURE, "Could not connect to X11, maybe you need to set DISPLAY?"); + xinerama_init(); + xinerama_query_screens(); + /* if DPMS is enabled, check if the X server really supports it */ if (dpms) { xcb_dpms_capable_cookie_t dpmsc = xcb_dpms_capable(conn); diff --git a/xcb.h b/xcb.h index e4f700c..a578679 100644 --- a/xcb.h +++ b/xcb.h @@ -2,6 +2,7 @@ #define _XCB_H #include +#include extern xcb_connection_t *conn; extern xcb_screen_t *screen; diff --git a/xinerama.c b/xinerama.c new file mode 100644 index 0000000..91be487 --- /dev/null +++ b/xinerama.c @@ -0,0 +1,86 @@ +/* + * vim:ts=4:sw=4:expandtab + * + * © 2010-2012 Michael Stapelberg + * + * See LICENSE for licensing information + * + */ +#include +#include +#include +#include +#include +#include + +#include "xcb.h" +#include "xinerama.h" + +/* Number of Xinerama screens which are currently present. */ +int xr_screens = 0; + +/* The resolutions of the currently present Xinerama screens. */ +Rect *xr_resolutions; + +static bool xinerama_active; + +void xinerama_init() { + if (!xcb_get_extension_data(conn, &xcb_xinerama_id)->present) { + printf("Xinerama extension not found, disabling.\n"); + return; + } + + xcb_xinerama_is_active_cookie_t cookie; + xcb_xinerama_is_active_reply_t *reply; + + cookie = xcb_xinerama_is_active(conn); + reply = xcb_xinerama_is_active_reply(conn, cookie, NULL); + if (!reply) + return; + + if (!reply->state) { + free(reply); + return; + } + + xinerama_active = true; +} + +void xinerama_query_screens() { + if (!xinerama_active) + return; + + xcb_xinerama_query_screens_cookie_t cookie; + xcb_xinerama_query_screens_reply_t *reply; + xcb_xinerama_screen_info_t *screen_info; + + cookie = xcb_xinerama_query_screens_unchecked(conn); + reply = xcb_xinerama_query_screens_reply(conn, cookie, NULL); + if (!reply) { + fprintf(stderr, "Couldn't get Xinerama screens\n"); + return; + } + screen_info = xcb_xinerama_query_screens_screen_info(reply); + int screens = xcb_xinerama_query_screens_screen_info_length(reply); + + Rect *resolutions = malloc(screens * sizeof(Rect)); + /* No memory? Just keep on using the old information. */ + if (!resolutions) { + free(reply); + return; + } + xr_resolutions = resolutions; + xr_screens = screens; + + for (int screen = 0; screen < xr_screens; screen++) { + xr_resolutions[screen].x = screen_info[screen].x_org; + xr_resolutions[screen].y = screen_info[screen].y_org; + xr_resolutions[screen].width = screen_info[screen].width; + xr_resolutions[screen].height = screen_info[screen].height; + printf("found Xinerama screen: %d x %d at %d x %d\n", + screen_info[screen].width, screen_info[screen].height, + screen_info[screen].x_org, screen_info[screen].y_org); + } + + free(reply); +} diff --git a/xinerama.h b/xinerama.h new file mode 100644 index 0000000..ea1804e --- /dev/null +++ b/xinerama.h @@ -0,0 +1,14 @@ +#ifndef _XINERAMA_H +#define _XINERAMA_H + +typedef struct Rect { + int16_t x; + int16_t y; + uint16_t width; + uint16_t height; +} Rect; + +void xinerama_init(); +void xinerama_query_screens(); + +#endif