Держите окно приложения всегда на текущем рабочем столе на Linux и Mac

Я ищу способ разместить окно QWidget приложения Qt всегда на текущем рабочем столе / рабочем пространстве.
Когда я меняю виртуальный рабочий стол, мне нужно, чтобы мое окно автоматически отображалось на новом текущем виртуальном рабочем столе.

Я ищу решение, которое работает как минимум на GNOME, KDE на Linux и Mac OS.

Я думаю, что первый шаг — это определить, когда меняется виртуальный рабочий стол, я не знаю, есть ли у Qt API для этого или мне нужно реализовать его для каждого настольного решения.

Заранее спасибо за помощь.

3

Решение

Под X11 вы должны установить _NET_WM_DESKTOP свойство окна для 0xFFFFFFFF. Я подозреваю, что для этого нет Qt API, поэтому вам придется засорить код #ifdefПроверка X11 и вызов соответствующей функции X (нет, я не знаю, какая это).

4

Другие решения

Спасибо Jan Kundrát за помощь (предыдущий комментарий https://stackoverflow.com/a/16777496/1045832 ).

Решение для Linux X11:

#ifdef Q_WS_X11 //only define on Qt 4.X
#include <QX11Info> //Only on Qt 4.X , return expected in Qt 5.1
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#endif

YourWidget::YourWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::YourWidget)
{

#ifdef Q_WS_X11 //only define on Qt 4.X
unsigned long data = 0xFFFFFFFF;
XChangeProperty (QX11Info::display(),
winId(),
XInternAtom(QX11Info::display(), "_NET_WM_DESKTOP", False),
XA_CARDINAL,
32,
PropModeReplace,
reinterpret_cast<unsigned char *>(&data), // all desktop
1);
#endif
}

Поместите это на свой .pro

unix:!macx {
LIBS += -lX11
}

Решение для macos X:

#include <objc/objc-runtime.h>

WId windowObject = this->winId();
objc_object * nsviewObject = reinterpret_cast<objc_object *>(windowObject);
objc_object * nsWindowObject = objc_msgSend(nsviewObject, sel_registerName("window"));
int NSWindowCollectionBehaviorCanJoinAllSpaces = 1 << 0;
objc_msgSend(nsWindowObject, sel_registerName("setCollectionBehavior:"), NSWindowCollectionBehaviorCanJoinAllSpaces);

Поместите это на свой .pro

macx {
LIBS += -lobjc
}
2

По вопросам рекламы [email protected]