Не удается получить ошибку от xcb_get_property_reply для несуществующего _NET_WM_PID

Я использую XCB, чтобы спросить окна X11 для PID их процессов, среди других свойств. Мой код для получения различных нестроковых атрибутов выглядит следующим образом:

xcb_window_t wid;
xcb_connection_t * conn;

template <typename T>
T get_property(xcb_atom_t property, xcb_atom_t type, size_t len = sizeof(T)) {
xcb_generic_error_t *err = nullptr; // can't use unique_ptr here because get_property_reply overwrites pointer value

/*
Specifies how many 32-bit multiples of data should be retrieved
(e.g. if you set long_length to 4, you will receive 16 bytes of data).
*/
uint32_t ret_size =
len/sizeof(uint32_t) /*integer division, like floor()*/ +
!!(len%sizeof(uint32_t)) /*+1 if there was a remainder*/;

xcb_get_property_cookie_t cookie = xcb_get_property(
conn, 0, wid, property, type, 0, ret_size
);

std::unique_ptr<xcb_get_property_reply_t,decltype(&free)> reply {xcb_get_property_reply(conn, cookie, &err),&free};
if (!reply) {
free(err);
throw std::runtime_error("xcb_get_property returned error");
}

return *reinterpret_cast<T*>(
xcb_get_property_value(
reply.get()
)
);
}

xcb_atom_t NET_WM_PID; // initialized using xcb_intern_atom
// according to libxcb-ewmh, CARDINALs are uint32_t
pid_t pid = get_property<uint32_t>(NET_WM_PID, XCB_ATOM_CARDINAL);

Обработка ошибок воспроизводится из XCB-запросы (3). Проблемы возникают, когда у окна нет _NET_WM_PID набор свойств (например, рабочий файловый менеджер этого не делает). В этом случае вместо получения nullptr от xcb_get_property_reply и ненулевой errЯ получаю числовой ответ, равный порядковому номеру запроса XCB. Как правильно проверить, если _NET_WM_PID или другое свойство типа CARDINAL не установлен на окне?

1

Решение

Отсутствие имущества не является ошибкой. Если свойство не задано, формат, тип и длина в ответе будут равны нулю. Вы, вероятно, хотите проверить их все и убедиться, что они имеют значения, которые вы ожидаете от них.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]