Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Xlib и _NET_WM_STATE [C]  (Прочитано 716 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CynicRus

  • Автор темы
  • Любитель
  • *
  • Сообщений: 78
    • Просмотр профиля
Xlib и _NET_WM_STATE [C]
« : 22 Февраля 2012, 10:40:39 »
День добрый, господа. Возникла проблемка, при программировании под чистый xlib. Значится по мере выполнения задачи возникла потребность - спрятать приложение из pager и так называемой панели задач, а так же постоянно держать форму поверх остальных окон. Долгое гугление и вдумчивое курение документации - навели меня на написание следующих строк:
//убираемся из панели задач и pager
    Atom a = XInternAtom(display, "_NET_WM_STATE", True);
    if (a != None) {
Atom prop = XInternAtom(display, "_NET_WM_STATE_SKIP_TASKBAR", True);
XChangeProperty(display, window, a, XA_ATOM, 32, PropModeAppend, (unsigned char *) &prop, 1);
    }
    a = XInternAtom(display, "_NET_WM_STATE", True);
    if (a != None) {
Atom prop = XInternAtom(display, "_NET_WM_STATE_SKIP_PAGER", True);
XChangeProperty(display, window, a, XA_ATOM, 32, PropModeAppend, (unsigned char *) &prop, 1);
    }
    //типа stay on top.
    a = XInternAtom(display, "_NET_WM_STATE", True);
    if (a != None) {
    Atom prop = XInternAtom(display, "_NET_WM_STATE_ABOVE", True);
    XChangeProperty(display, window, a, XA_ATOM, 32, PropModeAppend, (unsigned char *) &prop, 1);
    }
Все бы хорошо, однако - по непонятной причине - второй блок if - отрабатывает вообще рандомно, а третий - такое ощущение, что не отрабатывает вовсе. Тоесть - форма по только ей понятной причине: пропадает из панели задач, абсолютно случайно при н-м запуске пропадает из pager, а состояние поверх всех окон - пропадает при любом изменении фокуса. В браузер ткнулся, и все - форма уже не видна. Может быть - у кого нибудь уже есть опыт реализации подобной задачи, и он подскажет, что я таки делаю не так, и главное - как надо?

Пользователь решил продолжить мысль 22 Февраля 2012, 21:19:03:
Решил сам.Упростил конструкцию, до:
if (a != None) {
Atom prop = XInternAtom(display, "_NET_WM_STATE_SKIP_TASKBAR", True);
XChangeProperty(display, window, a, XA_ATOM, 32, PropModeAppend, (unsigned char *) &prop, 1);
Atom prop1 = XInternAtom(display, "_NET_WM_STATE_SKIP_PAGER", True);
XChangeProperty(display, window, a, XA_ATOM, 32, PropModeAppend, (unsigned char *) &prop1, 1);
    Atom prop2 = XInternAtom(display, "_NET_WM_STATE_ABOVE", True);
    XChangeProperty(display, window, a, XA_ATOM, 32, PropModeAppend, (unsigned char *) &prop2, 1);
    }
И начал вызывать До того, как окно стало видимым. Отсюда вывод - надо лучше читать документацию-(
« Последнее редактирование: 22 Февраля 2012, 21:19:03 от CynicRus »
"Only two things are infinite, the universe and human stupidity... and I'm not sure about the universe."  -- Albert Einstein

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.