diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index ba7406cf..483e7bc9 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -82,7 +82,7 @@ jobs:
run: |
pacman-key --init
pacman -Syu --noconfirm
- pacman -S --noconfirm git meson clang wlroots0.19 libdrm libinput \
+ pacman -S --noconfirm git meson clang wlroots0.20 libdrm libinput \
wayland-protocols cairo pango libxml2 xorg-xwayland librsvg \
libdisplay-info gdb ttf-dejavu foot libsfdo cmocka
@@ -95,6 +95,7 @@ jobs:
apt-get install -y git gcc clang gdb xwayland
apt-get build-dep -y labwc
apt-get build-dep -y libwlroots-0.19-dev
+ apt-get build-dep -y libxkbcommon-dev
- name: Install FreeBSD dependencies
if: matrix.name == 'FreeBSD'
@@ -106,7 +107,7 @@ jobs:
pkg set -yn pkg:mesa-dri # hack to skip llvm dependency
pkg install -y git pcre2 meson gcc pkgconf cairo pango evdev-proto \
hwdata wayland-protocols libdisplay-info libepoll-shim \
- wlroots019
+ wlroots020
run: echo "setup done"
- name: Install Void Linux dependencies
@@ -121,7 +122,7 @@ jobs:
xbps-install -y git meson gcc clang pkg-config scdoc \
cairo-devel glib-devel libpng-devel librsvg-devel libxml2-devel \
pango-devel wlroots0.19-devel gdb bash xorg-server-xwayland \
- dejavu-fonts-ttf libsfdo-devel foot
+ dejavu-fonts-ttf libsfdo-devel foot hwids
# These builds are executed on all runners
- name: Build with gcc
@@ -209,6 +210,19 @@ jobs:
meson compile -C build-gcc-no-feature
' | $TARGET
+ # No backend build, run on Arch only
+ - name: Build with gcc - no-backends test
+ if: matrix.name == 'Arch'
+ run: |
+ echo '
+ cd "$GITHUB_WORKSPACE"
+ export CC=gcc
+ meson setup build-gcc-no-backends \
+ -Dwlroots:backends= -Dwlroots:session=disabled --werror \
+ --force-fallback-for=wlroots
+ meson compile -C build-gcc-no-backends
+ ' | $TARGET
+
# Unit tests, run on Arch only
- name: Build with gcc - unit test
if: matrix.name == 'Arch'
diff --git a/NEWS.md b/NEWS.md
index 8787fef2..d721ed3b 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -9,7 +9,7 @@ The format is based on [Keep a Changelog]
| Date | All Changes | wlroots version | lines-of-code |
|------------|---------------|-----------------|---------------|
-| 2026-03-15 | [unreleased] | 0.19.2 | 29244 |
+| 2026-03-31 | [unreleased] | 0.20.0 | 27402 |
| 2026-03-15 | [0.9.6] | 0.19.2 | 29271 |
| 2026-03-04 | [0.9.5] | 0.19.2 | 29251 |
| 2026-02-27 | [0.9.4] | 0.19.2 | 29225 |
@@ -115,8 +115,27 @@ There are some regression warnings worth noting for the switch to wlroots 0.19:
[unreleased-commits]
+The codebase has been ported to wlroots 0.20 [#2956] @Consolatis
+
+### Added
+
+- Add configuration option ``
+ to enable tablet tool pressure range libinput settings [#2916] @jp7677
+- Add `wl_fixes` interface [#2956] @kode54
+
### Fixed
+- Gracefully handle missing XWayland packages, so that a labwc compositor which
+ has been built with XWayland support (which is optional) can be run even if
+ XWayland is not installed. [#3401] @quite
+- Rework how XWayland window initial geometry is set to ensure that the natural
+ geometry does not exceed the usable output area when handling initial
+ maximize/fullscreen requests. [#3439] @jlindgren90.
+- For XWayland windows, sync always-on-top state back to X.Org Server. This
+ makes `wmctrl -b toggle,above` work. [#3446] @jlindgren90
+- Fix missing title and icon with XWayland client override-redirect toggle.
+ There are no known issues with clients, so this is purely for preventative
+ purposes. [#3450] @jlindgren90
- Update titlebar title when set to empty and fix an associated issue causing
the title to be misplaced outside of the titlebar when the window is resized.
[#3443] @tokyo4j
@@ -127,6 +146,10 @@ There are some regression warnings worth noting for the switch to wlroots 0.19:
- Allow policy-based placement to apply when an initially-maximized/fullscreen
view is restored to floating geometry. [#3387] @jlindgren90
+### Changed
+
+- Drop cosmic-workspace protocol [#3031] @tokyo4j
+
## 0.9.6 - 2026-03-15
[0.9.6-commits]
@@ -3098,6 +3121,7 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16
[#2909]: https://github.com/labwc/labwc/pull/2909
[#2910]: https://github.com/labwc/labwc/pull/2910
[#2914]: https://github.com/labwc/labwc/pull/2914
+[#2916]: https://github.com/labwc/labwc/pull/2916
[#2933]: https://github.com/labwc/labwc/pull/2933
[#2937]: https://github.com/labwc/labwc/pull/2937
[#2939]: https://github.com/labwc/labwc/pull/2939
@@ -3105,6 +3129,7 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16
[#2943]: https://github.com/labwc/labwc/pull/2943
[#2944]: https://github.com/labwc/labwc/pull/2944
[#2948]: https://github.com/labwc/labwc/pull/2948
+[#2956]: https://github.com/labwc/labwc/pull/2956
[#2965]: https://github.com/labwc/labwc/pull/2965
[#2967]: https://github.com/labwc/labwc/pull/2967
[#2970]: https://github.com/labwc/labwc/pull/2970
@@ -3122,6 +3147,7 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16
[#3020]: https://github.com/labwc/labwc/pull/3020
[#3024]: https://github.com/labwc/labwc/pull/3024
[#3028]: https://github.com/labwc/labwc/pull/3028
+[#3031]: https://github.com/labwc/labwc/pull/3031
[#3033]: https://github.com/labwc/labwc/pull/3033
[#3039]: https://github.com/labwc/labwc/pull/3039
[#3042]: https://github.com/labwc/labwc/pull/3042
@@ -3189,6 +3215,7 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16
[#3373]: https://github.com/labwc/labwc/pull/3373
[#3387]: https://github.com/labwc/labwc/pull/3387
[#3400]: https://github.com/labwc/labwc/pull/3400
+[#3401]: https://github.com/labwc/labwc/pull/3401
[#3406]: https://github.com/labwc/labwc/pull/3406
[#3410]: https://github.com/labwc/labwc/pull/3410
[#3411]: https://github.com/labwc/labwc/pull/3411
@@ -3198,7 +3225,10 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16
[#3428]: https://github.com/labwc/labwc/pull/3428
[#3429]: https://github.com/labwc/labwc/pull/3429
[#3430]: https://github.com/labwc/labwc/pull/3430
+[#3439]: https://github.com/labwc/labwc/pull/3439
[#3440]: https://github.com/labwc/labwc/pull/3440
[#3441]: https://github.com/labwc/labwc/pull/3441
[#3443]: https://github.com/labwc/labwc/pull/3443
[#3445]: https://github.com/labwc/labwc/pull/3445
+[#3446]: https://github.com/labwc/labwc/pull/3446
+[#3450]: https://github.com/labwc/labwc/pull/3450
diff --git a/clients/labnag.c b/clients/labnag.c
index 237ee958..82b6e8cd 100644
--- a/clients/labnag.c
+++ b/clients/labnag.c
@@ -206,6 +206,16 @@ static void
get_text_size(cairo_t *cairo, const PangoFontDescription *desc, int *width, int *height,
int *baseline, double scale, bool markup, const char *fmt, ...)
{
+ if (width) {
+ *width = 0;
+ }
+ if (height) {
+ *height = 0;
+ }
+ if (baseline) {
+ *baseline = 0;
+ }
+
va_list args;
va_start(args, fmt);
gchar *buf = g_strdup_vprintf(fmt, args);
diff --git a/clients/meson.build b/clients/meson.build
index 467bc035..55a4c0e5 100644
--- a/clients/meson.build
+++ b/clients/meson.build
@@ -1,59 +1,61 @@
-wayland_client = dependency('wayland-client')
-wayland_cursor = dependency('wayland-cursor')
+if get_option('labnag').allowed()
+ wayland_client = dependency('wayland-client')
+ wayland_cursor = dependency('wayland-cursor')
-nag_sources = files(
- 'labnag.c',
- 'pool-buffer.c',
-)
-
-wl_protocol_dir = wayland_protos.get_variable('pkgdatadir')
-
-protocols = [
- wl_protocol_dir / 'stable/tablet/tablet-v2.xml',
- wl_protocol_dir / 'stable/xdg-shell/xdg-shell.xml',
- wl_protocol_dir / 'staging/cursor-shape/cursor-shape-v1.xml',
- '../protocols/wlr-layer-shell-unstable-v1.xml',
-]
-
-foreach xml : protocols
- nag_sources += custom_target(
- xml.underscorify() + '_c',
- input: xml,
- output: '@BASENAME@-protocol.c',
- command: [wayland_scanner, 'private-code', '@INPUT@', '@OUTPUT@'],
+ nag_sources = files(
+ 'labnag.c',
+ 'pool-buffer.c',
)
- nag_sources += custom_target(
- xml.underscorify() + '_client_h',
- input: xml,
- output: '@BASENAME@-client-protocol.h',
- command: [wayland_scanner, 'client-header', '@INPUT@', '@OUTPUT@'],
- )
-endforeach
-if host_machine.system() in ['freebsd', 'openbsd']
- # For signalfd()
- epoll_dep = dependency('epoll-shim')
-else
- epoll_dep = []
+ wl_protocol_dir = wayland_protos.get_variable('pkgdatadir')
+
+ protocols = [
+ wl_protocol_dir / 'stable/tablet/tablet-v2.xml',
+ wl_protocol_dir / 'stable/xdg-shell/xdg-shell.xml',
+ wl_protocol_dir / 'staging/cursor-shape/cursor-shape-v1.xml',
+ '../protocols/wlr-layer-shell-unstable-v1.xml',
+ ]
+
+ foreach xml : protocols
+ nag_sources += custom_target(
+ xml.underscorify() + '_c',
+ input: xml,
+ output: '@BASENAME@-protocol.c',
+ command: [wayland_scanner, 'private-code', '@INPUT@', '@OUTPUT@'],
+ )
+ nag_sources += custom_target(
+ xml.underscorify() + '_client_h',
+ input: xml,
+ output: '@BASENAME@-client-protocol.h',
+ command: [wayland_scanner, 'client-header', '@INPUT@', '@OUTPUT@'],
+ )
+ endforeach
+
+ if host_machine.system() in ['freebsd', 'openbsd']
+ # For signalfd()
+ epoll_dep = dependency('epoll-shim')
+ else
+ epoll_dep = []
+ endif
+
+ executable(
+ 'labnag',
+ nag_sources,
+ dependencies: [
+ cairo,
+ pangocairo,
+ glib,
+ wayland_client,
+ wayland_cursor,
+ wlroots,
+ server_protos,
+ epoll_dep,
+ xkbcommon,
+ ],
+ include_directories: [labwc_inc],
+ install: true,
+ )
endif
-executable(
- 'labnag',
- nag_sources,
- dependencies: [
- cairo,
- pangocairo,
- glib,
- wayland_client,
- wayland_cursor,
- wlroots,
- server_protos,
- epoll_dep,
- xkbcommon,
- ],
- include_directories: [labwc_inc],
- install: true,
-)
-
clients = files('lab-sensible-terminal')
install_data(clients, install_dir: get_option('bindir'))
diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd
index 03d5fc24..09f7b3eb 100644
--- a/docs/labwc-config.5.scd
+++ b/docs/labwc-config.5.scd
@@ -1090,7 +1090,8 @@ Note: To rotate touch events with output rotation, use the libinput
## TABLET TOOL
```
-
+
```
** [absolute|relative]
@@ -1105,6 +1106,16 @@ Note: To rotate touch events with output rotation, use the libinput
speed, using a value greater than 1.0 increases the speed of the
cursor. The default is "1.0".
+**
+**
+ The pressure range of a tablet tool can be controlled by adjusting
+ *minPressure* and *maxPressure*. Setting the minimum pressure to
+ a value greater than zero requires more pressure for the tip
+ threshold, setting the maximum pressure to a value less than 1.0
+ requires less pressure for the user before the maximum is reached.
+ The default is 0 for the minimum pressure and 1.0 for the maximum
+ pressure.
+
## LIBINPUT
```
diff --git a/docs/rc.xml.all b/docs/rc.xml.all
index bc9566fe..bbec9d0b 100644
--- a/docs/rc.xml.all
+++ b/docs/rc.xml.all
@@ -573,8 +573,11 @@
*relativeMotionSensitivity* controls the speed of the cursor. Using
a value lower than 1.0 decreases the speed, using a value greater than
1.0 increases the speed of the cursor.
+ The pressure range of a tablet tool can be controlled by adjusting
+ *minPressure* and *maxPressure*.
-->
-
+