mirror of
https://github.com/Raymo111/i3lock-color.git
synced 2024-11-11 13:50:52 -05:00
dc2b6e5f39
See also: http://article.gmane.org/gmane.linux.kernel/1268792 The C compiler will handle (void) as "no arguments" and () as "variadic function" (equivalent to (...)) which might lead to subtle errors, such as the one which was fixed with commit 0ea64ae4.
89 lines
2.4 KiB
C
89 lines
2.4 KiB
C
/*
|
|
* vim:ts=4:sw=4:expandtab
|
|
*
|
|
* © 2010-2012 Michael Stapelberg
|
|
*
|
|
* See LICENSE for licensing information
|
|
*
|
|
*/
|
|
#include <stdbool.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
#include <xcb/xcb.h>
|
|
#include <xcb/xinerama.h>
|
|
|
|
#include "i3lock.h"
|
|
#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;
|
|
extern bool debug_mode;
|
|
|
|
void xinerama_init(void) {
|
|
if (!xcb_get_extension_data(conn, &xcb_xinerama_id)->present) {
|
|
DEBUG("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(void) {
|
|
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) {
|
|
if (debug_mode)
|
|
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;
|
|
DEBUG("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);
|
|
}
|