diff --git a/x11-wm/sway/Makefile b/x11-wm/sway/Makefile index caf623eafae1..120ae0e8cd0a 100644 --- a/x11-wm/sway/Makefile +++ b/x11-wm/sway/Makefile @@ -1,76 +1,77 @@ 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 5a9f187e11df..1209fefbe87e 100644 --- a/x11-wm/sway/files/extra-patch-wordexp +++ b/x11-wm/sway/files/extra-patch-wordexp @@ -1,53 +1,57 @@ 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" -@@ -318,11 +320,34 @@ bool expand_path(char **path) { +@@ -318,11 +320,37 @@ 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; + } + + int res = wordexp(*path, &p, 0); + + if (sigaction(SIGCHLD, &prev_action, NULL) != 0) { + sway_log(SWAY_ERROR, "Restoring sigchild after wordexp failed"); + } + + int status; -+ while (waitpid(-1, &status, WNOHANG) != -1 || errno == EINTR); ++ int wres; ++ do { ++ wres = waitpid(-1, &status, WNOHANG); ++ } while (wres > 0 || (wres == -1 && errno == EINTR)); + + 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); diff --git a/x11-wm/swayfx/Makefile b/x11-wm/swayfx/Makefile index f53808ea6c88..8e4890d5cdef 100644 --- a/x11-wm/swayfx/Makefile +++ b/x11-wm/swayfx/Makefile @@ -1,79 +1,80 @@ PORTNAME= sway DISTVERSION= 0.5.3 +PORTREVISION= 1 CATEGORIES= x11-wm wayland PKGNAMESUFFIX= ${GH_PROJECT:S/${PORTNAME}//} MAINTAINER= jbeich@FreeBSD.org COMMENT= Sway, but with eye candy! WWW= https://github.com/WillPower3309/swayfx 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 \ libscenefx-0.4.so:x11-toolkits/scenefx04 \ 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= WillPower3309 GH_PROJECT= swayfx MESON_ARGS= -Dsd-bus-provider=basu CONFLICTS_INSTALL= ${PORTNAME} ${PORTNAME}-devel 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/swayfx/files/extra-patch-wordexp b/x11-wm/swayfx/files/extra-patch-wordexp index 5a9f187e11df..1209fefbe87e 100644 --- a/x11-wm/swayfx/files/extra-patch-wordexp +++ b/x11-wm/swayfx/files/extra-patch-wordexp @@ -1,53 +1,57 @@ 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" -@@ -318,11 +320,34 @@ bool expand_path(char **path) { +@@ -318,11 +320,37 @@ 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; + } + + int res = wordexp(*path, &p, 0); + + if (sigaction(SIGCHLD, &prev_action, NULL) != 0) { + sway_log(SWAY_ERROR, "Restoring sigchild after wordexp failed"); + } + + int status; -+ while (waitpid(-1, &status, WNOHANG) != -1 || errno == EINTR); ++ int wres; ++ do { ++ wres = waitpid(-1, &status, WNOHANG); ++ } while (wres > 0 || (wres == -1 && errno == EINTR)); + + 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);