/* function prototypes */
void buttonpress(xcb_button_press_event_t *);
+void check_conn(void);
void clientmessage(xcb_client_message_event_t *);
int conf_load(char *, int);
void configurenotify(xcb_configure_notify_event_t *);
xcb_screen_t *
get_screen(int screen)
{
- xcb_screen_iterator_t i;
+ const xcb_setup_t *r;
+ xcb_screen_iterator_t iter;
- i = xcb_setup_roots_iterator(xcb_get_setup(conn));
- for (; i.rem; --screen, xcb_screen_next(&i))
+ if ((r = xcb_get_setup(conn)) == NULL) {
+ DNPRINTF(SWM_D_MISC, "get_screen: xcb_get_setup\n");
+ check_conn();
+ }
+
+ iter = xcb_setup_roots_iterator(r);
+ for (; iter.rem; --screen, xcb_screen_next(&iter))
if (screen == 0)
- return (i.data);
+ return (iter.data);
return (NULL);
}
sidx, num_screens);
sidx--;
- screen = get_screen(sidx);
+ if ((screen = get_screen(sidx)) == NULL)
+ errx(1, "ERROR: can't get screen %d.", sidx);
+
if (w < 1 || h < 1)
errx(1, "region %ux%u+%u+%u too small", w, h, x, y);
{
char *font, *fontpos, *dup, *search;
int count;
- xcb_screen_t *screen = get_screen(r->s->idx);
+ xcb_screen_t *screen;
uint32_t wa[3];
XRenderColor color;
+ if ((screen = get_screen(r->s->idx)) == NULL)
+ errx(1, "ERROR: can't get screen %d.", r->s->idx);
+
if (r->bar != NULL)
return;
xcb_create_pixmap(conn, screen->root_depth, r->bar->buffer, r->bar->id,
WIDTH(r->bar), HEIGHT(r->bar));
- xcb_randr_select_input(conn, r->bar->id,
- XCB_RANDR_NOTIFY_MASK_OUTPUT_CHANGE);
+ if (xrandr_support)
+ xcb_randr_select_input(conn, r->bar->id,
+ XCB_RANDR_NOTIFY_MASK_OUTPUT_CHANGE);
if (bar_enabled)
map_window_raised(r->bar->id);
xcb_flush(conn);
}
+#ifdef XCB_CONN_ERROR
+void
+check_conn(void)
+{
+ int err = xcb_connection_has_error(conn);
+ char *s;
+
+ switch (err) {
+ case XCB_CONN_ERROR:
+ s = "Socket error, pipe error or other stream error.";
+ break;
+ case XCB_CONN_CLOSED_EXT_NOTSUPPORTED:
+ s = "Extension not supported.";
+ break;
+ case XCB_CONN_CLOSED_MEM_INSUFFICIENT:
+ s = "Insufficient memory.";
+ break;
+ case XCB_CONN_CLOSED_REQ_LEN_EXCEED:
+ s = "Request length was exceeded.";
+ break;
+ case XCB_CONN_CLOSED_PARSE_ERR:
+ s = "Error parsing display string.";
+ break;
+ default:
+ s = "Unknown error.";
+ }
+
+ if (err)
+ errx(err, "X CONNECTION ERROR: %s", s);
+}
+#else
+void
+check_conn(void)
+{
+ if (conn->has_error)
+ errx(1, "X CONNECTION ERROR");
+}
+#endif
+
int
enable_wm(void)
{
/* this causes an error if some other window manager is running */
num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
for (i = 0; i < num_screens; i++) {
- sc = get_screen(i);
+ if ((sc = get_screen(i)) == NULL)
+ errx(1, "ERROR: can't get screen %d.", i);
DNPRINTF(SWM_D_INIT, "enable_wm: screen %d, root: 0x%x\n",
i, sc->root);
wac = xcb_change_window_attributes_checked(conn, sc->root,
xcb_randr_get_crtc_info_cookie_t cic;
xcb_randr_get_crtc_info_reply_t *cir = NULL;
xcb_randr_crtc_t *crtc;
- xcb_screen_t *screen = get_screen(i);
+ xcb_screen_t *screen;
+
+ if ((screen = get_screen(i)) == NULL)
+ errx(1, "ERROR: can't get screen %d.", i);
num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
if (i >= num_screens)
struct workspace *ws;
uint32_t gcv[1], wa[1];
const xcb_query_extension_reply_t *qep;
+ xcb_screen_t *screen;
xcb_cursor_t cursor;
xcb_font_t cursor_font;
xcb_randr_query_version_cookie_t c;
/* initial Xrandr setup */
xrandr_support = 0;
- c = xcb_randr_query_version(conn, 1, 1);
- r = xcb_randr_query_version_reply(conn, c, NULL);
- if (r) {
- if (r->major_version >= 1) {
- qep = xcb_get_extension_data(conn, &xcb_randr_id);
- if (qep) {
+ qep = xcb_get_extension_data(conn, &xcb_randr_id);
+ if (qep->present) {
+ c = xcb_randr_query_version(conn, 1, 1);
+ r = xcb_randr_query_version_reply(conn, c, NULL);
+ if (r) {
+ if (r->major_version >= 1) {
xrandr_support = 1;
xrandr_eventbase = qep->first_event;
}
+ free(r);
}
- free(r);
}
cursor_font = xcb_generate_id(conn);
screens[i].idx = i;
TAILQ_INIT(&screens[i].rl);
TAILQ_INIT(&screens[i].orl);
- screens[i].root = get_screen(i)->root;
+ if ((screen = get_screen(i)) == NULL)
+ errx(1, "ERROR: can't get screen %d.", i);
+ screens[i].root = screen->root;
/* set default colors */
setscreencolor("red", i + 1, SWM_S_COLOR_FOCUS);