LINUX.ORG.RU

XCB — как неизведанный зверь, или как узнать количество элементов в списке intern atom-ов?

 , ,


0

1

имеется арч, в принципе последние пакеты, XCB...

имеется такой код — в нем я достаю из системы айдишники всех окон в системе.
однако возник вопрос, на который я не нашел ответа в офф доках — как узнать количество элементов в intern atom-е, если он представляет из себя массив?
так в функции

xcb_get_property()
последний аргумент количество элементов, пробовал различные функции для его определения, в том числе
xcb_intern_atom_sizeof()
 — но оно выдает значение «8» для атома _NET_CLIENT_LIST, вне зависимости от количества открытых окон. Но я передавал туда значение возвращаемое функцией
xcb_intern_atom_reply()
 — возможно енто и не верно, но в доках ничего не указано — а там вообще принимается void*.

может ктото юзал енту либу и вычислял енто значение?
пока что у меня енто значение прямо указано в 1000 — однако енто логически неверно.

ответ тут и далее по теме

★★

пока что у меня енто значение прямо указано в 1000 — однако енто логически неверно

Запрашиваешь 1000, а сколько реально вернулось, узнаешь с помощью xcb_get_property_value_length(). Если есть еще, то bytes_after будет не 0. Тогда опять вызываешь xcb_get_property() и передаешь ей offset.

Типа такого (пример из Qt):

    do {
        auto reply = Q_XCB_REPLY(xcb_get_property, xcb_connection(), false, root, atom(QXcbAtom::_NET_SUPPORTED), XCB_ATOM_ATOM, offset, 1024);
        if (!reply)
            break;

        remaining = 0;

        if (reply->type == XCB_ATOM_ATOM && reply->format == 32) {
            int len = xcb_get_property_value_length(reply.get())/sizeof(xcb_atom_t);
            xcb_atom_t *atoms = (xcb_atom_t *)xcb_get_property_value(reply.get());
            int s = net_wm_atoms.size();
            net_wm_atoms.resize(s + len);
            memcpy(net_wm_atoms.data() + s, atoms, len*sizeof(xcb_atom_t));

            remaining = reply->bytes_after;
            offset += len;
        }
    } while (remaining > 0);
anonymous ()

через xcb_get_property_value_length, sizeof как обычно выдает байты. Вот нашел специально в исходниках ./src/xproto.c

int
xcb_get_property_value_length (const xcb_get_property_reply_t *R  /**< */)
{
    return (R->value_len * (R->format / 8));
}

сразу отвечаю на вопрос, формат задает какого размера один элемент

arrecck ★★ ()
Ответ на: комментарий от anonymous

как то енто все костыльно выглядит... я конечно понимаю чо результат общения с intern atom енто всего лишь какой то снова же айдишник, но зачем тогда вообще было делать указываемой енту максимальную длину...???

safocl ★★ ()
Ответ на: комментарий от safocl

зачем тогда вообще было делать указываемой енту максимальную длину…???

Потому что клиент-сервер, данные качаются (через сокет) между клиентом и серврером. Вдруг у тебя там сто-тысяч-миллионов значений. Вот и дали параметры offset и len, чтобы порционно вытаскивать (нужные) куски данных.

anonymous ()