Xcb
Introduction
Porting Xlib calls to xcb is fairly straightfoward, since most of the time it's a matter of replacing a call to an Xlib function with a call to the equivalent xcb function. This page mainly deals with exceptions to that rule, and things that might not be obvious even if you are familiar with Xlib.
Porting can be done gradually, since you can mix xcb and Xlib calls. The only exception is event processing. The event queue is managed either by xcb or Xlib, not both at the same time.
Macros
RootWindow(), DisplayWidth(), DisplayHeight(), DefaultDepth() etc.
- Xlib code
Window root = RootWindow(dpy, screen);
int depth = DefaultDepth(dpy, screen);
int width = DisplayWidth(dpy, screen);
int height = DisplayHeight(dpy, screen);
- xcb equivalent
xcb_screen_t *screen = xcb_aux_get_screen(c, screen);
xcb_window_t root = screen->root;
int depth = screen->root_depth;
int width = screen->width;
int height = screen->height;
If you need a pointer to the xcb_screen_t for the default screen, call QPlatformNativeInterface::nativeResourceForWindow("screen", 0)) and cast the returned pointer to xcb_screen_t *.
DefaultRootWindow(), DefaultVisual(), DefaultDepth(), DefaultColormap()
See the previous section and the comment about obtaining a pointer to the xcb_screen_t for the default screen.
Functions
XSelectInput()
XSelectInput() is a convenience function that uses the ChangeWindowAttributes request to change the event mask for a window. The xcb equivalent of XSelectInput() is thus xcb_change_window_attributes().
- Xlib example
XSelectInput(dpy, window, PropertyChangeMask);
- xcb equivalent
uint32_t mask = XCB_EVENT_MASK_PROPERTY_CHANGE;
xcb_change_window_attributes(c, window, XCB_CW_EVENT_MASK, &mask);
Note that this applies only to XSelectInput(), not other input selection functions added by extensions.
XSync()
The xcb equivalent of XSync() is xcb_aux_sync(), which is in xcb-utils.
The reason you won't find a sync function in libxcb is that there is no sync request in the X protocol. Calling XSync() or xcb_aux_sync() is equivalent to calling XGetInputFocus() and throwing away the reply.
XMoveWindow(), XResizeWindow(), XMoveResizeWindow(), XSetWindowBorderWidth(), XRaiseWindow(), XLowerWindow(), XRestackWindows()
These functions are Xlib convenience functions that translate to the same X request; ConfigureWindow. The xcb equivalent is thus xcb_configure_window().
- XMoveResize() example
XMoveWindow(dpy, window, x, y);
uint32_t values[] = { x, y };
xcb_configure_window(c, window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, values);
- XRaiseWindow() example
XRaiseWindow(dpy, window);
uint32_t value = XCB_STACK_MODE_ABOVE;
xcb_configure_window(c, window, XCB_CONFIG_STACK_MODE, &value);
Multiple calls to these functions can be combined into single call to xcb_configure_window():
XMoveWindow(dpy, window, x, y);
XResizeWindow(dpy, window, width, height);
XRaiseWindow(dpy, window);
uint32_t values[] = { x, y, width, height, XCB_STACK_MODE_ABOVE };
xcb_configure_window(c, window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y |
XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT | XCB_CONFIG_STACK_MODE,
values);
Note that the order of the values in the values array must match the order in the xcb_config_window_t enum.