如何为我的窗户腾出顶部空间?
How I can get space on top for my window?
我有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_PARTIAL
EWMH 属性以在屏幕边缘保留空间。这也是柠檬吧和多宝丽吧所做的。
来自 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();
}
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 程序顶部的声明与定义(最佳实践)
- 如何为我的窗户腾出顶部空间?