繁体   English   中英

将应用程序 window 始终保留在 linux 和 mac 上的当前桌面上

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM