aboutsummaryrefslogtreecommitdiff
path: root/x11.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11.c')
-rw-r--r--x11.c59
1 files changed, 46 insertions, 13 deletions
diff --git a/x11.c b/x11.c
index 032b6d4..9f4aabd 100644
--- a/x11.c
+++ b/x11.c
@@ -9,18 +9,20 @@
#include <xcb/xproto.h>
#include <xcb/xcb_icccm.h>
#include <xcb/xcb_xrm.h>
+#include <xcb/randr.h>
#include "x11.h"
+#include "log.h"
struct Window {
xcb_screen_t *screen;
xcb_connection_t *connection;
- xcb_xrm_database_t *database;
+ xcb_xrm_database_t *database;
xcb_drawable_t window;
xcb_visualtype_t *visual_type;
cairo_surface_t *surface;
cairo_t *cr;
- double dpi;
+ double dpi;
};
Window *window_create(void)
@@ -29,21 +31,45 @@ Window *window_create(void)
int preferred_screen = 0;
win->connection = xcb_connect(NULL, &preferred_screen);
- assert(win->connection != NULL && !xcb_connection_has_error(win->connection));
+ assert(win->connection != NULL && !xcb_connection_has_error(win->connection));
+ log_debug("Xcb established connection");
- win->database = xcb_xrm_database_from_default(win->connection);
- assert(win->database != NULL);
+ xcb_randr_query_version_cookie_t version_cookie = xcb_randr_query_version(win->connection,
+ XCB_RANDR_MAJOR_VERSION,
+ XCB_RANDR_MINOR_VERSION);
- char *dpi_value;
- if (xcb_xrm_resource_get_string(win->database, "Xft.dpi", "Xft.dpi", &dpi_value) >= 0) {
- win->dpi = strtod(dpi_value, NULL);
- g_free(dpi_value);
- } else {
- // TODO: Calculate automatically somehow
- win->dpi = 96.0;
- }
+ xcb_generic_error_t *error;
+ xcb_randr_query_version_reply_t *randr_version = xcb_randr_query_version_reply(win->connection,
+ version_cookie,
+ &error);
+
+ log_debug("RandR version %d.%d", randr_version->major_version, randr_version->minor_version);
+ assert(error == NULL || randr_version->major_version < 1);
+
+ xcb_randr_select_input(win->connection,
+ win->window,
+ XCB_RANDR_NOTIFY_MASK_SCREEN_CHANGE |
+ XCB_RANDR_NOTIFY_MASK_OUTPUT_CHANGE |
+ XCB_RANDR_NOTIFY_MASK_OUTPUT_PROPERTY);
+
+ win->database = xcb_xrm_database_from_default(win->connection);
+ assert(win->database != NULL);
+
+ char *dpi_value;
+ if (xcb_xrm_resource_get_string(win->database, "Xft.dpi", "Xft.dpi", &dpi_value) >= 0) {
+ log_debug("Xrm query '%s' found '%s'", "Xft.dpi", dpi_value);
+
+ win->dpi = strtod(dpi_value, NULL);
+ g_free(dpi_value);
+ } else {
+ log_debug("Xrm query '%s' not found", "Xft.dpi");
+
+ // TODO: Calculate automatically somehow
+ win->dpi = 96.0;
+ }
xcb_screen_iterator_t iter = xcb_setup_roots_iterator(xcb_get_setup(win->connection));
+ log_debug("Default screen %d", preferred_screen);
while (preferred_screen != 0 && iter.rem) {
xcb_screen_next(&iter);
@@ -65,6 +91,8 @@ Window *window_create(void)
// XCB_CW_BORDER_PIXEL | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP,
&win->screen->white_pixel);
+ log_debug("X11 window created (id %u)", win->window);
+
xcb_icccm_set_wm_name(win->connection, win->window, XCB_ATOM_STRING, 8, strlen("comet"), "comet");
xcb_map_window(win->connection, win->window);
xcb_flush(win->connection);
@@ -86,8 +114,13 @@ Window *window_create(void)
done:
+ log_debug("Xcb initialized");
+
win->surface = cairo_xcb_surface_create(win->connection, win->window, win->visual_type, w, h);
+ assert(cairo_surface_status(win->surface) == CAIRO_STATUS_SUCCESS);
+
win->cr = cairo_create(win->surface);
+ assert(cairo_status(win->cr) == CAIRO_STATUS_SUCCESS);
log_debug("Cairo initialized");