How do I draw a pixmap to root window with xcb?

622 views Asked by At

I'm trying to write a window manager with a wallpaper switcher:

void smoke_change_background(smoke_wm_state_t *config, char *desktop) {
  struct smoke_desktop_list_element_t *node = smoke_desktop_list_node(config->tree, desktop);

  if (node->background != 0) {
    xcb_intern_atom_reply_t *xpmap = xcb_intern_atom_reply(config->connection,
            xcb_intern_atom(config->connection,
                            false,
                            strlen("_X_ROOTPMAP_ID"),
                            "_X_ROOTPMAP_ID"),
            NULL);
    xcb_intern_atom_reply_t *esetr = xcb_intern_atom_reply(config->connection,
            xcb_intern_atom(config->connection,
                            false,
                            strlen("ESETROOT_PMAP_ID"),
                            "ESETROOT_PMAP_ID"),
            NULL);

    xcb_get_property_reply_t *xrepl = xcb_get_property_reply(config->connection,
            xcb_get_property(config->connection,
                             0,
                             config->screen->root,
                             xpmap->atom,
                             XCB_ATOM_PIXMAP,
                             0,
                             32),
            NULL);
    uint32_t *xp = (uint32_t*) xcb_get_property_value(xrepl);

    xcb_get_property_reply_t *erepl = xcb_get_property_reply(config->connection,
            xcb_get_property(config->connection,
                             0,
                             config->screen->root,
                             esetr->atom,
                             XCB_ATOM_PIXMAP,
                             0, 32),
            NULL);
    uint32_t *ep = (uint32_t*) xcb_get_property_value(erepl);

    xcb_change_property(config->connection,
                            XCB_PROP_MODE_REPLACE,
                            config->screen->root,
                            xpmap->atom,
                            XCB_ATOM_PIXMAP,
                            32, 1,
                            (void*) &node->background);
    xcb_change_property(config->connection,
                            XCB_PROP_MODE_REPLACE,
                            config->screen->root,
                            esetr->atom,
                            XCB_ATOM_PIXMAP,
                            32, 1,
                            (void*) &node->background);

    xcb_free_pixmap(config->connection, *xp);
    xcb_free_pixmap(config->connection, *ep);

    uint32_t values[1];
    values[0] = node->background;
    xcb_change_window_attributes(config->connection, config->screen->root, XCB_CW_BACK_PIXMAP, values);

    xcb_clear_area(config->connection, false, config->screen->root, 0, 0, 0, 0);
    xcb_flush(config->connection);
  }
}

This code should change the root's pixmap and it should be displayed in my Xephyr window, but it is not. What's wrong?

0

There are 0 answers