Wayland入门教程08.14:窗口背景

系列索引地址:Wayland入门教程索引

上一篇:Wayland入门教程08.13:窗口操作

之前介绍过个性化鼠标图标,本文介绍个性化窗口背景。

从之前的文章可以了解到,窗口颜色的设置就是将像素值直接赋值给某个点。

那么在使用背景图之前我们需要把图片解码为rgb原始数据。

图片解码

用来测试的图片为

src

使用ffmpeg解码为rgb格式数据

1
ffmpeg -i 1.png -pix_fmt argb 1.rgb

开发

首先将上一篇窗口的代码拿过来,因为直接从图片获取像素值,所以部分函数就不需要了,根据需要自行删除。

1
2
3
4
5
6
7
8
9
10
static void
paint_pixels() {
int n;
uint32_t *pixel = shm_data;

fprintf(stderr, "Painting pixels\n");
for (n =0; n < WIDTH*HEIGHT; n++) {
*pixel++ = 0xff0000;//红色
}
}

直接从图片获取像素值,这个函数就不需要了。

1
2
3
set_cloexec_or_close()
create_tmpfile_cloexec()
os_create_anonymous_file()

上面这三个函数用于创建临时文件,不需要了。

修改全局变量

1
2
int WIDTH = 825;
int HEIGHT = 645;

使用的图片多大,这两个值就修改为多大。

主要是修改创建缓冲区函数create_buffer()

打开文件

1
2
3
4
5
6
7
fd = open("./3.rgb",O_RDWR);
if (fd < 0)
{
fprintf(stderr, "creating a buffer file for %d B failed: %m\n",
size);
exit(1);
}

映射至内存

1
2
3
4
5
6
7
shm_data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (shm_data == MAP_FAILED)
{
fprintf(stderr, "mmap failed: %m\n");
close(fd);
exit(1);
}

其他保持不变。

效果为

result

当然,窗口的大小就是图片的大小,如果要实现背景缩放或者只显示部分背景在之后在说明。

可以看到,颜色有点问题,主要是wl_shm_pool_create_buffer中的WL_SHM_FORMAT_XRGB8888参数影响。经过测试把导出的图片格式从argb改为bgra就正常了。

可以看到和鼠标图片图标的方法一样。

EGL版本只是替换了窗口显示部分,其他的代码一样。

完整代码在Wayland_Freshman中的08.14.custom_surface下。

下一篇:Wayland入门教程08.15:键盘输入


Wayland入门教程08.14:窗口背景
https://feater.top/wayland/wayland-custom-surface-background/
作者
JackeyLea
发布于
2021年11月6日
许可协议