X11/Xlib:窗口始终位于顶部
一个窗口应该位于所有其他窗口之上。这对于普通的 x11/xlib 来说是可能的吗?谷歌搜索“Always on top”和“x11”/“xlib”没有返回任何有用的东西。
如果可能的话,我会避免使用像 GTK+ 这样的工具包。
我正在使用带有 gnome 桌面的 Ubuntu。在窗口菜单中,有一个选项“始终在最前面”。这是由 X 服务器还是窗口管理器提供的?如果是第二种情况,是否有一个通用函数可以为几乎任何 wm 调用?或者如何以“X11-generic”方式做到这一点?
Edit: I implemented fizzer's answer, now having following code:
XSelectInput(this->display, this->window,
ButtonPressMask |
StructureNotifyMask |
ExposureMask |
KeyPressMask |
PropertyChangeMask |
VisibilityChangeMask );
// ...
// In a loop:
if (XPending(this->display) >= 0)
{
XNextEvent(this->display, &ev);
switch(ev.type) {
// ...
case VisibilityNotify:
XRaiseWindow(this->display, this->window);
XFlush(this->display);
break;
// ...
}
}
但即使我的面具是正确的,事件处理和引发几乎永远不会被执行?!
A window should stay on top of all other windows. Is this somehow possible with plain x11/xlib? Googling for "Always on top" and "x11" / "xlib" didn't return anything useful.
I'd avoid toolkits like GTK+, if somehow possible.
I'm using Ubuntu with gnome desktop. In the window menu, there's an option "Always On Top". Is this provided by the X server or the window manager? If the second is the case, is there a general function that can be called for nearly any wm? Or how to do this in an "X11-generic" way?
Edit: I implemented fizzer's answer, now having following code:
XSelectInput(this->display, this->window,
ButtonPressMask |
StructureNotifyMask |
ExposureMask |
KeyPressMask |
PropertyChangeMask |
VisibilityChangeMask );
// ...
// In a loop:
if (XPending(this->display) >= 0)
{
XNextEvent(this->display, &ev);
switch(ev.type) {
// ...
case VisibilityNotify:
XRaiseWindow(this->display, this->window);
XFlush(this->display);
break;
// ...
}
}
But the eventhandling and raising nearly never gets executed even my mask is correct?!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您不想使用 XRaiseWindow() 来尝试保持领先。一些窗口管理器会完全忽略它。对于那些不这样做的人,请考虑如果多个应用程序尝试执行此操作会发生什么。繁荣!这就是为什么窗口管理器负责堆叠窗口,而不是应用程序。
执行此操作的方法是使用扩展窗口管理器提示 (EWMH) 中定义的协议,请参阅:http:// /www.freedesktop.org/wiki/Specifications/wm-spec
具体来说,您需要 _NET_WM_STATE_ABOVE,这就是“始终位于顶部”菜单项的工作原理。
如果您不使用工具包,您将需要习惯于在工具包源代码中进行清理以弄清楚如何做事情。在这种情况下,您可以查看 GTK+ 的 X11 后端中的函数 gdk_window_set_keep_above()。这将展示如何使用 _NET_WM_STATE_ABOVE 提示。
You don't want to use XRaiseWindow() to try to stay on top. Some window managers will ignore it entirely. For those that don't, consider what happens if more than one app tries to do this. Boom! That's why the window manager is in charge of stacking windows, not the app.
The way you do this is to use the protocols defined in the Extended Window Manager Hints (EWMH), see: http://www.freedesktop.org/wiki/Specifications/wm-spec
Specifically here you want _NET_WM_STATE_ABOVE which is how the "Always on Top" menu item works.
If you aren't using a toolkit you'll want to get used to scavenging in toolkit source code to figure out how to do things. In this case you could look at the function gdk_window_set_keep_above() in GTK+'s X11 backend. That will show how to use the _NET_WM_STATE_ABOVE hint.
很多年前我在 Xlib 中写过类似的东西。就几行代码。当您的窗口部分被遮挡时,您会收到 VisibilityNotify 事件,然后调用 XRaiseWindow。请注意两个“始终位于顶部”窗口重叠的情况。
I wrote something like this in Xlib many years ago. It's a few lines of code. When your window is partially obscured you get a VisibilityNotify event, then call XRaiseWindow. Watch out for the case where two of your 'always on top' windows overlap.
例如,使用实际标题按钮 (http://www.actualtools.com/titlebuttons/)。它允许将任何窗口始终保持在顶部、卷起、透明等。
Use Actual Title Buttons (http://www.actualtools.com/titlebuttons/) for example. It allows to stay any windows always on top , roll up, make transparency and etc..