Skip to content

Instantly share code, notes, and snippets.

@mickvangelderen
Created January 18, 2019 11:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mickvangelderen/627558200c0ff0ab19c096a0448374dd to your computer and use it in GitHub Desktop.
Save mickvangelderen/627558200c0ff0ab19c096a0448374dd to your computer and use it in GitHub Desktop.
Obtain a screen pointer by the screen number with xcb.
// Find XCB screen.
int default_screen_number = XDefaultScreen(display);
xcb_screen_t *screen = NULL;
xcb_screen_iterator_t iter = xcb_setup_roots_iterator(xcb_get_setup(connection));
int index = 0;
do {
if (index == default_screen_number) {
screen = iter.data;
break;
}
if (iter.rem > 0) {
index += 1;
xcb_screen_next(&iter);
continue;
}
} while (0);
if (!screen) {
fprintf(stderr, "Failed to find screen from screen number.\n");
exit_code = -1;
break;
}
@mickvangelderen
Copy link
Author

Implementation of xcb_screen_next:

void
xcb_screen_next (xcb_screen_iterator_t *i)
{
    xcb_screen_t *R = i->data;
    xcb_generic_iterator_t child;
    child.data = (xcb_screen_t *)(((char *)R) + xcb_screen_sizeof(R));
    i->index = (char *) child.data - (char *) i->data;
    --i->rem;
    i->data = (xcb_screen_t *) child.data;
}

xcb_screen_sizeof doesn't always return the same number, it can vary depending on the type of screen.

@oliverlee
Copy link

:)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment