diff --git a/wayland/sway-no-seat/build b/wayland/sway-no-seat/build index eecc2b49..9a595fb7 100755 --- a/wayland/sway-no-seat/build +++ b/wayland/sway-no-seat/build @@ -1,7 +1,8 @@ #!/bin/sh -e -patch -p1 < sway-static.patch -patch -p1 < no-evdev.patch +for p in *.patch; do + patch -p1 < "$p" +done # Build fails in subprojects/seatd with clang # due to -Werror -> -Wsign-compare. diff --git a/wayland/sway-no-seat/checksums b/wayland/sway-no-seat/checksums index f2de0523..8a2e9c8e 100644 --- a/wayland/sway-no-seat/checksums +++ b/wayland/sway-no-seat/checksums @@ -1,5 +1,6 @@ 8ac605dd25204dcd87ab352c8639b75361dc9ed276673797ef9c92bfd7cd18b5 1b999077290f3f5aa86cf98e3610df56834fbc23b12b4f2ead5bf31ecad0372f 210ddf8efa1149cde4dd35908bef8e9e63c2edaa0cdb5435f2e6db277fafff3c -0c0777dc70569be07bf602b55628c474a5ceb256650e4bcccaefd4038ae4a655 884c36e3184fc41ddd9353c667e85ba27843ad3f392344b0fd70e2a81bf503b6 +78719bb6c8accabf18418631911624164c4164c72bb37381922668f6f635463b +0c0777dc70569be07bf602b55628c474a5ceb256650e4bcccaefd4038ae4a655 diff --git a/wayland/sway-no-seat/patches/pcre2.patch b/wayland/sway-no-seat/patches/pcre2.patch new file mode 100644 index 00000000..ada85034 --- /dev/null +++ b/wayland/sway-no-seat/patches/pcre2.patch @@ -0,0 +1,215 @@ +diff --git a/include/sway/criteria.h b/include/sway/criteria.h +index ad8610cd..59f57f94 100644 +--- a/include/sway/criteria.h ++++ b/include/sway/criteria.h +@@ -1,7 +1,8 @@ + #ifndef _SWAY_CRITERIA_H + #define _SWAY_CRITERIA_H + +-#include ++#define PCRE2_CODE_UNIT_WIDTH 8 ++#include + #include "config.h" + #include "list.h" + #include "tree/view.h" +@@ -15,13 +16,13 @@ enum criteria_type { + }; + + enum pattern_type { +- PATTERN_PCRE, ++ PATTERN_PCRE2, + PATTERN_FOCUSED, + }; + + struct pattern { + enum pattern_type match_type; +- pcre *regex; ++ pcre2_code *regex; + }; + + struct criteria { +diff --git a/meson.build b/meson.build +index 5e4de87f..c59e4142 100644 +--- a/meson.build ++++ b/meson.build +@@ -36,7 +36,7 @@ if is_freebsd + endif + + jsonc = dependency('json-c', version: '>=0.13') +-pcre = dependency('libpcre') ++pcre2 = dependency('libpcre2-8') + wayland_server = dependency('wayland-server') + wayland_client = dependency('wayland-client') + wayland_cursor = dependency('wayland-cursor') +diff --git a/sway/criteria.c b/sway/criteria.c +index d2a5566f..94751c5f 100644 +--- a/sway/criteria.c ++++ b/sway/criteria.c +@@ -3,7 +3,8 @@ + #include + #include + #include +-#include ++#define PCRE2_CODE_UNIT_WIDTH 8 ++#include + #include "sway/criteria.h" + #include "sway/tree/container.h" + #include "sway/config.h" +@@ -40,17 +41,19 @@ bool criteria_is_empty(struct criteria *criteria) { + char *error = NULL; + + // Returns error string on failure or NULL otherwise. +-static bool generate_regex(pcre **regex, char *value) { +- const char *reg_err; +- int offset; +- +- *regex = pcre_compile(value, PCRE_UTF8 | PCRE_UCP, ®_err, &offset, NULL); ++static bool generate_regex(pcre2_code **regex, char *value) { ++ int errorcode; ++ PCRE2_SIZE offset; + ++ *regex = pcre2_compile((PCRE2_SPTR)value, PCRE2_ZERO_TERMINATED, PCRE2_UTF | PCRE2_UCP, &errorcode, &offset, NULL); + if (!*regex) { ++ PCRE2_UCHAR buffer[256]; ++ pcre2_get_error_message(errorcode, buffer, sizeof(buffer)); ++ + const char *fmt = "Regex compilation for '%s' failed: %s"; +- int len = strlen(fmt) + strlen(value) + strlen(reg_err) - 3; ++ int len = strlen(fmt) + strlen(value) + strlen((char*) buffer) - 3; + error = malloc(len); +- snprintf(error, len, fmt, value, reg_err); ++ snprintf(error, len, fmt, value, buffer); + return false; + } + +@@ -66,7 +69,7 @@ static bool pattern_create(struct pattern **pattern, char *value) { + if (strcmp(value, "__focused__") == 0) { + (*pattern)->match_type = PATTERN_FOCUSED; + } else { +- (*pattern)->match_type = PATTERN_PCRE; ++ (*pattern)->match_type = PATTERN_PCRE2; + if (!generate_regex(&(*pattern)->regex, value)) { + return false; + }; +@@ -77,7 +80,7 @@ static bool pattern_create(struct pattern **pattern, char *value) { + static void pattern_destroy(struct pattern *pattern) { + if (pattern) { + if (pattern->regex) { +- pcre_free(pattern->regex); ++ pcre2_code_free(pattern->regex); + } + free(pattern); + } +@@ -99,8 +102,11 @@ void criteria_destroy(struct criteria *criteria) { + free(criteria); + } + +-static int regex_cmp(const char *item, const pcre *regex) { +- return pcre_exec(regex, NULL, item, strlen(item), 0, 0, NULL, 0); ++static int regex_cmp(const char *item, const pcre2_code *regex) { ++ pcre2_match_data *match_data = pcre2_match_data_create_from_pattern(regex, NULL); ++ int result = pcre2_match(regex, (PCRE2_SPTR)item, strlen(item), 0, 0, match_data, NULL); ++ pcre2_match_data_free(match_data); ++ return result; + } + + #if HAVE_XWAYLAND +@@ -155,7 +161,7 @@ static bool criteria_matches_container(struct criteria *criteria, + bool exists = false; + struct sway_container *con = container; + for (int i = 0; i < con->marks->length; ++i) { +- if (regex_cmp(con->marks->items[i], criteria->con_mark->regex) == 0) { ++ if (regex_cmp(con->marks->items[i], criteria->con_mark->regex) >= 0) { + exists = true; + break; + } +@@ -192,8 +198,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(title, criteria->title->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(title, criteria->title->regex) < 0) { + return false; + } + break; +@@ -212,8 +218,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(shell, criteria->shell->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(shell, criteria->shell->regex) < 0) { + return false; + } + break; +@@ -232,8 +238,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(app_id, criteria->app_id->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(app_id, criteria->app_id->regex) < 0) { + return false; + } + break; +@@ -264,8 +270,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(class, criteria->class->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(class, criteria->class->regex) < 0) { + return false; + } + break; +@@ -284,8 +290,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(instance, criteria->instance->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(instance, criteria->instance->regex) < 0) { + return false; + } + break; +@@ -304,8 +310,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(window_role, criteria->window_role->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(window_role, criteria->window_role->regex) < 0) { + return false; + } + break; +@@ -363,8 +369,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(ws->name, criteria->workspace->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(ws->name, criteria->workspace->regex) < 0) { + return false; + } + break; +diff --git a/sway/meson.build b/sway/meson.build +index 8eab31a2..5f34ce6b 100644 +--- a/sway/meson.build ++++ b/sway/meson.build +@@ -213,7 +213,7 @@ sway_deps = [ + libudev, + math, + pango, +- pcre, ++ pcre2, + glesv2, + pixman, + server_protos, diff --git a/wayland/sway-no-seat/sources b/wayland/sway-no-seat/sources index e0012f9e..98b63e09 100644 --- a/wayland/sway-no-seat/sources +++ b/wayland/sway-no-seat/sources @@ -1,5 +1,6 @@ https://github.com/swaywm/sway/archive/VERSION.tar.gz https://gitlab.freedesktop.org/wlroots/wlroots/-/archive/e5063ef3a3b12d4384595cb0554cf1f84d5be6f8.tar.gz subprojects/wlroots https://git.sr.ht/~kennylevinsen/seatd/archive/0.7.0.tar.gz subprojects/seatd -patches/sway-static.patch patches/no-evdev.patch +patches/pcre2.patch +patches/sway-static.patch diff --git a/wayland/sway/build b/wayland/sway/build index c1ad52e9..1127d094 100755 --- a/wayland/sway/build +++ b/wayland/sway/build @@ -4,6 +4,7 @@ export CFLAGS="$CFLAGS -Wno-error" patch -p1 < no-evdev.patch +patch -p1 < pcre2.patch # Default background color. sed 's/0.25f, 0.25f, 0.25f/0.929, 0.870, 0.678/' \ diff --git a/wayland/sway/checksums b/wayland/sway/checksums index ad0122d4..480f64ed 100644 --- a/wayland/sway/checksums +++ b/wayland/sway/checksums @@ -1,2 +1,3 @@ 0c64536fb2883ec518e75cfb119f9300115fb49b084e3fde62b794fe2c6c8d84 089a4e120c4c99ff784f7e5fc0f050f8416b4d5b98d418c2d36afe3f31da3349 +82095453e072da69ee26d9f221f7c25ecf5f092882727e4d2c755d8ad6aa78ee diff --git a/wayland/sway/patches/pcre2.patch b/wayland/sway/patches/pcre2.patch new file mode 100644 index 00000000..91704a34 --- /dev/null +++ b/wayland/sway/patches/pcre2.patch @@ -0,0 +1,215 @@ +diff --git a/include/sway/criteria.h b/include/sway/criteria.h +index ad8610cd..59f57f94 100644 +--- a/include/sway/criteria.h ++++ b/include/sway/criteria.h +@@ -1,7 +1,8 @@ + #ifndef _SWAY_CRITERIA_H + #define _SWAY_CRITERIA_H + +-#include ++#define PCRE2_CODE_UNIT_WIDTH 8 ++#include + #include "config.h" + #include "list.h" + #include "tree/view.h" +@@ -15,13 +16,13 @@ enum criteria_type { + }; + + enum pattern_type { +- PATTERN_PCRE, ++ PATTERN_PCRE2, + PATTERN_FOCUSED, + }; + + struct pattern { + enum pattern_type match_type; +- pcre *regex; ++ pcre2_code *regex; + }; + + struct criteria { +diff --git a/meson.build b/meson.build +index 5e4de87f..c59e4142 100644 +--- a/meson.build ++++ b/meson.build +@@ -36,7 +36,7 @@ if is_freebsd + endif + + jsonc = dependency('json-c', version: '>=0.13') +-pcre = dependency('libpcre') ++pcre2 = dependency('libpcre2-8') + wayland_server = dependency('wayland-server', version: '>=1.20.0') + wayland_client = dependency('wayland-client') + wayland_cursor = dependency('wayland-cursor') +diff --git a/sway/criteria.c b/sway/criteria.c +index d2a5566f..94751c5f 100644 +--- a/sway/criteria.c ++++ b/sway/criteria.c +@@ -3,7 +3,8 @@ + #include + #include + #include +-#include ++#define PCRE2_CODE_UNIT_WIDTH 8 ++#include + #include "sway/criteria.h" + #include "sway/tree/container.h" + #include "sway/config.h" +@@ -40,17 +41,19 @@ bool criteria_is_empty(struct criteria *criteria) { + char *error = NULL; + + // Returns error string on failure or NULL otherwise. +-static bool generate_regex(pcre **regex, char *value) { +- const char *reg_err; +- int offset; +- +- *regex = pcre_compile(value, PCRE_UTF8 | PCRE_UCP, ®_err, &offset, NULL); ++static bool generate_regex(pcre2_code **regex, char *value) { ++ int errorcode; ++ PCRE2_SIZE offset; + ++ *regex = pcre2_compile((PCRE2_SPTR)value, PCRE2_ZERO_TERMINATED, PCRE2_UTF | PCRE2_UCP, &errorcode, &offset, NULL); + if (!*regex) { ++ PCRE2_UCHAR buffer[256]; ++ pcre2_get_error_message(errorcode, buffer, sizeof(buffer)); ++ + const char *fmt = "Regex compilation for '%s' failed: %s"; +- int len = strlen(fmt) + strlen(value) + strlen(reg_err) - 3; ++ int len = strlen(fmt) + strlen(value) + strlen((char*) buffer) - 3; + error = malloc(len); +- snprintf(error, len, fmt, value, reg_err); ++ snprintf(error, len, fmt, value, buffer); + return false; + } + +@@ -66,7 +69,7 @@ static bool pattern_create(struct pattern **pattern, char *value) { + if (strcmp(value, "__focused__") == 0) { + (*pattern)->match_type = PATTERN_FOCUSED; + } else { +- (*pattern)->match_type = PATTERN_PCRE; ++ (*pattern)->match_type = PATTERN_PCRE2; + if (!generate_regex(&(*pattern)->regex, value)) { + return false; + }; +@@ -77,7 +80,7 @@ static bool pattern_create(struct pattern **pattern, char *value) { + static void pattern_destroy(struct pattern *pattern) { + if (pattern) { + if (pattern->regex) { +- pcre_free(pattern->regex); ++ pcre2_code_free(pattern->regex); + } + free(pattern); + } +@@ -99,8 +102,11 @@ void criteria_destroy(struct criteria *criteria) { + free(criteria); + } + +-static int regex_cmp(const char *item, const pcre *regex) { +- return pcre_exec(regex, NULL, item, strlen(item), 0, 0, NULL, 0); ++static int regex_cmp(const char *item, const pcre2_code *regex) { ++ pcre2_match_data *match_data = pcre2_match_data_create_from_pattern(regex, NULL); ++ int result = pcre2_match(regex, (PCRE2_SPTR)item, strlen(item), 0, 0, match_data, NULL); ++ pcre2_match_data_free(match_data); ++ return result; + } + + #if HAVE_XWAYLAND +@@ -155,7 +161,7 @@ static bool criteria_matches_container(struct criteria *criteria, + bool exists = false; + struct sway_container *con = container; + for (int i = 0; i < con->marks->length; ++i) { +- if (regex_cmp(con->marks->items[i], criteria->con_mark->regex) == 0) { ++ if (regex_cmp(con->marks->items[i], criteria->con_mark->regex) >= 0) { + exists = true; + break; + } +@@ -192,8 +198,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(title, criteria->title->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(title, criteria->title->regex) < 0) { + return false; + } + break; +@@ -212,8 +218,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(shell, criteria->shell->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(shell, criteria->shell->regex) < 0) { + return false; + } + break; +@@ -232,8 +238,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(app_id, criteria->app_id->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(app_id, criteria->app_id->regex) < 0) { + return false; + } + break; +@@ -264,8 +270,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(class, criteria->class->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(class, criteria->class->regex) < 0) { + return false; + } + break; +@@ -284,8 +290,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(instance, criteria->instance->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(instance, criteria->instance->regex) < 0) { + return false; + } + break; +@@ -304,8 +310,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(window_role, criteria->window_role->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(window_role, criteria->window_role->regex) < 0) { + return false; + } + break; +@@ -363,8 +369,8 @@ static bool criteria_matches_view(struct criteria *criteria, + return false; + } + break; +- case PATTERN_PCRE: +- if (regex_cmp(ws->name, criteria->workspace->regex) != 0) { ++ case PATTERN_PCRE2: ++ if (regex_cmp(ws->name, criteria->workspace->regex) < 0) { + return false; + } + break; +diff --git a/sway/meson.build b/sway/meson.build +index 8eab31a2..5f34ce6b 100644 +--- a/sway/meson.build ++++ b/sway/meson.build +@@ -213,7 +213,7 @@ sway_deps = [ + libudev, + math, + pango, +- pcre, ++ pcre2, + glesv2, + pixman, + server_protos, diff --git a/wayland/sway/sources b/wayland/sway/sources index 1d0d2061..08c8fdef 100644 --- a/wayland/sway/sources +++ b/wayland/sway/sources @@ -1,2 +1,3 @@ https://github.com/swaywm/sway/releases/download/VERSION/sway-VERSION.tar.gz patches/no-evdev.patch +patches/pcre2.patch diff --git a/wayland/sway/version b/wayland/sway/version index 46b73aef..13be318a 100644 --- a/wayland/sway/version +++ b/wayland/sway/version @@ -1 +1 @@ -1.7 1 +1.7 2