LINUX.ORG.RU

История изменений

Исправление Zubok, (текущая версия) :

В общем, пишу я это вслепую. То есть вот просто, без компиляции, без ничего. Проверок минимум, все быстро накидал, мог где-то ошибиться. Потом проверю. Здесь conn - это переменная типа xcb_connection_t, которую ты из Qt берешь, а wid - это XID окна в иксах, который ты тоже у окна приложения из Qt берешь. Не знаю, где он там, но должен быть где-то в классе окна. Проверку на ошибки надо еще раз глянуть, чтобы все корректно было. Объявления функции нет - сам сделай. Результатом по идее должен быть номер рабочего стола.

// резервируем cookies для приема ответа от сервера

xcb_intern_atom_cookie_t intern_atom_cookie;
xcb_get_property_cookie_t get_property_cookie;
xcb_atom_t atom;

// Интерним атом в X-сервер при помощи InternAtom.

intern_atom_cookie = xcb_intern_atom(conn, 0, strlen("_NET_WM_DESKTOP"), "_NET_WM_DESKTOP");

// Забираем ответ от сервера. Можно забирать гораздо позже, когда
// данные действительно понадобятся.

xcb_intern_atom_reply_t *intern_atom_reply = xcb_intern_atom_reply(conn, intern_atom_cookie, NULL);

// Вот наш XID атома. Им оперируем.

if (!intern_atom_reply)
    return;

atom = intern_atom_reply->atom;
free(intern_atom_reply);

// Теперь спросим про его значение. wid - это XID окна.

get_property_cookie = xcb_get_property(conn, 0, wid, atom, XCB_ATOM_CARDINAL, 0, 1);

xcb_get_property_reply_t *get_property_reply = xcb_get_property_reply(conn, get_property_cookie, NULL);

// Проверяем, все ли правильно

if (get_property_reply) {
    if (get_property_reply->type == XCB_ATOM_CARDINAL &&
	get_property_reply->value_len == 1 &&
	get_property_reply->format == 32) {

	// Все ок, читаем свойство.
	uint32_t *value = (uint32_t *) xcb_get_property_value(get_property_reply);
    }
    free(get_property_reply);
    return value;
}
 
return;

Исправление Zubok, :

В общем, пишу я это вслепую. То есть вот просто, без компиляции, без ничего. Проверок минимум, все быстро накидал, мог где-то ошибиться. Потом проверю. Здесь conn - это переменная типа xcb_connection_t, которую ты из Qt берешь, а wid - это XID окна в иксах, который ты тоже у окна приложения из Qt берешь. Не знаю, где он там, но должен быть где-то в классе окна. Проверку на ошибки надо еще раз глянуть, чтобы все корректно было. Объявления функции нет - сам сделай. Результатом по идее должен быть номер рабочего стола.

// резервируем cookies для приема ответа от сервера

xcb_intern_atom_cookie_t atom_cookie;
xcb_get_property_cookie_t get_property_cookie;
xcb_atom_t atom;

// Интерним атом в X-сервер при помощи InternAtom.

intern_atom_cookie = xcb_intern_atom(conn, 0, strlen("_NET_WM_DESKTOP"), "_NET_WM_DESKTOP");

// Забираем ответ от сервера. Можно забирать гораздо позже, когда
// данные действительно понадобятся.

xcb_intern_atom_reply_t *intern_atom_reply = xcb_intern_atom_reply(conn, intern_atom_cookie, NULL);

// Вот наш XID атома. Им оперируем.

if (!intern_atom_reply)
    return;

atom = intern_atom_reply->atom;
free(intern_atom_reply);

// Теперь спросим про его значение. wid - это XID окна.

get_property_cookie = xcb_get_property(conn, 0, wid, atom, XCB_ATOM_CARDINAL, 0, 1);

xcb_get_property_reply_t *get_property_reply = xcb_get_property_reply(conn, get_property_cookie, NULL);

// Проверяем, все ли правильно

if (get_property_reply) {
    if (get_property_reply->type == XCB_ATOM_CARDINAL &&
	get_property_reply->value_len == 1 &&
	get_property_reply->format == 32) {

	// Все ок, читаем свойство.
	uint32_t *value = (uint32_t *) xcb_get_property_value(get_property_reply);
    }
    free(get_property_reply);
    return value;
}
 
return;

Исходная версия Zubok, :

В общем, пишу я это вслепую. То есть вот просто, без компиляции, без ничего. Проверок минимум, все быстро накидал, мог где-то ошибиться. Потом проверю. Здесь conn - это переменная типа xcb_connection_t, которую ты из Qt берешь, а wid - это XID окна в иксах, который ты тоже у окна приложения из Qt берешь. Не знаю, где он там, но должен быть где-то в классе окна. Проверку на ошибки надо еще раз глянуть, чтобы все корректно было. Объявления функции нет - сам сделай. Результатом по идее должен быть номер рабочего стола.

// резервируем cookies для приема ответа от сервера

xcb_intern_atom_cookie_t atom_cookie;
xcb_get_property_cookie_t get_property_cookie;
xcb_atom_t atom;

// Интерним атом в X-сервер при помощи InternAtom.

intern_atom_cookie = xcb_intern_atom(conn, 0, strlen("_NET_WM_DESKTOP"), "_NET_WM_DESKTOP");

// Забираем ответ от сервера. Можно забирать гораздо позже, когда
// данные действительно понадобятся.

xcb_intern_atom_reply_t *intern_atom_reply = xcb_intern_atom_reply(conn, intern_atom_cookie, NULL);

// Вот наш XID атома. Им оперируем.

if (!intern_atom_reply)
    return;

atom = intern_atom_reply.atom;
free(intern_atom_reply);

// Теперь спросим про его значение. wid - это XID окна.

get_property_cookie = xcb_get_property(conn, 0, wid, atom, XCB_ATOM_CARDINAL, 0, 1);

xcb_get_property_reply_t *get_property_reply = xcb_get_property_reply(conn, get_property_cookie, NULL);

// Проверяем, все ли правильно

if (get_property_reply) {
    if (get_property_reply->type == XCB_ATOM_CARDINAL &&
	get_property_reply->value_len == 1 &&
	get_property_reply->format == 32) {

	// Все ок, читаем свойство.
	uint32_t *value = (uint32_t *) xcb_get_property_value(get_property_reply);
    }
    free(get_property_reply);
    return value;
}
 
return;