如何为我的窗户腾出顶部空间?

How I can get space on top for my window?

本文关键字:顶部 空间 窗户 我的      更新时间:2023-10-16

我有sfml窗口。我需要在屏幕的顶部(或底部(为我的窗口保留空间。像这个做多宝贝,柠檬棒等。我该怎么做?

在此步骤中,我只有一个简单的sfml窗口:

#include <SFML/Graphics.hpp>
using namespace sf;
int main()
{
unsigned int bar_x = 1920, bar_y = 20;
RenderWindow window(VideoMode(bar_x, bar_y), "bar", Style::None);
Vector2u bar_size(bar_x, bar_y);
Vector2i bar_position(0,0);
while (window.isOpen())
{
Event event;
while (window.pollEvent(event))
{
// Here should be blocking position function...
if (event.type == Event::Closed)
window.close();
if (event.type == Event::Resized)
window.setSize(bar_size);
if (event.type == Event::Resized)
window.setPosition(Vector2i(0,0));
}
window.clear();
// window.draw(shape);
window.display();
}
return 0;
}

我认为没有办法强制 WM 保留空间,但许多 WM 支持并尊重_NET_WM_STRUT_PARTIALEWMH 属性以在屏幕边缘保留空间。这也是柠檬吧和多宝丽吧所做的。

来自 EWMH 规范:

_NET_WM_STRUT_PARTIAL

_NET_WM_STRUT_PARTIAL, left, right, top, bottom, left_start_y, left_end_y, right_start_y, right_end_y, top_start_x, top_end_x, bottom_start_x, bottom_end_x,CARDINAL[12]/32

如果窗口要在屏幕边缘保留空间,则必须由客户端设置此属性。该属性包含 4 个基数,指定屏幕每个边框处保留区域的宽度,另外 8 个基数指定对应于四个支柱中每个支柱的开始和结束。值的顺序为左、右、上、下、left_start_y、left_end_y、right_start_y、right_end_y、top_start_x、top_end_x、bottom_start_x bottom_end_x。所有坐标都是根窗口坐标。客户端可以随时更改此属性,因此,如果窗口管理器使用此属性为窗口分配特殊语义,则窗口管理器必须监视属性通知事件。

[...]

例如,对于出现在屏幕底部的面板样式客户端,高 50 像素,并占用屏幕边缘左侧 200-600 像素的空间,会将底部支柱设置为 50,并将bottom_start_x设置为 200,将bottom_end_x设置为 600。[...]


更新:在对SFML文档进行了一些挖掘之后,我不确定如何通过SFML设置EMWH属性,或者是否可以。您需要自己弄清楚这一点。如果不可能,一种途径是以某种方式从 SFML 获取窗口句柄 (xcb_window_t(,并使用类似 libxcb 的xcb_change_property来设置_NET_WM_STRUT_PARTIAL属性。请参阅柠檬吧来源以供参考。


更新 2:我对 Xlib 不是很熟悉,但我经常查看 stalonetray 源代码以供参考。例如,src/wmh.c文件中的ewmh_set_window_strut函数显示了如何设置_NET_WM_STRUT_PARTIAL属性:

/* Set data for _NET_WM_STRUT{,_PARTIAL} hints */
int ewmh_set_window_strut(Display *dpy, Window wnd, wm_strut_t wm_strut)
{
Atom prop_strut;
Atom prop_strut_partial;
prop_strut = XInternAtom(dpy, _NET_WM_STRUT, False);
prop_strut_partial = XInternAtom(dpy, _NET_WM_STRUT_PARTIAL, False);
XChangeProperty(dpy, wnd, prop_strut, XA_CARDINAL, 32, PropModeReplace,
(unsigned char *)wm_strut, _NET_WM_STRUT_SZ);
XChangeProperty(dpy, wnd, prop_strut_partial, XA_CARDINAL, 32, PropModeReplace,
(unsigned char *)wm_strut, _NET_WM_STRUT_PARTIAL_SZ);
return x11_ok();
}