commit 975ad56
shrub
·
2026-05-23 14:58:19 +0000 UTC
parent c671c49
breaking change! deprecate swc_wallpaper in favor of layer shell
10 files changed,
+12,
-231
+1,
-2
1@@ -17,10 +17,9 @@ neu features
2 - experimental subsurface support
3 - fullscreen
4 - double window borders
5-- wallpapers
6 - screenshots
7 - evdev-only input backend
8-- partial layer shell support
9+- layer shell support
10 - window decorations
11
12 neuswc is in active development, we plan to add many more features, and increase compatibility with new wayland protocols.
+6,
-25
1@@ -45,7 +45,6 @@
2 #include "swc.h"
3 #include "util.h"
4 #include "view.h"
5-#include "wallpaper.h"
6 #include "window.h"
7
8 #include <assert.h>
9@@ -57,6 +56,8 @@
10 #include <wld/wld.h>
11 #include <xkbcommon/xkbcommon-keysyms.h>
12
13+#define DEFAULT_BG 0xff000000u
14+
15 static inline int32_t
16 clamp_i32(int64_t v)
17 {
18@@ -402,18 +403,10 @@ renderer_repaint(struct target *target, pixman_region32_t *damage,
19 wld_set_target_surface(swc.drm->renderer, target->surface);
20
21 if (pixman_region32_not_empty(base_damage)) {
22- struct wld_buffer *background = swc_wallpaper_buffer_for_screen(screen);
23-
24 pixman_region32_translate(base_damage, -target->view->geometry.x,
25 -target->view->geometry.y);
26-
27- if (background) {
28- wld_copy_region(swc.drm->renderer, background, 0, 0, base_damage);
29- }
30-
31- else {
32- wld_fill_region(swc.drm->renderer, bgcolor, base_damage);
33- }
34+ wld_fill_region(swc.drm->renderer, DEFAULT_BG,
35+ base_damage);
36 }
37
38 wl_list_for_each_reverse(view, views, link)
39@@ -749,7 +742,6 @@ render_zoomed_to_shm(struct screen *screen, float zoom)
40 int32_t cx = screen_x + width / 2;
41 int32_t cy = screen_y + height / 2;
42 struct compositor_view *view;
43- struct wld_buffer *background;
44 struct wld_buffer *buffer = zoom_buffer_for_screen(screen);
45 if (!buffer) {
46 return NULL;
47@@ -762,12 +754,7 @@ render_zoomed_to_shm(struct screen *screen, float zoom)
48
49 pixman_region32_t full;
50 pixman_region32_init_rect(&full, 0, 0, width, height);
51- background = swc_wallpaper_buffer_for_screen(screen);
52- if (background) {
53- wld_copy_region(swc.shm->renderer, background, 0, 0, &full);
54- } else {
55- wld_fill_region(swc.shm->renderer, bgcolor, &full);
56- }
57+ wld_fill_region(swc.shm->renderer, DEFAULT_BG, &full);
58 pixman_region32_fini(&full);
59 wld_flush(swc.shm->renderer);
60
61@@ -1923,7 +1910,6 @@ compositor_render_to_shm(struct screen *screen)
62 pixman_region32_t region;
63 pixman_region32_t damage;
64 uint32_t caps;
65- struct wld_buffer *background;
66
67 /* create shm buf */
68 buffer = wld_create_buffer(swc.shm->context, width, height,
69@@ -1945,12 +1931,7 @@ compositor_render_to_shm(struct screen *screen)
70 screen->base.geometry.y, width, height);
71
72 /* background */
73- background = swc_wallpaper_buffer_for_screen(screen);
74- if (background) {
75- wld_copy_region(swc.shm->renderer, background, 0, 0, ®ion);
76- } else {
77- wld_fill_region(swc.shm->renderer, bgcolor, ®ion);
78- }
79+ wld_fill_region(swc.shm->renderer, DEFAULT_BG, ®ion);
80
81 wl_list_for_each_reverse(view, &compositor.views, link)
82 {
+0,
-1
1@@ -53,7 +53,6 @@ struct swc {
2 struct wl_global *snap_manager;
3 struct wl_global *select_manager;
4 struct wl_global *subcompositor;
5- struct wl_global *wallpaper_manager;
6 struct wl_global *xdg_decoration_manager;
7 struct wl_global *xdg_output_manager;
8 struct wl_global *xdg_shell;
+0,
-1
1@@ -34,7 +34,6 @@ libswc_src = files(
2 'swc.c',
3 'util.c',
4 'view.c',
5- 'wallpaper.c',
6 'wayland_buffer.c',
7 'window.c',
8 'xdg_decoration.c',
+5,
-15
1@@ -42,7 +42,6 @@
2 #include "snap.h"
3 #include "subcompositor.h"
4 #include "util.h"
5-#include "wallpaper.h"
6 #include "window.h"
7 #include "xdg_decoration.h"
8 #include "xdg_output.h"
9@@ -247,42 +246,34 @@ swc_initialize(struct wl_display *display, struct wl_event_loop *event_loop,
10 goto error15;
11 }
12
13- swc.wallpaper_manager = swc_wallpaper_manager_create(display);
14- if (!swc.wallpaper_manager) {
15- ERROR("Could not initialize wallpaper manager\n");
16- goto error16;
17- }
18-
19 #ifdef ENABLE_XWAYLAND
20 if (!xserver_initialize()) {
21 ERROR("Could not initialize xwayland\n");
22- goto error17;
23+ goto error16;
24 }
25 #endif
26
27 swc.select_manager = select_manager_create(display);
28 if (!swc.select_manager) {
29 ERROR("Could not initialize select manager\n");
30- goto error18;
31+ goto error17;
32 }
33
34 swc.xdg_output_manager = xdg_output_manager_create(display);
35 if (!swc.xdg_output_manager) {
36 ERROR("Could not initialize XDG output manager\n");
37- goto error18;
38+ goto error17;
39 }
40
41 setup_compositor();
42
43 return true;
44
45-error18:
46+error17:
47 wl_global_destroy(swc.select_manager);
48 #ifdef ENABLE_XWAYLAND
49-error17:
50- wl_global_destroy(swc.wallpaper_manager);
51-#endif
52 error16:
53+#endif
54 wl_global_destroy(swc.snap_manager);
55 error15:
56 wl_global_destroy(swc.panel_manager);
57@@ -325,7 +316,6 @@ swc_finalize(void)
58 xserver_finalize();
59 #endif
60 wl_global_destroy(swc.xdg_output_manager);
61- wl_global_destroy(swc.wallpaper_manager);
62 wl_global_destroy(swc.snap_manager);
63 wl_global_destroy(swc.select_manager);
64 wl_global_destroy(swc.panel_manager);
+0,
-29
1@@ -600,35 +600,6 @@ swc_add_axis_binding(uint32_t modifiers, uint32_t axis,
2
3 /* }}} */
4
5-/* Wallpaper {{{ */
6-
7-/**
8- * Set fallback wallpaper buffer for all screens that dom't have an override.
9- */
10-void
11-swc_wallpaper_set_buffer(struct wld_buffer *buffer);
12-
13-/**
14- * Set wallpaper buffer for specified screen id.
15- *
16- * Passing NULL clears the override for that screen.
17- */
18-void
19-swc_wallpaper_set_buffer_for_screen(uint8_t screen_id,
20- struct wld_buffer *buffer);
21-
22-/**
23- * Set wallpaper to a single color
24- * used when no wallpaper buffer is set
25- * defaults to black
26- */
27-
28-extern uint32_t bgcolor;
29-void
30-swc_wallpaper_color_set(uint32_t color);
31-
32-/* }}} */
33-
34 /**
35 * This is a user-provided structure that swc will use to notify the display
36 * server of new windows, screens and input devices.
+0,
-124
1@@ -1,124 +0,0 @@
2-#include <wld/wld.h>
3-
4-#include "compositor.h"
5-#include "screen.h"
6-#include "swc.h"
7-#include "swc_wallpaper-server-protocol.h"
8-#include "util.h"
9-#include "wallpaper.h"
10-#include "wayland_buffer.h"
11-
12-#define MAX_WALLPAPER_SCREENS 32
13-
14-static struct wld_buffer *wallbuf = NULL;
15-static struct wld_buffer *screen_wallbuf[MAX_WALLPAPER_SCREENS];
16-uint32_t bgcolor = 0xff000000;
17-
18-static void
19-set_buffer_slot(struct wld_buffer **slot, struct wld_buffer *buffer)
20-{
21- if (buffer) {
22- wld_buffer_reference(buffer);
23- }
24- if (*slot) {
25- wld_buffer_unreference(*slot);
26- }
27-
28- *slot = buffer;
29-}
30-
31-struct wld_buffer *
32-swc_wallpaper_buffer_for_screen(struct screen *screen)
33-{
34- if (screen && screen->id < ARRAY_LENGTH(screen_wallbuf) &&
35- screen_wallbuf[screen->id]) {
36- return screen_wallbuf[screen->id];
37- }
38-
39- return wallbuf;
40-}
41-
42-EXPORT void
43-swc_wallpaper_set_buffer(struct wld_buffer *buffer)
44-{
45- set_buffer_slot(&wallbuf, buffer);
46- compositor_damage_all();
47-}
48-
49-EXPORT void
50-swc_wallpaper_set_buffer_for_screen(uint8_t screen_id,
51- struct wld_buffer *buffer)
52-{
53- if (screen_id >= ARRAY_LENGTH(screen_wallbuf)) {
54- return;
55- }
56-
57- set_buffer_slot(&screen_wallbuf[screen_id], buffer);
58- compositor_damage_all();
59-}
60-
61-EXPORT void
62-swc_wallpaper_color_set(uint32_t color)
63-{
64- bgcolor = color;
65- compositor_damage_all();
66-}
67-
68-static void
69-set_buffer(struct wl_client *client, struct wl_resource *resource,
70- int32_t screen_id, struct wl_resource *buffer_resource)
71-{
72- struct wld_buffer *buffer = NULL;
73-
74- (void)client;
75-
76- if (buffer_resource) {
77- buffer = wayland_buffer_get(buffer_resource);
78- if (!buffer) {
79- wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT,
80- "buffer is not a wl_buffer");
81- return;
82- }
83- }
84-
85- if (screen_id == -1) {
86- swc_wallpaper_set_buffer(buffer);
87- return;
88- }
89-
90- if (screen_id < 0 || screen_id >= ARRAY_LENGTH(screen_wallbuf)) {
91- return;
92- }
93-
94- swc_wallpaper_set_buffer_for_screen((uint8_t)screen_id, buffer);
95-}
96-
97-static const struct swc_wallpaper_interface wallpaper_impl = {
98- .destroy = destroy_resource,
99- .set_buffer = set_buffer,
100-};
101-
102-static void
103-bind_wallpaper(struct wl_client *client, void *data, uint32_t version,
104- uint32_t id)
105-{
106- (void)data;
107-
108- struct wl_resource *resource;
109-
110- resource =
111- wl_resource_create(client, &swc_wallpaper_interface, version, id);
112- if (!resource) {
113- wl_client_post_no_memory(client);
114- return;
115- }
116-
117- wl_resource_set_implementation(resource, &wallpaper_impl, NULL, NULL);
118-}
119-
120-struct wl_global *
121-swc_wallpaper_manager_create(struct wl_display *display)
122-{
123- return wl_global_create(display, &swc_wallpaper_interface, 1, NULL,
124- bind_wallpaper);
125-}
+0,
-14
1@@ -1,14 +0,0 @@
2-#ifndef SWC_WALLPAPER_H
3-#define SWC_WALLPAPER_H
4-
5-struct wl_display;
6-struct wl_global;
7-struct wld_buffer;
8-struct screen;
9-
10-struct wl_global *
11-swc_wallpaper_manager_create(struct wl_display *display);
12-struct wld_buffer *
13-swc_wallpaper_buffer_for_screen(struct screen *screen);
14-
15-#endif
+0,
-1
1@@ -7,7 +7,6 @@ foreach proto : [
2 'swc.xml',
3 'swc_snap.xml',
4 'swc_select.xml',
5- 'swc_wallpaper.xml',
6 'wlr-layer-shell-unstable-v1.xml',
7 'wayland-drm.xml',
8 wl.find_protocol('xdg-shell', state: 'stable'),
+0,
-19
1@@ -1,19 +0,0 @@
2-<?xml version="1.0" encoding="UTF-8"?>
3-<protocol name="swc_wallpaper">
4- <interface name="swc_wallpaper" version="1">
5- <description summary="set compositor wallpaper">
6- Allows clients to set wallpaper buffers.
7- </description>
8-
9- <request name="destroy" type="destructor" />
10-
11- <request name="set_buffer">
12- <description summary="set or clear wallpaper buffer">
13- screen_id=-1 targets global fallback wallpaper.
14- Any other screen_id targets that id.
15- </description>
16- <arg name="screen_id" type="int" />
17- <arg name="buffer" type="object" interface="wl_buffer" allow-null="true" />
18- </request>
19- </interface>
20-</protocol>