diff --git a/x11-wm/sway/Makefile b/x11-wm/sway/Makefile index 120ae0e8cd0a..caf623eafae1 100644 --- a/x11-wm/sway/Makefile +++ b/x11-wm/sway/Makefile @@ -1,77 +1,76 @@ PORTNAME= sway DISTVERSION= 1.11 -PORTREVISION= 1 CATEGORIES= x11-wm wayland MAINTAINER= jbeich@FreeBSD.org COMMENT= i3-compatible Wayland compositor WWW= https://swaywm.org/ LICENSE= MIT LICENSE_FILE= ${WRKSRC}/LICENSE BUILD_DEPENDS= evdev-proto>0:devel/evdev-proto \ wayland-protocols>=1.24:graphics/wayland-protocols LIB_DEPENDS= libjson-c.so:devel/json-c \ libevdev.so:devel/libevdev \ libudev.so:devel/libudev-devd \ libpcre2-8.so:devel/pcre2 \ libdrm.so:graphics/libdrm \ libwayland-egl.so:graphics/wayland \ libwlroots-0.19.so:x11-toolkits/wlroots019 \ libinput.so:x11/libinput \ libxkbcommon.so:x11/libxkbcommon USES= compiler:c11 gnome meson pkgconfig xorg USE_GITHUB= yes USE_GNOME= cairo pango USE_XORG= pixman GH_ACCOUNT= swaywm MESON_ARGS= -Dsd-bus-provider=basu CONFLICTS_INSTALL= ${PORTNAME}-devel ${PORTNAME}fx OPTIONS_DEFINE= BASU MANPAGES PIXBUF SWAYBG X11 OPTIONS_DEFAULT=BASU MANPAGES PIXBUF SWAYBG X11 OPTIONS_SUB= yes BASU_DESC= Tray in swaybar via basu BASU_LIB_DEPENDS= libbasu.so:devel/basu BASU_MESON_ENABLED= tray MANPAGES_BUILD_DEPENDS= scdoc>=1.9.2:textproc/scdoc MANPAGES_MESON_ENABLED= man-pages PIXBUF_USE= GNOME=gdkpixbuf PIXBUF_MESON_ENABLED= gdk-pixbuf SWAYBG_DESC= Default command to set background SWAYBG_RUN_DEPENDS= swaybg:x11/swaybg X11_USE= XORG=xcb X11_LIB_DEPENDS= libxcb-icccm.so:x11/xcb-util-wm .include # https://github.com/freebsd/freebsd-src/pull/1675 .if ${OPSYS} == FreeBSD && (${OSVERSION} < 1305503 \ || ${OSVERSION} >= 1400000 && ${OSVERSION} < 1403505 \ || ${OSVERSION} >= 1500000 && ${OSVERSION} < 1500052) EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-wordexp .endif post-patch: # Let @sample handle default files under etc/ @${REINPLACE_CMD} -e '/config\.in/{ N; s/@BASENAME@/&.sample/; }' \ ${WRKSRC}/meson.build # Extract (snapshot) version from the port instead of meson.build @${REINPLACE_CMD} -i .nogit -e 's/git.found()/false/' \ -e '/project_version/s/@0@/${DISTVERSIONFULL}/' \ ${WRKSRC}/meson.build .if exists(${.CURDIR}/files/extra-patch-wordexp) # https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=275328 @${REINPLACE_CMD} -e 's/_POSIX_C_SOURCE=200809L/_XOPEN_SOURCE=700/' \ ${WRKSRC}/meson.build .endif .include diff --git a/x11-wm/sway/files/extra-patch-wordexp b/x11-wm/sway/files/extra-patch-wordexp index eb1f79f130f5..5a9f187e11df 100644 --- a/x11-wm/sway/files/extra-patch-wordexp +++ b/x11-wm/sway/files/extra-patch-wordexp @@ -1,49 +1,53 @@ https://github.com/swaywm/sway/issues/8673#issuecomment-2818260191 -https://github.com/swaywm/sway/issues/8828#issuecomment-3290045852 --- common/stringop.c.orig 2025-04-20 11:31:10 UTC +++ common/stringop.c @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include "list.h" #include "log.h" #include "stringop.h" -@@ -319,7 +321,33 @@ bool expand_path(char **path) { +@@ -318,11 +320,34 @@ bool expand_path(char **path) { + char *ptr = strstr(*path, " ") + 1; memmove(ptr + 1, ptr, strlen(ptr) + 1); *ptr = '\\'; - } +- } - if (wordexp(*path, &p, 0) != 0 || p.we_wordv[0] == NULL) { +- wordfree(&p); +- return false; +- } ++ } + -+ // FreeBSD wordexp bug workaround: -+ // 1. Reset SIGCHLD handler -+ // 2. Run wordexp -+ // 3. Restore SIGCHLD handler and reap any processes that exited -+ struct sigaction prev_action; -+ struct sigaction new_action = { -+ .sa_flags = SA_RESETHAND, -+ }; -+ if (sigaction(SIGCHLD, &new_action, &prev_action) != 0) { -+ sway_log(SWAY_ERROR, "Restoring sigchild before wordexp failed"); -+ return false; -+ } ++ // FreeBSD wordexp bug workaround: ++ // 1. Reset SIGCHLD handler ++ // 2. Run wordexp ++ // 3. Restore SIGCHLD handler and reap any processes that exited ++ struct sigaction prev_action; ++ struct sigaction new_action = { ++ .sa_flags = SA_RESETHAND, ++ }; ++ if (sigaction(SIGCHLD, &new_action, &prev_action) != 0) { ++ sway_log(SWAY_ERROR, "Restoring sigchild before wordexp failed"); ++ return false; ++ } + -+ int res = wordexp(*path, &p, 0); ++ int res = wordexp(*path, &p, 0); + -+ if (sigaction(SIGCHLD, &prev_action, NULL) != 0) { -+ sway_log(SWAY_ERROR, "Restoring sigchild after wordexp failed"); -+ } ++ if (sigaction(SIGCHLD, &prev_action, NULL) != 0) { ++ sway_log(SWAY_ERROR, "Restoring sigchild after wordexp failed"); ++ } + -+ int status; -+ int wres; -+ do { -+ wres = waitpid(-1, &status, WNOHANG); -+ } while (wres > 0 || (wres == -1 && errno == EINTR)); ++ int status; ++ while (waitpid(-1, &status, WNOHANG) != -1 || errno == EINTR); + -+ if (res != 0 || p.we_wordv[0] == NULL) { - wordfree(&p); - return false; - } ++ if (res != 0 || p.we_wordv[0] == NULL) { ++ wordfree(&p); ++ return false; ++ } + free(*path); + *path = join_args(p.we_wordv, p.we_wordc); + wordfree(&p);