gpt4 book ai didi

ubuntu - 如何让一个窗口永远在最上面?

转载 作者:太空宇宙 更新时间:2023-11-03 16:47:27 24 4
gpt4 key购买 nike

我创建了一个无框架的 Qt/QML 窗口,我真的很想知道设置它的“Always On Top”系统菜单标志的任何编程方法。单击 ALT+SPACE 我可以调出无框窗口的系统菜单,通过单击“Always On Top”选项,窗口确实始终位于顶部,但我还没有找到编程方式做同样的事情。 Qt.WindowStaysOnTopHint不起作用,并尝试 wmctrl -r "window name" -b add,above也不起作用,即使 wmctrl确实适用于其他窗口。 wmctrl不适用于我感兴趣的窗口显然与 N/A 有关对于 wmctrl -l 上的机器名称列:

francisco@Ubuntu:~$ wmctrl -l
0x02600006 0 Ubuntu Área de trabalho
0x03c00002 0 Ubuntu XdndCollectionWindowImp
0x03c00005 0 Ubuntu unity-launcher
0x03c00008 0 Ubuntu unity-panel
0x03c0000b 0 Ubuntu unity-dash
0x03c0000c 0 Ubuntu Hud
0x046000b3 0 Ubuntu How to make a window aways on top? - Stack Overflow - Mozilla Firefox
0x0520000b 0 N/A Qt Creator
0x05002396 0 Ubuntu francisco@Ubuntu: ~
0x0540000b 0 N/A backlight

我也经历过this procedure但是对于用户的询问,它对我也不起作用,同样的行为。 _NET_WM_STATE_ABOVE已设置,但聚焦窗口然后再次检查标志它不再存在,只有在点击系统菜单时它才会粘住。

这是 QML:https://gist.github.com/oblitum/8050586

相关 askubuntu 问题:https://askubuntu.com/questions/394998

编辑

通知

在相关的 askubuntu 问题中,发现 wmctrl 上应该存在一个错误,用于通过名称定位某些窗口。使用 wmctrl -i -r <window id> -b add,above也解决了这个问题。

最佳答案

EWMH 规范明确指出:

_NET_WM_STATE_ABOVE and _NET_WM_STATE_BELOW are mainly meant for user preferences and should not be used by applications e.g. for drawing attention to their dialogs (the Urgency hint should be used in that case, see the section called “Urgency”).

因此窗口管理器没有责任尊重自己直接设置此属性(即通过 XChangeProperty)的应用程序。此属性只能通过向根窗口发送客户端消息来更改哪些窗口管理器在监听。

我不知道如何在像 Qt 这样的高级 gui 工具包中做到这一点,但这里是如何在普通 X11 中做到这一点。(参见 EWMH 规范,或 _wnck_change_state 示例实现)。

//file: test.c
//to build it, run
//shell> gcc test.c -lX11

#include <X11/Xlib.h>

#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */
#define _NET_WM_STATE_ADD 1 /* add/set property */
#define _NET_WM_STATE_TOGGLE 2 /* toggle property */


// change a window's _NET_WM_STATE property so that it can be kept on top.
// @display: x11 display singleton.
// @xid : the window to set on top.
Status x11_window_set_on_top (Display* display, Window xid)
{
XEvent event;
event.xclient.type = ClientMessage;
event.xclient.serial = 0;
event.xclient.send_event = True;
event.xclient.display = display;
event.xclient.window = xid;
event.xclient.message_type = XInternAtom (display, "_NET_WM_STATE", False);
event.xclient.format = 32;

event.xclient.data.l[0] = _NET_WM_STATE_ADD;
event.xclient.data.l[1] = XInternAtom (display, "_NET_WM_STATE_ABOVE", False);
event.xclient.data.l[2] = 0; //unused.
event.xclient.data.l[3] = 0;
event.xclient.data.l[4] = 0;

return XSendEvent (display, DefaultRootWindow(display), False,
SubstructureRedirectMask|SubstructureNotifyMask, &event);
}

// a sample main function for testing.
// shell> ./a.out window_xid
int main (int argc, char** argv)
{
Window xid = strtol (argv[1], NULL, 0);
Display* display = XOpenDisplay (NULL);

x11_window_set_on_top (display, xid);

XFlush (display); //for simplicity, no event loops here.

XCloseDisplay (display);
}

另请注意,在某些 x11 环境(例如 compiz)中,系统菜单由单独的装饰器程序而不是合成窗口管理器提供。

关于ubuntu - 如何让一个窗口永远在最上面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20733215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com