LINUX.ORG.RU

Принудительно показать окно qt-приложения на всех рабочих столах

 ,


0

1

Друзья! Никак не могу нагуглить нужное... Подскажите.

1. Правильно ли я понимаю что множественность рабочих столов (desktop'ов) это свойство иксов, и все оконные менеджеры ее уже оттуда унаследывают?

2. Правильно ли я понимаю, что свойство «Показывать на всех рабочих столах» является родным свойством всех иксовых окон?

Если на оба вопроса ответ да: то тогда вопрос третий: как научить qt-шное приложение принудительно показывать окно на всех рабочих столах?

Если нет, то вообще как быть? Мне надо в обязательном порядке срочно оповещать пользователя внезависимоти от того на какой рабочий стол он смотрит. И пользователь с этим согласен :-))

★★★

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

1. В общем-то да (virtual roots), но оконный менеджер волен реализовывать виртуальные рабочие столы и как одно корневое окно, на котором он показывает только те клиентские окна, которые находятся на текущем виртуальном рабочем столе.

2. Нет, это остаётся на совести оконного менеджера. Он решает, как, где, и когда показывать твои окна. За это отвечает свойство _NET_WM_DESKTOP (CARDINAL/32). Его можно поставить на окно со значением 0xFFFFFFFF и оконный менеджер, если он умеет, будет показывать окно на всех рабочих столах.

Тебе понадобится что-то такое:

#include <QX11Info>

#include <X11/Xlib.h>
#include <X11/Xatom.h>

YourMessageDialog::YourMessageDialog(QWidget *parent)
  : QDialog(parent)
{
    setShowOnAllDesktops(true);
}

void YourMessageDialog::setShowOnAllDesktops(bool show)
{
    Display *display = QX11Info::display();
    Atom _NET_WM_DESKTOP = ::XInternAtom(display, "_NET_WM_DESKTOP", False);

    this->winId(); // костыль, Qt создаёт нативное окно со второй попытки
    Window window = static_cast<Window>(this->winId());

    if (show)
    {
        unsigned long doShow = 0xFFFFFFFF;

        ::XChangeProperty(display, window, _NET_WM_DESKTOP,
                XA_CARDINAL, 32, PropModeReplace,
                reinterpret_cast<unsigned char*>(&doShow), 1);
    }
    else
    {
        ::XDeleteProperty(display, window, _NET_WM_DESKTOP);
    }
}

ilammy ★★★
()

Нет, это фича wm, причём даже не icccm: standards.freedesktop.org/wm-spec/wm-spec-1.5.html#idm140200477421552

Дальше курить www.linux.org.ru/wiki/en/NETWM ( _NET_WM_DESKTOP)

leave ★★★★★
()

Правда, я не понимаю, в чём проблема использовать QMessageBox. Он показывается на текущем активном рабочем столе.

ilammy ★★★
()

Я для явного отображения приложения делаю так:

if(window -> windowHandle() -> isExposed(){
   window -> windowHandle() -> show();
}
window -> windowHandle() -> requestActivate();

Еще есть метод activate()

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