我是x11电话的新手。
我正在使用SLED11上的QT 4.8开发自定义应用程序工具栏。
我在使用x11调用(_NET_WM_STRUT和_NET_WM_STRUT_PARTIAL)获取的保留空间上放置工具栏时遇到问题
在某些论坛上,我了解到我必须保留工具栏区域,以便其他应用程序窗口无法覆盖它。我使用了_NET_WM_STRUT和_NET_WM_STRUT_PARTIAL。
这是我用来预留空间的代码:
void ToolbarWindow::dock(int width, int height)
{
Display *display = QX11Info::display();
int insets[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
insets[2] = height;
insets[8] = 0;
insets[9] = width;
XChangeProperty(display,
winId(),
XInternAtom(QX11Info::display(), "_NET_WM_STRUT", False),
XA_CARDINAL ,
32,
PropModeReplace,
(unsigned char *)&insets, 4);
XChangeProperty(display,
winId(),
XInternAtom(QX11Info::display(), "_NET_WM_STRUT_PARTIAL", False),
XA_CARDINAL ,
32,
PropModeReplace,
(unsigned char *)&insets, 12);
}
这是我在创建工具栏时对GUI控制器的调用:
ToolbarWindow *toolbar = new ToolbarWindow(co);
toolbar->setGeometry(monitor->getX(), monitor->getY(), monitor->getWidth(), 170);
toolbar->show();
toolbar->dock(monitor->getWidth(), 170);
我看到的是空间是保留的,但我的工具栏在保留区域下方显示 。 但这不是我想要的,我想让所有其他窗户保持在下面(即使最大化)但不是我的工具栏......我为它保留了空间,我希望它填补那个空间... < / p>
任何人都可以帮助我吗?
感谢。
答案 0 :(得分:0)
n.m。&#39;答案是对的。
我发现为了让它可靠地工作,窗口应该是 键入_NET_WM_TYPE_DOCK,您必须首先映射它,然后将其移动到 位置,否则WM有时可能将其置于其自身之外 支撑。 - n.m。
这是我添加的代码:
Atom tmp = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DOCK", False);
XChangeProperty(display,
winId(),
XInternAtom(display, "_NET_WM_WINDOW_TYPE", False),
XA_ATOM ,
32,
PropModeReplace,
(unsigned char *)&tmp, 1);
非常感谢。