diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index caa54a33..d42c0d36 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -93,10 +93,15 @@ jobs: sed -i '/^Types/ s/deb/& deb-src/' /etc/apt/sources.list.d/debian.sources apt-get update apt-get upgrade -y - 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 + apt-get install -y git gcc clang gdb xwayland meson pkgconf + apt-get build-dep -y libwlroots-0.20-dev + # Debian Testing temporarily removed labwc due to wlroots 0.20 transition + #apt-get build-dep -y labwc + # Install the deps manually + apt-get install -y libxml2-dev liblzma-dev libglib2.0-dev \ + libcairo2-dev libpango1.0-dev libinput-dev libpng-dev \ + librsvg2-dev wayland-protocols libxkbcommon-dev libdrm-dev \ + scdoc gettext libwlroots-0.20-dev libsfdo-dev - name: Install FreeBSD dependencies if: matrix.name == 'FreeBSD' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1a2251ad..c1c70b47 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,7 +19,8 @@ - [6. Unit Tests](#unit-tests) - [7. Submitting Patches](#submitting-patches) - [8. Native Language Support](#native-language-support) -- [9. Upversion](#upversion) +- [9. Tools](#tools) +- [10. Upversion](#upversion) # How to Contribute @@ -472,6 +473,29 @@ This generates a new pot file at `po/labwc.pot` 3. Copy the header from the original `labwc.pot` to the new one, keeping the newly generated dates, check for sanity and commit. +# Tools + +We permit LLM and AI-assisted tooling, but only on the basis that humans remain +fully accountable. Contributors must use an `Assisted-by:` tag in the commit +logs if AI tools generated or significantly assisted with any part of the code +or documentation. Humans retain full legal and technical responsibility for the +resulting work, including any defects. + +We have received Pull Requests where the submitter clearly did not understand +the code, could not reason about it, and would be unable to maintain it. This +is not acceptable. + +Any AI-generated code contribution must be compatible with the GPL-2.0-only +license. + +While LLMs can be useful for triage, review, clean-up, API refactoring and +similar tasks, we strongly discourage AI slop. Code review effort is usually the +project's primary bottleneck, and submitting unreviewed, AI-generated garbage +wastes reviewer time, slows development, and harms the overall health of the +project. Likewise, AI-generated commit messages and AI-written text in issues +and discussions are strongly discouraged and may be treated as sabotage on this +basis. + # Upversion It is generally only the lead-maintainer who will upversion, but in order diff --git a/NEWS.md b/NEWS.md index ad71a1df..27a5abd8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog] | Date | All Changes | wlroots version | lines-of-code | |------------|---------------|-----------------|---------------| | 2026-05-25 | [0.20.0] | 0.20.1 | 28313 | +| 2026-06-11 | [0.9.8] | 0.19.3 | 29284 | | 2026-04-17 | [0.9.7] | 0.19.2 | 29277 | | 2026-03-15 | [0.9.6] | 0.19.2 | 29271 | | 2026-03-04 | [0.9.5] | 0.19.2 | 29251 | @@ -46,6 +47,7 @@ The format is based on [Keep a Changelog] [unreleased]: NEWS.md#unreleased [0.20.0]: NEWS.md#0200---2026-05-25 +[0.9.8]: NEWS.md#098---2026-06-11 [0.9.7]: NEWS.md#097---2026-04-17 [0.9.6]: NEWS.md#096---2026-03-15 [0.9.5]: NEWS.md#095---2026-03-04 @@ -84,6 +86,19 @@ The format is based on [Keep a Changelog] [unreleased-commits] +## Notes on wlroots-0.20 + +There are some regression warnings worth noting for the switch to wlroots 0.20: + +- lxqt-panel auto-hiding does not work with a panel size greater than 40 [#3600] + [wlroots-5392] +- Some Wine game windows disappear after alt-tab. It is not yet clear where the + bug is, but the issue manifests itself when running wlroots-0.20 [#3615] + [wlroots-4103] + +[wlroots-5392]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/5392 +[wlroots-4103]: https://gitlab.freedesktop.org/wlroots/wlroots/-/work_items/4103 + ## 0.20.0 - 2026-05-25 [0.20.0-commits] @@ -217,6 +232,16 @@ There are some regression warnings worth noting for the switch to wlroots 0.19: [wlroots-5098]:https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/5098 [gtk-8792]: https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/8792 +## 0.9.8 - 2026-06-11 + +[0.9.8-commits] + +### Fixed + +- Handle titles with no visible characters @Consolatis [#3631] +- Save window position on initial placement to fix Raspberry Pi pygame SDL + XWayland window starting off-screen. @tokyo4j [#3433] [#3625] [#3616] + ## 0.9.7 - 2026-04-17 [0.9.7-commits] @@ -2772,6 +2797,7 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16 [Keep a Changelog]: https://keepachangelog.com/en/1.0.0/ [unreleased-commits]: https://github.com/labwc/labwc/compare/0.20.0...HEAD [0.20.0-commits]: https://github.com/labwc/labwc/compare/0.9.5..0.20.0 +[0.9.8-commits]: https://github.com/labwc/labwc/compare/0.9.7...0.9.8 [0.9.7-commits]: https://github.com/labwc/labwc/compare/0.9.6...0.9.7 [0.9.6-commits]: https://github.com/labwc/labwc/compare/0.9.5...0.9.6 [0.9.5-commits]: https://github.com/labwc/labwc/compare/0.9.4...0.9.5 @@ -3223,6 +3249,7 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16 [#2956]: https://github.com/labwc/labwc/pull/2956 [#2965]: https://github.com/labwc/labwc/pull/2965 [#2967]: https://github.com/labwc/labwc/pull/2967 +[#2968]: https://github.com/labwc/labwc/pull/2968 [#2970]: https://github.com/labwc/labwc/pull/2970 [#2971]: https://github.com/labwc/labwc/pull/2971 [#2972]: https://github.com/labwc/labwc/pull/2972 @@ -3317,6 +3344,7 @@ 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 +[#3433]: https://github.com/labwc/labwc/pull/3433 [#3439]: https://github.com/labwc/labwc/pull/3439 [#3440]: https://github.com/labwc/labwc/pull/3440 [#3441]: https://github.com/labwc/labwc/pull/3441 @@ -3343,4 +3371,12 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16 [#3543]: https://github.com/labwc/labwc/pull/3543 [#3547]: https://github.com/labwc/labwc/pull/3547 [#3567]: https://github.com/labwc/labwc/pull/3567 +[#3576]: https://github.com/labwc/labwc/pull/3576 +[#3577]: https://github.com/labwc/labwc/pull/3577 +[#3581]: https://github.com/labwc/labwc/pull/3581 [#3595]: https://github.com/labwc/labwc/pull/3595 +[#3600]: https://github.com/labwc/labwc/pull/3600 +[#3615]: https://github.com/labwc/labwc/pull/3615 +[#3616]: https://github.com/labwc/labwc/pull/3616 +[#3625]: https://github.com/labwc/labwc/pull/3625 +[#3631]: https://github.com/labwc/labwc/pull/3631 diff --git a/README.md b/README.md index 80796af7..4fa5c0e4 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,7 @@ Build dependencies include: - meson, ninja, gcc/clang - wayland-protocols -Disable xwayland with `meson -Dxwayland=disabled build/` +Disable xwayland with `meson setup -Dxwayland=disabled build/` For OS/distribution specific details see [wiki]. diff --git a/src/buffer.c b/src/buffer.c index 04ca4328..a9fa717e 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -95,6 +95,7 @@ buffer_adopt_cairo_surface(cairo_surface_t *surface) buffer->surface = surface; buffer->data = cairo_image_surface_get_data(buffer->surface); + assert(buffer->data); buffer->format = DRM_FORMAT_ARGB8888; buffer->stride = cairo_image_surface_get_stride(buffer->surface); buffer->logical_width = width; @@ -107,6 +108,12 @@ buffer_adopt_cairo_surface(cairo_surface_t *surface) struct lab_data_buffer * buffer_create_cairo(uint32_t logical_width, uint32_t logical_height, float scale) { + if (!logical_width || !logical_height) { + wlr_log(WLR_ERROR, "Failed to create cairo buffer of %ux%u: dimensions must be > 0", + logical_width, logical_height); + return NULL; + } + /* Create an image surface with the scaled size */ cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, @@ -142,6 +149,7 @@ buffer_create_from_data(void *pixel_data, uint32_t width, uint32_t height, buffer->logical_width = width; buffer->logical_height = height; buffer->data = pixel_data; + assert(buffer->data); buffer->format = DRM_FORMAT_ARGB8888; buffer->stride = stride; buffer->surface = cairo_image_surface_create_for_data( @@ -188,6 +196,10 @@ buffer_resize(struct lab_data_buffer *src_buffer, int width, int height, struct lab_data_buffer *buffer = buffer_create_cairo(width, height, scale); + if (!buffer) { + wlr_log(WLR_INFO, "Failed to resize buffer to %dx%d", width, height); + return NULL; + } cairo_t *cairo = cairo_create(buffer->surface); struct wlr_box container = { diff --git a/src/common/font.c b/src/common/font.c index 5162d284..642f864d 100644 --- a/src/common/font.c +++ b/src/common/font.c @@ -82,6 +82,7 @@ font_buffer_create(struct lab_data_buffer **buffer, int max_width, cairo_pattern_t *bg_pattern, double scale, bool use_markup) { if (string_null_or_empty(text)) { + *buffer = NULL; return; } @@ -91,6 +92,13 @@ font_buffer_create(struct lab_data_buffer **buffer, int max_width, height = computed_height; } + if (height <= 0 || width <= 0) { + wlr_log(WLR_INFO, "Refusing to create invisible font buffer of %dx%d", + width, height); + *buffer = NULL; + return; + } + *buffer = buffer_create_cairo(width, height, scale); if (!*buffer) { wlr_log(WLR_ERROR, "Failed to create font buffer"); diff --git a/src/scaled-buffer/scaled-font-buffer.c b/src/scaled-buffer/scaled-font-buffer.c index c748c00c..b85a79ff 100644 --- a/src/scaled-buffer/scaled-font-buffer.c +++ b/src/scaled-buffer/scaled-font-buffer.c @@ -29,7 +29,7 @@ _create_buffer(struct scaled_buffer *scaled_buffer, double scale) &self->font, self->color, bg_pattern, scale, self->use_markup); if (!buffer) { - wlr_log(WLR_ERROR, "font_buffer_create() failed"); + wlr_log(WLR_INFO, "font_buffer_create() failed"); } zfree_pattern(solid_bg_pattern); diff --git a/src/xdg.c b/src/xdg.c index 03035d63..ccba0de1 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -621,7 +621,24 @@ xdg_toplevel_view_configure(struct view *view, struct wlr_box geo) if (geo.width != view->pending.width || geo.height != view->pending.height) { if (toplevel->base->initialized) { - serial = wlr_xdg_toplevel_set_size(toplevel, geo.width, geo.height); + /* + * geo.{width,height} are checked here to guard against + * an odd edge-case reported in #3608 which involves TTY + * switching between labwc and Xfce running on X.Org on + * another TTY. It is not yet clear what causes this, + * but hitting wlroots assert() is not great, so let's + * protect against it. + * + * Ref: + * - https://github.com/labwc/labwc/issues/3608 + */ + if (geo.width > 0 && geo.height > 0) { + serial = wlr_xdg_toplevel_set_size(toplevel, + geo.width, geo.height); + } else { + wlr_log(WLR_ERROR, "cannot set size %dx%d", + geo.width, geo.height); + } } else { /* * This may happen, for example, when a panel resizes because a