创建不带标题栏的窗口

Create window without title bar

本文关键字:窗口 标题栏 创建      更新时间:2023-10-16

我正试图使用c++在Arch Linux中为Openbox创建一个简单的面板,但我不知道如何从窗口中删除标题栏。

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

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

此外,我还阅读了Tint2(链接)的代码,这是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作为主机。我不确定这是否会改变什么,但提起也无妨。

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

正如@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;

更正确的方法是使用扩展窗口管理器提示。

这个想法是,你不告诉窗户经理如何装饰或不装饰你的窗户,你只需要用_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_PPARTIAL,用于"保留"空间。