【发布时间】:2011-05-19 17:10:50
【问题描述】:
一个窗口应该位于所有其他窗口的顶部。这对于普通的 x11/xlib 有可能吗?谷歌搜索“Always on top”和“x11”/“xlib”没有返回任何有用的信息。
如果可能的话,我会避免使用 GTK+ 之类的工具包。
我正在使用带有 gnome 桌面的 Ubuntu。在窗口菜单中,有一个选项“始终在顶部”。这是由 X 服务器还是窗口管理器提供的?如果是第二种情况,是否有一个可以为几乎任何 wm 调用的通用函数?或者如何以“X11-generic”的方式做到这一点?
编辑:我实现了 fizzer 的答案,现在有以下代码:
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;
// ...
}
}
但是即使我的面具是正确的,事件处理和引发也几乎永远不会被执行?!
【问题讨论】:
-
几乎所有的低级窗口工具包都是用这两种语言中的一种或两种定义的,所以如果可以做到,那么可以用 C/C++ 完成。这不是一个真正的语言问题。
-
改变了问题。确定这不是关于是否可以使用 c/c++,而是是否可以仅使用 x11/xlib 的最小绑定
-
你有其他事件类型吗?
-
另外,您的窗口是否位于顶层 - 即根窗口的子窗口?你只能提高一个相对于兄弟姐妹的窗口。
-
是的,我确实得到了其他事件,并且胜利是根胜利的孩子。是因为我做了以下吗? XserverRegion region = XFixesCreateRegion( this->display, 0, 0 ); XFixesSetWindowShapeRegion(this->display, this->window, ShapeInput, 0, 0, region );
标签: user-interface x11 window-managers