使用_NET_WM_STRUT和_NET_WM_STRUT_PARTIAL获取保留桌面空间上的工具栏

时间:2015-01-13 16:58:44

标签: qt x11 xlib xserver

我是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>

任何人都可以帮助我吗?

感谢。

1 个答案:

答案 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);

非常感谢。