LINUX.ORG.RU

Кастомная панель задач

 , ,


0

1

Разрабатываю приложение на Qt, которое чем-то похоже на стандартную панель задач, под Astra 1.5.
Для своей панели зарезервировал сверху экрана место с помощью _NET_WM_STRUT и разместил её там. То есть получилось, что любое окно при разворачивании занимает место между стандартной панелью задач и моей, собственно как и ожидал.
Но, если начать двигать окно на мою панель, окно «проваливается» за нее (залезает на зарезервированную область), т.е. заголовок окна и кнопки управления окном становятся недоступны, потому что оказались за панелью.
Как сделать так, чтобы окно не залезало за то место, которое было зарезервировано с помощью _NET_WM_STRUT?
Можно ли это как-то настроить через fly-wm? средствами Qt/Xlib/libflycore?

А я для наших «киосков» решительно собрал опенбокс и тинт2 :) пока полет нормальный, спецэффектов из ОП не наблюдаю.

И, да, присоединяюсь: тс, результат покажешь или нельзя? ;)

aol ★★★★★
()

Как у меня получилось загнать окно выше стандартной панели сверху?

https://pic4a.ru/812/czm.png

Почему даже для стандартной панели нет защиты от поднимания окон выше неё?

Да потому, что так устроено:

Alt+MouseDown+MouseMove

Как сделать так, чтобы окно не залезало за то место, которое было зарезервировано

Чтобы пересчёт доступного места для окон не игнорировал ТВОЮ панель:

а) написать костыли для всех окон во всех приложениях;
б) написать костыли для всех WM/DE;
в) написать костыль для иксов.

deep-purple ★★★★★
()

Вообще, иксы — это только механизм для определения или удаления свойств окон, а свойство _NET_WM_STRUT — это договоренности, определенные в EWMH. Остальное всё определяется оконным менеджером. Если он не умеет не двигать окна за зарезервированную область, то...

The purpose of struts is to reserve space at the borders of the desktop. This is very useful for a docking area, a taskbar or a panel, for instance. The Window Manager should take this reserved area into account when constraining window positions - maximized windows, for example, should not cover that area.

А как надо-то вообще?

Zubok ★★★★★
()
Ответ на: комментарий от deep-purple

а) написать костыли для всех окон во всех приложениях;

б) написать костыли для всех WM/DE;

в) написать костыль для иксов.

Зависит от того, насколько серьезно это мешает жить, чтобы начать лечить это место.

В теории можно попробовать в своей панели натравить XSelectInput на root window или фейковое root window, которое может создавать этот FlyWM (самописный WM, кстати) и слушать все сообщения при перемещении окон, контролируя координаты. Как только какое-то окно коснулось кастомной панели, то принудительно мешать оконному менеджеру его перемещать дальше. Это очень грубо, но больше я не вижу способов без правки.

Zubok ★★★★★
()

Посмотри, может, там есть какое-нибудь прилипание к краям окон? В принципе, его может и хватить. У меня IceWM, если переместить панель наверх и тащить окно за заголовок в сторону панели, тоже она не препятствует загону окна выше. Однако есть: (1) прилипание, поэтому окно сначала прилипнет к панели, а потом только дальше потащится и (2) возможность вытащить окно за его содержимое, за любой кусочек при помощи Super+мышка. Ну и с помощью клавиатуры, конечно.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от dhampire

Ага, посмотрел, получается это сюда сохраняются настройки от приложухи Панель управления -> Параметры окон. Пробовал в ней менять, но она управляет только внешним видом, а из поведения - это отображение поверх всех окон или отображение на всех рабочих столах.

toolazy4dat
() автор топика
Ответ на: комментарий от aol

Скинул пример выше, только вот этот пример под Астрой не работает. Там уже нужно резервировать пространство через _NET_WM_STRUT_PARTIAL и заменить куски кода примерно так:

const int LEFT = 0;
const int RIGHT = 2;
const int TOP = 4;
const int BOTTOM = 6;
const int SIZE = 12;
int reserve[SIZE] = {0};

...

Atom atomStrut = XInternAtom(display, "_NET_WM_STRUT_PARTIAL", False);
toolazy4dat
() автор топика
Ответ на: комментарий от Zubok

принудительно мешать оконному менеджеру его перемещать дальше

Если в Qt есть возможность не давать курсору заходить в область панели, то можно будет это сделать (дикий костыль конечно..)

А так пока решил отложить эту проблему, сделал, чтобы панель была всегда снизу всех окон, и если окно заедет на панель, его хотя бы можно вытащить.

toolazy4dat
() автор топика
Ответ на: комментарий от toolazy4dat

На Qt, думаю, нельзя. Из Qt вообще никак нельзя управлять оконной средой. Это и не дело Qt. Для этого есть XCB или Xlib, которыми и пользуются в специфичных для оконных менеджеров и для иксов случаях. Для работы с оконной средой есть сейчас специальная библиотека с классом KWindowSystem.

Если в Qt есть возможность не давать курсору заходить в область панели, то можно будет это сделать (дикий костыль конечно..)

Идея сама по себе ужасная, но мышь можно остановить средствами исков. Но не остановить перемещение окна клавиатурой. Вот пример: Как запретить перемещение курсора на другие дисплеи? (комментарий) . Барьер, конечно, можно то создавать, то убирать, но это все через жопу. Да и, повторю, это только для pointer.

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

Спасибо. Значит буду копать Xlib.

Еще есть один вариант. Создать невидимое окно на рабочую область без учета своей панели и сделать XGrabPointer на это прозрачное окно.

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