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, &region);
76-	} else {
77-		wld_fill_region(swc.shm->renderer, bgcolor, &region);
78-	}
79+	wld_fill_region(swc.shm->renderer, DEFAULT_BG, &region);
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>