LINUX.ORG.RU

Не работают функции KWindowSystem

 , ,


0

1

Здравствуйте! В Arch Linux обновился Qt до версии 5.15.10. (в Debian 12 проблема также присутствует). После этого моя панель перестала резервировать место на экране (окна залезают под панель) и панель пропадает при переходе на другой рабочий стол. Для этих целей использую библиотеку KWindowSystem. В частности: KX11Extras::setStrut и KX11Extras::setOnDesktop. Держать пакет qt5-base необновленным не получится. Подскажите, пожалуйста, на что можно заменить/как можно пофиксить. Есть идея заменить эти вызовы функций на обычный XChangeProperty и им поменять параметр _NET_WM_STRUT, но так и не понял, какие аргументы этой функции, за что отвечают.



Последнее исправление: thm (всего исправлений: 1)

Ответ на: комментарий от hateyoufeel
...
#include <KWindowSystem>
...
KWindowSystem::setStrut(mPanelWId,
                        leftStrut,
                        rightStrut,
                        topStrut,
                        bottomStrut);
...

this->connect(KWindowSystem::self(), &KWindowSystem::currentDesktopChanged, this, [this]() {
    KWindowSystem::setOnDesktop(mPanelWId, KWindowSystem::currentDesktop());
});

KWindowSystem::setStrut и KX11Extras::setStrut аналогичны. Первый вариант считается deprecated, но проверял оба - не работают. Оставлял его ради поддержки в Debian 11, где KX11Extras еще в принципе не было в пакете libkf5windowsystem.

Интересно другое. В чистом проекте оба этих вызова работают нормально.

thm
() автор топика
Ответ на: комментарий от thm
...
#include <KWindowSystem>
...
KWindowSystem::setStrut(mPanelWId,
                       leftStrut,
                       rightStrut,
                       topStrut,
                       bottomStrut);
...

this->connect(KWindowSystem::self(), &KWindowSystem::currentDesktopChanged, this, [this]() {
   KWindowSystem::setOnDesktop(mPanelWId, KWindowSystem::currentDesktop());
});

KWindowSystem::setStrut и KX11Extras::setStrut аналогичны. Первый вариант считается deprecated, но проверял оба - не работают. Оставлял его ради поддержки в Debian 11, где KX11Extras еще в принципе не было в пакете libkf5windowsystem.

Интересно другое. В чистом проекте оба этих вызова работают нормально.

Я сейчас проверил код Latte Dock, там setStrut используется только для удаления панельки. Код вот здесь:

https://invent.kde.org/plasma/latte-dock/-/blob/master/app/wm/xwindowinterface.cpp

Для установки там вот это:

    KWindowSystem::setExtendedStrut(view.winId(),
                                    strut.left_width,   strut.left_start,   strut.left_end,
                                    strut.right_width,  strut.right_start,  strut.right_end,
                                    strut.top_width,    strut.top_start,    strut.top_end,
                                    strut.bottom_width, strut.bottom_start, strut.bottom_end
                                    );

Плюс, посмотри функцию XWindowInterface::setViewExtraFlags в том же файле, там устанавливаются флаги типа того что ты хочешь. Есть подозрение, что тебе надо добавить KWindowSystem::setType(winId, NET::Dock); и KWindowSystem::setOnAllDesktops(winId, true); в свой код.

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

setOnAllDesktops проверю, а окно у меня и так уже NET_WM_DOCK. По-другому просто его задал. Но это, на самом деле, не имеет значения, т.к. setStrut и setOnDesktop с пустым QWidget работают. Значит, что-то мешать стало в самой панели.

UPD: setOnAllDesktops также не работает. Вообще ни одна функция из KWindowSystem не работает. Буду переносить поочередно в новый проект код и смотреть, когда перестанет работать.

thm
() автор топика
Последнее исправление: thm (всего исправлений: 1)

UPD: проблему нашел. Я помимо аттрибута NET_WM_DOCK задавал флаги FramelessWindowHint и WindowStaysOnTopHint. Убрал флаг WindowStaysOnTopHint - и всё заработало.

thm
() автор топика