LINUX.ORG.RU

Xlib и _NET_WM_STATE [C]


0

1

День добрый, господа. Возникла проблеммка, при программировании под чистый 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, а состояние поверх всех окон - пропадает при любом изменении фокуса. В браузер ткнулся, и все - форма уже не видна. Может быть - у кого нибудь уже есть опыт реализации подобной задачи, и он подскажет, что я таки делаю не так, и главное - как надо?

а кстати, зачем ты постоянно вызываешь XInternAtom?

может нужно просто сделать

XChangeProperty(display, window, a, XA_ATOM, 32, PropModeReplace, (unsigned char *) &prop, 1);

для всех нужных проперть-атомов?

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

Странно. Я на работе пробовал

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);
	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);
    }
на 32-битной убунте - ничего качественно не менялось. Сейчас попробовал дома, на 64-битной - опа, заработало как надо. Мистика.

CynicRus ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.