创建没有标题栏的窗口

时间:2015-06-23 12:34:02

标签: c++ linux x11

我正在尝试使用c ++在Arch Linux中为Openbox创建一个简单的面板,但我无法弄清楚如何从窗口中删除标题栏。

我正在使用XCreateWindow(...)创建窗口,这会给出一个大小正确的窗口,但它包含一个标题栏,并且窗口也会在屏幕的左上角打开,无论是什么我指定的偏移坐标。

我读到here这两个问题都可能是由窗口管理器(Openbox)引起的,它会覆盖我在XCreateWindow(..., &window_attributes)中指定的窗口属性。这可以通过添加window_attributes.override_redirect = True;来解决,虽然这似乎对我没有任何作用。当我尝试这个时,我会得到与以前完全相同的窗口。 (我在这次更改后编译了文件。)

此外,我还阅读了Tint2(link)的代码,这是Openbox的另一个面板。他们使用以下代码创建一个窗口:

XSetWindowAttributes att = { .colormap=server.colormap, .background_pixel=0, .border_pixel=0 };
p->main_win = XCreateWindow(server.dsp, server.root_win, p->posx, p->posy, p->area.width, p->area.height, 0, server.depth, InputOutput, server.visual, mask, &att);

我在代码中的任何地方都看不到override_redirect,所以我不确定他们是如何移除标题栏的。

作为补充信息,我认为值得一提的是我如何执行该脚本:

/* The c++ file is saved as 'panel.cpp' */
$ gcc panel.cpp -lX11 -o panel
$ ./panel

此外,我通过VirtualBox运行Arch Linux,Windows 8作为主机。我不确定这是否会改变任何内容,但提及它不会有什么坏处。

2 个答案:

答案 0 :(得分:0)

由于我找到了解决方案,我想我会在这里发布解决方案,如果有其他人需要的话。

正如@JoachimPileborg所提到的,我需要改变~/.config/openbox/rc.xml中的Openbox设置。在<applications>标记内,我添加了以下代码:

<application class="*">
  <decor>no</decor>
  <position force="no"></position>
</application>

class="*"表示所有应用程序都将遵循这些规则,您可以填写应用程序的类名称。 <decor>no</decor>删除标题栏,<position force="no"></position>确保我自己的脚本能够处理定位。您还可以在此标记之后添加另一个<application>标记,以对此规则进行例外处理。

此外,不再需要window_attributes.override_redirect = True;

答案 1 :(得分:0)

更正确的方法是使用Extended Window Manager Hints

这个想法是你不告诉窗口管理器如何装饰你的窗口,只需用_NET_WM_WINDOW_TYPE指示窗口类型:

Atom window_type = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False);
long value = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DOCK", False);
XChangeProperty(display, your_window, window_type,
   XA_ATOM, 32, PropModeReplace, (unsigned char *) &value,1 );

“Dock”是面板和任务栏的类型。通常它们未修饰并出现在所有桌面上。如文档中所述,之前使用_MOTIF_WM_HINTS属性来定义窗口的外观和装饰。窗口管理器仍然支持它,但_NET_WM_WINDOW_TYPE首选描述函数,并让窗口管理器(和用户)决定该类型窗口的外观和行为。

面板的另一个有趣属性是_NET_WM_STRUT_PARTIAL,以“预留”空间。