Как нарисовать растровое изображение в корневом окне с помощью xcb?

Я пытаюсь написать оконный менеджер с переключателем обоев:

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);
  }
}

Этот код должен изменить растровое изображение корня, и он должен отображаться в моем окне Xephyr, но это не так. В чем дело?

(Примечание редактора: система пересмотра просит меня добавить больше деталей, но, поскольку я не являюсь первоначальным автором, я абсолютно не знаю, что добавить. Итак, вот этот бесполезный текст, чтобы сделать его счастливым).

0 ответов

Другие вопросы по тегам