diff --git a/.github/workflows/create-release.yaml b/.github/workflows/create-release.yaml index 6a1ff53..3a0ddf0 100644 --- a/.github/workflows/create-release.yaml +++ b/.github/workflows/create-release.yaml @@ -23,7 +23,7 @@ jobs: args: --current --strip all env: OUTPUT: /tmp/release-notes.md - - run: sudo apt-get install libpixman-1-dev libwayland-dev meson scdoc wayland-protocols + - run: sudo apt-get update && sudo apt-get install libpixman-1-dev libwayland-dev meson scdoc wayland-protocols - name: prepare a tarball run: | meson setup --buildtype release build diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index 34c3125..49cdd89 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -21,7 +21,7 @@ jobs: - ubuntu-latest steps: - uses: actions/checkout@v6 - - run: sudo apt-get install libpixman-1-dev libwayland-dev meson scdoc wayland-protocols + - run: sudo apt-get update && sudo apt-get install libpixman-1-dev libwayland-dev meson scdoc wayland-protocols - run: meson setup --buildtype release build - run: ninja -C build test - run: ninja -C build diff --git a/CHANGELOG.md b/CHANGELOG.md index 61c684b..4cf0562 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines. +## Unreleased + +### Fixes + +- avoid segfault if overlay wasn't created +- add more pixel formats + ## 0.0.8 (2025-11-25) ### Fixes diff --git a/capture.c b/capture.c index e5f27c4..e7fe757 100644 --- a/capture.c +++ b/capture.c @@ -21,22 +21,65 @@ static void screencopy_handle_flags( static pixman_format_code_t wl2pixman_format(enum wl_shm_format wl_shm_format) { switch (wl_shm_format) { + + case WL_SHM_FORMAT_ABGR1555: + return PIXMAN_a1b5g5r5; + case WL_SHM_FORMAT_ABGR4444: + return PIXMAN_a4b4g4r4; + case WL_SHM_FORMAT_ABGR8888: + return PIXMAN_a8b8g8r8; + case WL_SHM_FORMAT_ABGR2101010: + return PIXMAN_a2b10g10r10; + + case WL_SHM_FORMAT_ARGB1555: + return PIXMAN_a1r5g5b5; + case WL_SHM_FORMAT_ARGB4444: + return PIXMAN_a4r4g4b4; case WL_SHM_FORMAT_ARGB8888: return PIXMAN_a8r8g8b8; - case WL_SHM_FORMAT_XRGB8888: - return PIXMAN_x8r8g8b8; + case WL_SHM_FORMAT_ARGB2101010: + return PIXMAN_a2r10g10b10; + + case WL_SHM_FORMAT_BGR233: + return PIXMAN_b2g3r3; + case WL_SHM_FORMAT_BGR565: + return PIXMAN_b5g6r5; + case WL_SHM_FORMAT_BGR888: + return PIXMAN_b8g8r8; + case WL_SHM_FORMAT_BGRA8888: + return PIXMAN_b8g8r8a8; + case WL_SHM_FORMAT_BGRX8888: + return PIXMAN_b8g8r8x8; + + case WL_SHM_FORMAT_RGB332: + return PIXMAN_r3g3b2; + case WL_SHM_FORMAT_RGB565: + return PIXMAN_r5g6b5; + case WL_SHM_FORMAT_RGB888: + return PIXMAN_r8g8b8; + case WL_SHM_FORMAT_RGBA8888: + return PIXMAN_r8g8b8a8; + case WL_SHM_FORMAT_RGBX8888: + return PIXMAN_r8g8b8x8; + + case WL_SHM_FORMAT_XBGR1555: + return PIXMAN_x1b5g5r5; + case WL_SHM_FORMAT_XBGR4444: + return PIXMAN_x4b4g4r4; case WL_SHM_FORMAT_XBGR8888: return PIXMAN_x8b8g8r8; - case WL_SHM_FORMAT_ABGR8888: - return PIXMAN_a8b8g8r8; - case WL_SHM_FORMAT_XRGB2101010: - return PIXMAN_x2r10g10b10; case WL_SHM_FORMAT_XBGR2101010: return PIXMAN_x2b10g10r10; - case WL_SHM_FORMAT_ARGB2101010: - return PIXMAN_a2r10g10b10; - case WL_SHM_FORMAT_ABGR2101010: - return PIXMAN_a2b10g10r10; + + case WL_SHM_FORMAT_XRGB1555: + return PIXMAN_x1r5g5b5; + case WL_SHM_FORMAT_XRGB4444: + return PIXMAN_x4r4g4b4; + case WL_SHM_FORMAT_XRGB8888: + return PIXMAN_x8r8g8b8; + case WL_SHM_FORMAT_XRGB2101010: + return PIXMAN_x2r10g10b10; + default: return 0; } diff --git a/overlay.c b/overlay.c index 3ef07ca..8945deb 100644 --- a/overlay.c +++ b/overlay.c @@ -81,8 +81,18 @@ void overlay_show(struct overlay *overlay) { void overlay_destroy(struct overlay *overlay) { buffer_destroy(overlay->buffer); - wp_viewport_destroy(overlay->wp_viewport); - wl_surface_destroy(overlay->wl_surface); - zwlr_layer_surface_v1_destroy(overlay->wlr_layer_surface); + + if (overlay->wp_viewport) { + wp_viewport_destroy(overlay->wp_viewport); + } + + if (overlay->wl_surface) { + wl_surface_destroy(overlay->wl_surface); + } + + if (overlay->wlr_layer_surface) { + zwlr_layer_surface_v1_destroy(overlay->wlr_layer_surface); + } + wl_output_release(overlay->wl_output); }