[英]Keep a application window always on current desktop on linux and mac
我搜索了一种将 Qt 应用程序的 QWidget window 始终放在当前桌面/工作区的方法。 当我更改虚拟桌面时,我需要我的 window 在新的当前虚拟桌面上自动可见。
我搜索了一个至少适用于 gnome、kde 在 linux 和 mac os 上的解决方案。
我认为第一步是检测虚拟桌面何时发生变化,我不知道 Qt 是否有 API 或者我是否需要为每个桌面解决方案实现它。
提前感谢所有帮助。
在X11下,您应该将_NET_WM_DESKTOP
窗口属性设置为0xFFFFFFFF
。 我怀疑没有Qt API,所以你必须用#ifdef
检查X11并调用适当的X函数(nope,我不知道它是哪一个)来丢弃代码。
感谢JanKundrá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
}
这是 MacOS 12 和 M1 芯片的工作示例
WId windowObject = this->winId();
objc_object * nsviewObject = reinterpret_cast<objc_object *>(windowObject);
objc_object * nsWindowObject = ((objc_object* (*)(id, SEL))objc_msgSend)(nsviewObject, sel_registerName("window"));
int NSWindowCollectionBehaviorMoveToActiveSpace = 1 << 1;
int NSWindowCollectionBehaviorTransient = 1 << 3;
int NSWindowCollectionBehaviorFullScreenAuxiliary = 1 << 8;
int total = NSWindowCollectionBehaviorMoveToActiveSpace
|NSWindowCollectionBehaviorTransient
| NSWindowCollectionBehaviorFullScreenAuxiliary;
((objc_object* (*)(id, SEL, int))objc_msgSend)(nsWindowObject, sel_registerName("setCollectionBehavior:"), total);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.