summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-07-25 13:54:52 +0200
committercashmere <cashmere@autistici.org>2026-07-25 13:54:52 +0200
commit8132c06bf78e2ed39deb917fd9e96823e40b7b42 (patch)
tree49c97e0daf25d9ef4654fc11cab262baf89c70a2
parent11214b70b0d5e670d85c294e79f96cba63e34b13 (diff)
downloadports-8132c06bf78e2ed39deb917fd9e96823e40b7b42.tar.gz
add sunshine, i3bar-river, mango and scenefx05 ports
-rw-r--r--.gitignore1
-rw-r--r--Makefile4
-rw-r--r--multimedia/Makefile5
-rw-r--r--multimedia/sunshine/Makefile128
-rw-r--r--multimedia/sunshine/distinfo29
-rw-r--r--multimedia/sunshine/files/patch-cmake_targets_common.cmake16
-rw-r--r--multimedia/sunshine/files/patch-src_platform_linux_wlgrab.cpp11
-rw-r--r--multimedia/sunshine/files/patch-src_video.cpp10
-rw-r--r--multimedia/sunshine/pkg-descr10
-rw-r--r--multimedia/sunshine/pkg-install12
-rw-r--r--multimedia/sunshine/pkg-message25
-rw-r--r--multimedia/sunshine/pkg-plist98
-rw-r--r--pkglist4
-rw-r--r--x11-toolkits/Makefile5
-rw-r--r--x11-toolkits/scenefx05/Makefile35
-rw-r--r--x11-toolkits/scenefx05/distinfo3
-rw-r--r--x11-toolkits/scenefx05/pkg-descr9
-rw-r--r--x11-toolkits/scenefx05/pkg-plist9
-rw-r--r--x11-wm/Makefile5
-rw-r--r--x11-wm/mango/Makefile47
-rw-r--r--x11-wm/mango/distinfo3
-rw-r--r--x11-wm/mango/files/patch-meson.build30
-rw-r--r--x11-wm/mango/files/patch-src_mango.c14
-rw-r--r--x11-wm/mango/files/pkg-message.in36
-rw-r--r--x11-wm/mango/pkg-descr19
-rw-r--r--x11-wm/mango/pkg-plist37
-rw-r--r--x11/Makefile5
-rw-r--r--x11/i3bar-river/Makefile101
-rw-r--r--x11/i3bar-river/distinfo161
-rw-r--r--x11/i3bar-river/pkg-descr1
30 files changed, 873 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index d4d9f2d..5bb525b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
distfiles/
work/
*.pkg
+*.core
appjail/files/dotfiles/
appjail/files/pinentry-emacs
diff --git a/Makefile b/Makefile
index 78cb98f..5b1374e 100644
--- a/Makefile
+++ b/Makefile
@@ -2,6 +2,10 @@ COMMENT = Custom ports tree
SUBDIR += devel
SUBDIR += misc
+SUBDIR += multimedia
SUBDIR += security
+SUBDIR += x11
+SUBDIR += x11-wm
+SUBDIR += x11-toolkits
.include <bsd.port.subdir.mk>
diff --git a/multimedia/Makefile b/multimedia/Makefile
new file mode 100644
index 0000000..e60be27
--- /dev/null
+++ b/multimedia/Makefile
@@ -0,0 +1,5 @@
+COMMENT = Multimedia software
+
+SUBDIR += sunshine
+
+.include <bsd.port.subdir.mk>
diff --git a/multimedia/sunshine/Makefile b/multimedia/sunshine/Makefile
new file mode 100644
index 0000000..0eea409
--- /dev/null
+++ b/multimedia/sunshine/Makefile
@@ -0,0 +1,128 @@
+PORTNAME= sunshine
+DISTVERSIONPREFIX= v
+DISTVERSION= 2026.516.143833
+CATEGORIES= multimedia
+
+MAINTAINER= cashmere@autistici.org
+COMMENT= Self-hosted game stream host for Moonlight
+WWW= https://app.lizardbyte.dev/Sunshine
+
+LICENSE= GPLv3
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+# Prebuilt FFmpeg static libraries published by LizardByte/build-deps
+# (the same archive upstream's own FreeBSD package is linked against).
+# Sunshine's cmake requires libcbs.a, which no FreeBSD port provides,
+# so building against multimedia/ffmpeg is not an option.
+FFMPEG_BDEP_TAG= v2026.516.30821
+
+FETCH_DEPENDS= npm:www/npm
+BUILD_DEPENDS= npm:www/npm \
+ boost-libs>=0:devel/boost-libs \
+ glslc:graphics/shaderc \
+ wayland-scanner:graphics/wayland \
+ ${PYTHON_PKGNAMEPREFIX}Jinja2>=0:devel/py-Jinja2 \
+ ${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools \
+ ${LOCALBASE}/include/linux/input.h:devel/evdev-proto \
+ ${LOCALBASE}/include/vulkan/vulkan.h:graphics/vulkan-headers \
+ ${LOCALBASE}/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake:devel/nlohmann-json \
+ ${LOCALBASE}/share/pkgconfig/wayland-protocols.pc:graphics/wayland-protocols
+LIB_DEPENDS= libatk-1.0.so:accessibility/at-spi2-core \
+ libayatana-appindicator3.so:devel/libayatana-appindicator \
+ libayatana-ido3-0.4.so:devel/ayatana-ido \
+ libayatana-indicator3.so:devel/libayatana-indicator \
+ libcurl.so:ftp/curl \
+ libdbusmenu-glib.so:devel/libdbusmenu \
+ libdrm.so:graphics/libdrm \
+ libevdev.so:devel/libevdev \
+ libgbm.so:graphics/mesa-libs \
+ libharfbuzz.so:print/harfbuzz \
+ libicui18n.so:devel/icu \
+ libminiupnpc.so:net/miniupnpc \
+ libnotify.so:devel/libnotify \
+ libopus.so:audio/opus \
+ libpipewire-0.3.so:multimedia/pipewire \
+ libpulse.so:audio/pulseaudio \
+ libva.so:multimedia/libva \
+ libva-drm.so:multimedia/libva \
+ libva-x11.so:multimedia/libva \
+ libvulkan.so:graphics/vulkan-loader \
+ libwayland-client.so:graphics/wayland
+
+USES= cmake gnome pkgconfig python:build ssl xorg
+USE_GNOME= cairo gdkpixbuf glib20 gtk30 pango
+USE_XORG= ice sm x11 xcb xext xfixes xrandr xtst
+
+USE_GITHUB= yes
+GH_ACCOUNT= LizardByte
+GH_PROJECT= Sunshine
+GH_TUPLE= LizardByte-infrastructure:Simple-Web-Server:546895a93a29062bb178367b46c7afb72da9881e:sws/third-party/Simple-Web-Server \
+ moonlight-stream:moonlight-common-c:2600beaf13f18bfa43453609cf5e3b84a4227760:mlc/third-party/moonlight-common-c \
+ cgutman:enet:c7353c059373f8d3fc83d451f8f1a477be3dc94e:enet/third-party/moonlight-common-c/enet \
+ LizardByte:libdisplaydevice:fe7e6a81f65deae91594702e1a185f47229745b9:ldd/third-party/libdisplaydevice \
+ Dav1dde:glad:73db193f853e2ee079bf3ca8a64aa2eaf6459043:glad/third-party/glad \
+ games-on-whales:inputtino:f4ce2b0df536ef309e9ff318f75b460f7097d7c1:inputtino/third-party/inputtino \
+ sleepybishop:nanors:19f07b513e924e471cadd141943c1ec4adc8d0e0:nanors/third-party/nanors \
+ LizardByte:tray:563dee475f8878d252ab2b9938d3a014e776ed08:tray/third-party/tray \
+ LizardByte-infrastructure:wlr-protocols:bf4fc79abc359eea5a0edec0ac6d4a2b2955f82a:wlr/third-party/wlr-protocols \
+ KDE:plasma-wayland-protocols:4c015e90ae6c88f2ffa766e899387ef431eade49:pwp/third-party/plasma-wayland-protocols \
+ FFmpeg:nv-codec-headers:33a9ede8d9914299d9262539c576a15bd0a19621:nvch/third-party/nv-codec-headers
+
+MASTER_SITES+= https://github.com/LizardByte/build-deps/releases/download/${FFMPEG_BDEP_TAG}/:ffmpeg_bin
+DISTFILES+= FreeBSD-amd64-ffmpeg.tar.gz:ffmpeg_bin \
+ ${WEB_DEPS_TARBALL}
+
+INSTALLS_ICONS= yes
+
+# Node modules for the web UI, vendored in pre-fetch (the only phase with
+# network access under poudriere). files/patch-cmake_targets_common.cmake
+# drops the "npm ci" step from the build so the vendored copy is used as-is.
+WEB_DEPS_TARBALL= ${PORTNAME}-web-deps-${DISTVERSION}${EXTRACT_SUFX}
+WEB_UI_URL= https://raw.githubusercontent.com/${GH_ACCOUNT}/${GH_PROJECT}/${DISTVERSIONPREFIX}${DISTVERSION}
+
+CMAKE_ARGS= -DBUILD_DOCS=OFF \
+ -DBUILD_TESTS=OFF \
+ -DBUILD_WERROR=OFF \
+ -DFFMPEG_PREPARED_BINARIES=${WRKDIR}/ffmpeg \
+ -DGLAD_SKIP_PIP_INSTALL=ON \
+ -DOPUS_USE_STATIC=OFF \
+ -DPython_EXECUTABLE=${PYTHON_CMD} \
+ -DSUNSHINE_ASSETS_DIR=share/assets \
+ -DSUNSHINE_ENABLE_CUDA=OFF \
+ -DSUNSHINE_ENABLE_DRM=OFF \
+ -DSUNSHINE_ENABLE_KWIN=ON \
+ -DSUNSHINE_ENABLE_PORTAL=ON \
+ -DSUNSHINE_ENABLE_VAAPI=ON \
+ -DSUNSHINE_ENABLE_VULKAN=ON \
+ -DSUNSHINE_ENABLE_WAYLAND=ON \
+ -DSUNSHINE_ENABLE_X11=ON \
+ -DSUNSHINE_EXECUTABLE_PATH=${PREFIX}/bin/sunshine \
+ -DSUNSHINE_PUBLISHER_NAME=FreeBSD \
+ -DSUNSHINE_PUBLISHER_WEBSITE=https://app.lizardbyte.dev \
+ -DSUNSHINE_PUBLISHER_ISSUE_URL=https://app.lizardbyte.dev/support \
+ -DSUNSHINE_SYSTEM_VULKAN_HEADERS=ON \
+ -DSUNSHINE_SYSTEM_WAYLAND_PROTOCOLS=ON
+
+# Version is normally derived from git; the distfile is not a checkout.
+CONFIGURE_ENV= BRANCH=master \
+ BUILD_VERSION=${DISTVERSIONPREFIX}${DISTVERSION}
+
+pre-fetch:
+ @if ! [ -f ${DISTDIR}/${WEB_DEPS_TARBALL} ]; then ( \
+ ${RM} -rf ${WRKDIR}/web-deps && \
+ ${MKDIR} ${WRKDIR}/web-deps && \
+ cd ${WRKDIR}/web-deps && \
+ ${FETCH_CMD} -o package.json ${WEB_UI_URL}/package.json && \
+ ${FETCH_CMD} -o package-lock.json ${WEB_UI_URL}/package-lock.json && \
+ ${SETENV} HOME=${WRKDIR}/web-deps npm ci --ignore-scripts && \
+ ${FIND} node_modules -exec ${TOUCH} -h -d 1970-01-01T00:00:00Z {} \; && \
+ ${FIND} node_modules -print0 | ${SORT} -z | \
+ ${TAR} czf ${DISTDIR}/${WEB_DEPS_TARBALL} --format=bsdtar --gid 0 --uid 0 \
+ --options gzip:!timestamp --no-recursion --null -T - && \
+ ${RM} -rf ${WRKDIR}/web-deps \
+ ); fi
+
+post-extract:
+ @${MV} ${WRKDIR}/node_modules ${WRKSRC}/node_modules
+
+.include <bsd.port.mk>
diff --git a/multimedia/sunshine/distinfo b/multimedia/sunshine/distinfo
new file mode 100644
index 0000000..a811694
--- /dev/null
+++ b/multimedia/sunshine/distinfo
@@ -0,0 +1,29 @@
+TIMESTAMP = 1784755912
+SHA256 (FreeBSD-amd64-ffmpeg.tar.gz) = 2f1f1510ec121ac8e5aa5ee998bdefecfd09430536c1d5669e29fa2e878621a5
+SIZE (FreeBSD-amd64-ffmpeg.tar.gz) = 15033043
+SHA256 (sunshine-web-deps-2026.516.143833.tar.gz) = 87a3fc5ce8d55d0d965fd2948e1c22b7da4cbe6278d788f972fab4f19f223c0f
+SIZE (sunshine-web-deps-2026.516.143833.tar.gz) = 28793714
+SHA256 (LizardByte-Sunshine-v2026.516.143833_GH0.tar.gz) = d435babfd68ec0b1bcba74d861b11839c9226051c65bcde96e4aa133406c9ccb
+SIZE (LizardByte-Sunshine-v2026.516.143833_GH0.tar.gz) = 30150477
+SHA256 (LizardByte-infrastructure-Simple-Web-Server-546895a93a29062bb178367b46c7afb72da9881e_GH0.tar.gz) = de46eeceb87f6d8ff30a494ed9d3b915844a179b32067f8347ee854a07fd3c8c
+SIZE (LizardByte-infrastructure-Simple-Web-Server-546895a93a29062bb178367b46c7afb72da9881e_GH0.tar.gz) = 74751
+SHA256 (moonlight-stream-moonlight-common-c-2600beaf13f18bfa43453609cf5e3b84a4227760_GH0.tar.gz) = deb2b783af0c3bdb9fbc5e4b1f9804afe6a18752199b0f78193b479518060fc8
+SIZE (moonlight-stream-moonlight-common-c-2600beaf13f18bfa43453609cf5e3b84a4227760_GH0.tar.gz) = 267470
+SHA256 (cgutman-enet-c7353c059373f8d3fc83d451f8f1a477be3dc94e_GH0.tar.gz) = 8ca4d6f63f1f2969f49e2f141d9b52b29117f9ece06ea0d38972e00c4d714a94
+SIZE (cgutman-enet-c7353c059373f8d3fc83d451f8f1a477be3dc94e_GH0.tar.gz) = 87127
+SHA256 (LizardByte-libdisplaydevice-fe7e6a81f65deae91594702e1a185f47229745b9_GH0.tar.gz) = bef3f1f79d09b0e50af75c4b4ec6b83d0fe07f48f5b79c8336b3cec238eb6813
+SIZE (LizardByte-libdisplaydevice-fe7e6a81f65deae91594702e1a185f47229745b9_GH0.tar.gz) = 116379
+SHA256 (Dav1dde-glad-73db193f853e2ee079bf3ca8a64aa2eaf6459043_GH0.tar.gz) = 33dbeae44d8315ece57e14eba4b1b4a02ac5406d1c4f49cd20048c91522a6b9a
+SIZE (Dav1dde-glad-73db193f853e2ee079bf3ca8a64aa2eaf6459043_GH0.tar.gz) = 645779
+SHA256 (games-on-whales-inputtino-f4ce2b0df536ef309e9ff318f75b460f7097d7c1_GH0.tar.gz) = 05edf6a089f137ccbf069af482df0dca55507f60518d90612b606a1f2531c564
+SIZE (games-on-whales-inputtino-f4ce2b0df536ef309e9ff318f75b460f7097d7c1_GH0.tar.gz) = 105409
+SHA256 (sleepybishop-nanors-19f07b513e924e471cadd141943c1ec4adc8d0e0_GH0.tar.gz) = 2ece5782cd6ff87f74ebd0ffaf28b9256b498b6b3f5344aeb75b873c15eeb2dc
+SIZE (sleepybishop-nanors-19f07b513e924e471cadd141943c1ec4adc8d0e0_GH0.tar.gz) = 194695
+SHA256 (LizardByte-tray-563dee475f8878d252ab2b9938d3a014e776ed08_GH0.tar.gz) = 9e3cf37863861666b17c268165db952b8eede27f6e0fe07c784086bc235cdefb
+SIZE (LizardByte-tray-563dee475f8878d252ab2b9938d3a014e776ed08_GH0.tar.gz) = 1090338
+SHA256 (LizardByte-infrastructure-wlr-protocols-bf4fc79abc359eea5a0edec0ac6d4a2b2955f82a_GH0.tar.gz) = 9e0fd2be5ba7c84b81acdd086f84c2da2c2b5e4946a17bda3e9850c62e14057f
+SIZE (LizardByte-infrastructure-wlr-protocols-bf4fc79abc359eea5a0edec0ac6d4a2b2955f82a_GH0.tar.gz) = 23571
+SHA256 (KDE-plasma-wayland-protocols-4c015e90ae6c88f2ffa766e899387ef431eade49_GH0.tar.gz) = 7edee38bd9b538f9eaade4684a0ef2356aec5a473c9acdd10fcb97d2789d00e8
+SIZE (KDE-plasma-wayland-protocols-4c015e90ae6c88f2ffa766e899387ef431eade49_GH0.tar.gz) = 67394
+SHA256 (FFmpeg-nv-codec-headers-33a9ede8d9914299d9262539c576a15bd0a19621_GH0.tar.gz) = edea75e86115072797224a28d29b114009857b10e11e630f54ecb1909fe92a35
+SIZE (FFmpeg-nv-codec-headers-33a9ede8d9914299d9262539c576a15bd0a19621_GH0.tar.gz) = 83821
diff --git a/multimedia/sunshine/files/patch-cmake_targets_common.cmake b/multimedia/sunshine/files/patch-cmake_targets_common.cmake
new file mode 100644
index 0000000..d739eb4
--- /dev/null
+++ b/multimedia/sunshine/files/patch-cmake_targets_common.cmake
@@ -0,0 +1,16 @@
+The port vendors node_modules at fetch time (pre-fetch), so the "npm ci"
+step would fail without network access. Only run the actual web UI build.
+
+--- cmake/targets/common.cmake.orig
++++ cmake/targets/common.cmake
+@@ -54,8 +54,7 @@
+
+ add_custom_target(web-ui ALL
+ WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
+- COMMENT "Installing NPM Dependencies and Building the Web UI"
+- COMMAND "$<$<BOOL:${WIN32}>:cmd;/C>" "${NPM}" ci ${NPM_INSTALL_FLAGS}
+- COMMAND "${CMAKE_COMMAND}" -E env "SUNSHINE_BUILD_HOMEBREW=${NPM_BUILD_HOMEBREW}" "SUNSHINE_SOURCE_ASSETS_DIR=${NPM_SOURCE_ASSETS_DIR}" "SUNSHINE_ASSETS_DIR=${NPM_ASSETS_DIR}" "$<$<BOOL:${WIN32}>:cmd;/C>" "${NPM}" run build # cmake-lint: disable=C0301
++ COMMENT "Building the Web UI (npm dependencies are vendored by the port)"
++ COMMAND "${CMAKE_COMMAND}" -E env "SUNSHINE_BUILD_HOMEBREW=${NPM_BUILD_HOMEBREW}" "SUNSHINE_SOURCE_ASSETS_DIR=${NPM_SOURCE_ASSETS_DIR}" "SUNSHINE_ASSETS_DIR=${NPM_ASSETS_DIR}" "$<$<BOOL:${WIN32}>:cmd;/C>" "${NPM}" run build # cmake-lint: disable=C0301
+ COMMAND_EXPAND_LISTS
+ VERBATIM)
diff --git a/multimedia/sunshine/files/patch-src_platform_linux_wlgrab.cpp b/multimedia/sunshine/files/patch-src_platform_linux_wlgrab.cpp
new file mode 100644
index 0000000..a7349db
--- /dev/null
+++ b/multimedia/sunshine/files/patch-src_platform_linux_wlgrab.cpp
@@ -0,0 +1,11 @@
+--- src/platform/linux/wlgrab.cpp.orig
++++ src/platform/linux/wlgrab.cpp
+@@ -418,7 +418,7 @@
+ return nullptr;
+ }
+
+- if (hwdevice_type == platf::mem_type_e::vaapi || hwdevice_type == platf::mem_type_e::cuda) {
++ if (hwdevice_type == platf::mem_type_e::vaapi) {
+ auto wlr = std::make_shared<wl::wlr_vram_t>();
+ if (wlr->init(hwdevice_type, display_name, config)) {
+ return nullptr;
diff --git a/multimedia/sunshine/files/patch-src_video.cpp b/multimedia/sunshine/files/patch-src_video.cpp
new file mode 100644
index 0000000..e79e664
--- /dev/null
+++ b/multimedia/sunshine/files/patch-src_video.cpp
@@ -0,0 +1,10 @@
+--- src/video.cpp.orig
++++ src/video.cpp
+@@ -134,6 +134,7 @@
+ // Setup the input frame using the caller's img_t
+ sws_input_frame->data[0] = img.data;
+ sws_input_frame->linesize[0] = img.row_pitch;
++ if (!img.data) { return 0; }
+
+ // Perform color conversion and scaling to the final size
+ auto status = sws_scale_frame(sws.get(), requires_padding ? sws_output_frame.get() : sw_frame.get(), sws_input_frame.get());
diff --git a/multimedia/sunshine/pkg-descr b/multimedia/sunshine/pkg-descr
new file mode 100644
index 0000000..3f28cb5
--- /dev/null
+++ b/multimedia/sunshine/pkg-descr
@@ -0,0 +1,10 @@
+Sunshine is a self-hosted game stream host for Moonlight. It offers low
+latency game streaming with support for AMD, Intel, and NVIDIA GPUs for
+hardware encoding; software encoding is also available. You can connect
+to Sunshine from any Moonlight client on a variety of devices. A web UI
+is provided to allow configuration and client pairing from your favorite
+web browser.
+
+On FreeBSD, Sunshine supports X11 and Wayland (wlr-screencopy, KWin, and
+XDG portal/PipeWire) capture, VA-API and Vulkan video encoding, and
+virtual input via /dev/uinput.
diff --git a/multimedia/sunshine/pkg-install b/multimedia/sunshine/pkg-install
new file mode 100644
index 0000000..ae573d3
--- /dev/null
+++ b/multimedia/sunshine/pkg-install
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# The 'input' group is not registered in the ports tree's GIDs, so the
+# GROUPS framework cannot create it. Mirror what upstream's own FreeBSD
+# package does in its +POST_INSTALL script.
+
+if [ "$2" = "POST-INSTALL" ]; then
+ if ! /usr/sbin/pw groupshow input >/dev/null 2>&1; then
+ echo "Creating 'input' group for virtual input devices..."
+ /usr/sbin/pw groupadd input
+ fi
+fi
diff --git a/multimedia/sunshine/pkg-message b/multimedia/sunshine/pkg-message
new file mode 100644
index 0000000..b9b023e
--- /dev/null
+++ b/multimedia/sunshine/pkg-message
@@ -0,0 +1,25 @@
+[
+{ type: install
+ message: <<EOM
+
+Virtual input (keyboard, mouse, gamepads) requires your user to be in
+the 'input' group:
+
+ pw groupmod input -m <user>
+
+Log out and back in for the change to take effect. You may also want a
+devfs rule so /dev/uinput is accessible to the group, e.g. in
+/etc/devfs.rules:
+
+ [sunshine=47989]
+ add path 'uinput' mode 0660 group input
+
+Sunshine must run as the logged-in user inside the graphical session
+(Wayland or X11) -- start it from your compositor's autostart, not from
+rc.d.
+
+On first run, browse to https://<host>:47990 to create admin
+credentials, then pair each Moonlight client with the PIN flow.
+EOM
+}
+]
diff --git a/multimedia/sunshine/pkg-plist b/multimedia/sunshine/pkg-plist
new file mode 100644
index 0000000..2b2f7f5
--- /dev/null
+++ b/multimedia/sunshine/pkg-plist
@@ -0,0 +1,98 @@
+bin/sunshine
+share/applications/dev.lizardbyte.app.Sunshine.desktop
+share/applications/dev.lizardbyte.app.Sunshine.kwin.desktop
+share/applications/dev.lizardbyte.app.Sunshine.terminal.desktop
+share/assets/apps.json
+share/assets/box.png
+share/assets/desktop-alt.png
+share/assets/desktop.png
+share/assets/shaders/opengl/ConvertUV.frag
+share/assets/shaders/opengl/ConvertUV.vert
+share/assets/shaders/opengl/ConvertY.frag
+share/assets/shaders/opengl/Scene.frag
+share/assets/shaders/opengl/Scene.vert
+share/assets/shaders/vulkan/rgb2yuv.comp
+share/assets/steam.png
+share/assets/web/apps.html
+share/assets/web/assets/Checkbox-_zq52Lmd.js
+share/assets/web/assets/Navbar-e42_J4ze.js
+share/assets/web/assets/Navbar-vHSgVmbh.css
+share/assets/web/assets/Notification-CVXXWQML.css
+share/assets/web/assets/Notification-E6BjStlk.js
+share/assets/web/assets/ResourceCard-BdWfmJX4.js
+share/assets/web/assets/SimpleIcon-BGMhT-IK.js
+share/assets/web/assets/apps-By4QjfNI.js
+share/assets/web/assets/config-B_QFm8FU.css
+share/assets/web/assets/config-Ceh7-s-9.js
+share/assets/web/assets/createLucideIcon-BL5QWnkG.css
+share/assets/web/assets/createLucideIcon-mjjtyxlm.js
+share/assets/web/assets/css/sunshine.css
+share/assets/web/assets/download-30STmUeh.js
+share/assets/web/assets/featured-CUyJLtGo.js
+share/assets/web/assets/fetch_utils-9iXjNOiI.js
+share/assets/web/assets/file-text-DLPhJfqV.js
+share/assets/web/assets/gamepad-2-DxOHyImA.js
+share/assets/web/assets/index-k68q3BDp.js
+share/assets/web/assets/locale/bg.json
+share/assets/web/assets/locale/cs.json
+share/assets/web/assets/locale/de.json
+share/assets/web/assets/locale/en.json
+share/assets/web/assets/locale/en_GB.json
+share/assets/web/assets/locale/en_US.json
+share/assets/web/assets/locale/es.json
+share/assets/web/assets/locale/fr.json
+share/assets/web/assets/locale/hu.json
+share/assets/web/assets/locale/it.json
+share/assets/web/assets/locale/ja.json
+share/assets/web/assets/locale/ko.json
+share/assets/web/assets/locale/pl.json
+share/assets/web/assets/locale/pt.json
+share/assets/web/assets/locale/pt_BR.json
+share/assets/web/assets/locale/ru.json
+share/assets/web/assets/locale/sv.json
+share/assets/web/assets/locale/tr.json
+share/assets/web/assets/locale/uk.json
+share/assets/web/assets/locale/vi.json
+share/assets/web/assets/locale/zh.json
+share/assets/web/assets/locale/zh_TW.json
+share/assets/web/assets/logout-DiLZqZLO.js
+share/assets/web/assets/monitor-DGvs6yC0.js
+share/assets/web/assets/password-CHVIwd7n.js
+share/assets/web/assets/pin-DugfOfma.js
+share/assets/web/assets/rotate-ccw-DTIrC0O4.js
+share/assets/web/assets/save-DWz7vErV.js
+share/assets/web/assets/trash-2-YONst-Qs.js
+share/assets/web/assets/troubleshooting-D5oZ-p-S.js
+share/assets/web/assets/welcome-BuhUsvon.js
+share/assets/web/config.html
+share/assets/web/featured.html
+share/assets/web/images/logo-sunshine-16.png
+share/assets/web/images/logo-sunshine-45.png
+share/assets/web/images/sunshine-locked-16.png
+share/assets/web/images/sunshine-locked-45.png
+share/assets/web/images/sunshine-locked.ico
+share/assets/web/images/sunshine-locked.png
+share/assets/web/images/sunshine-locked.svg
+share/assets/web/images/sunshine-pausing-16.png
+share/assets/web/images/sunshine-pausing-45.png
+share/assets/web/images/sunshine-pausing.ico
+share/assets/web/images/sunshine-pausing.png
+share/assets/web/images/sunshine-pausing.svg
+share/assets/web/images/sunshine-playing-16.png
+share/assets/web/images/sunshine-playing-45.png
+share/assets/web/images/sunshine-playing.ico
+share/assets/web/images/sunshine-playing.png
+share/assets/web/images/sunshine-playing.svg
+share/assets/web/images/sunshine.ico
+share/assets/web/index.html
+share/assets/web/logout.html
+share/assets/web/password.html
+share/assets/web/pin.html
+share/assets/web/troubleshooting.html
+share/assets/web/welcome.html
+share/icons/hicolor/scalable/apps/dev.lizardbyte.app.Sunshine.svg
+share/icons/hicolor/scalable/status/dev.lizardbyte.app.Sunshine-locked.svg
+share/icons/hicolor/scalable/status/dev.lizardbyte.app.Sunshine-pausing.svg
+share/icons/hicolor/scalable/status/dev.lizardbyte.app.Sunshine-playing.svg
+share/icons/hicolor/scalable/status/dev.lizardbyte.app.Sunshine-tray.svg
+share/metainfo/dev.lizardbyte.app.Sunshine.metainfo.xml
diff --git a/pkglist b/pkglist
index 5a6defa..6e51cc5 100644
--- a/pkglist
+++ b/pkglist
@@ -8,4 +8,8 @@ devel/py-rassumfrassum
devel/pyrefly
devel/yaml-language-server
misc/kimi-code
+multimedia/sunshine
security/pinentry-emacs
+x11/i3bar-river
+x11-wm/mango
+x11-toolkits/scenefx05
diff --git a/x11-toolkits/Makefile b/x11-toolkits/Makefile
new file mode 100644
index 0000000..e1104cc
--- /dev/null
+++ b/x11-toolkits/Makefile
@@ -0,0 +1,5 @@
+COMMENT = X11 toolkits
+
+SUBDIR += scenefx05
+
+.include <bsd.port.subdir.mk>
diff --git a/x11-toolkits/scenefx05/Makefile b/x11-toolkits/scenefx05/Makefile
new file mode 100644
index 0000000..d9948ae
--- /dev/null
+++ b/x11-toolkits/scenefx05/Makefile
@@ -0,0 +1,35 @@
+PORTNAME= scenefx
+DISTVERSION= 0.5
+CATEGORIES= x11-toolkits
+PKGNAMESUFFIX= 05
+
+MAINTAINER= jbeich@FreeBSD.org
+COMMENT= wlroots scene API, but with eye candy!
+WWW= https://github.com/wlrfx/scenefx
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+BUILD_DEPENDS= wayland-protocols>=1.41:graphics/wayland-protocols
+LIB_DEPENDS= libdrm.so:graphics/libdrm \
+ libwayland-server.so:graphics/wayland \
+ libwlroots-0.20.so:x11-toolkits/wlroots020 \
+
+USES= compiler:c11 meson pkgconfig xorg
+USE_GITHUB= yes
+USE_LDCONFIG= yes
+USE_XORG= pixman
+GH_ACCOUNT= wlrfx
+MESON_ARGS= -Dexamples=false -Drenderers=${RENDERERS:ts,}
+PLIST_SUB= SUFFIX=-${DISTVERSION}
+
+
+OPTIONS_DEFINE= OPENGL
+OPTIONS_DEFAULT=OPENGL
+OPTIONS_SLAVE= OPENGL # XXX Remove after adding VULKAN
+
+OPENGL_USES= gl
+OPENGL_USE= GL=egl,gbm,glesv2
+OPENGL_VARS= RENDERERS+=gles2
+
+.include <bsd.port.mk>
diff --git a/x11-toolkits/scenefx05/distinfo b/x11-toolkits/scenefx05/distinfo
new file mode 100644
index 0000000..42aa027
--- /dev/null
+++ b/x11-toolkits/scenefx05/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1784922707
+SHA256 (wlrfx-scenefx-0.5_GH0.tar.gz) = 0fa8ecca0e310f813efd052624c5ed7d9153d6a0fdead5cc957d34c07f9a86c6
+SIZE (wlrfx-scenefx-0.5_GH0.tar.gz) = 109708
diff --git a/x11-toolkits/scenefx05/pkg-descr b/x11-toolkits/scenefx05/pkg-descr
new file mode 100644
index 0000000..bde5f7a
--- /dev/null
+++ b/x11-toolkits/scenefx05/pkg-descr
@@ -0,0 +1,9 @@
+wlroots is the de-facto library for building wayland compositors, and
+its scene api is a great stride in simplifying wayland compositor
+development. The problem with the scene api (for compositors looking
+for eye candy), however, is that it forces you to use the wlr
+renderer, which is powerful yet simple. SceneFX is a project that
+takes the scene api and replaces the wlr renderer with our own fx
+renderer, capable of rendering surfaces with eye-candy effects
+including blur, shadows, and rounded corners, while maintaining the
+benefits of simplicity gained from using the scene api.
diff --git a/x11-toolkits/scenefx05/pkg-plist b/x11-toolkits/scenefx05/pkg-plist
new file mode 100644
index 0000000..34af085
--- /dev/null
+++ b/x11-toolkits/scenefx05/pkg-plist
@@ -0,0 +1,9 @@
+include/scenefx-0.5/scenefx/render/fx_renderer/fx_offscreen_buffers.h
+include/scenefx-0.5/scenefx/render/fx_renderer/fx_renderer.h
+include/scenefx-0.5/scenefx/render/pass.h
+include/scenefx-0.5/scenefx/types/fx/blur_data.h
+include/scenefx-0.5/scenefx/types/fx/clipped_region.h
+include/scenefx-0.5/scenefx/types/linked_node.h
+include/scenefx-0.5/scenefx/types/wlr_scene.h
+lib/libscenefx-0.5.so
+libdata/pkgconfig/scenefx-0.5.pc
diff --git a/x11-wm/Makefile b/x11-wm/Makefile
new file mode 100644
index 0000000..e8ebc0d
--- /dev/null
+++ b/x11-wm/Makefile
@@ -0,0 +1,5 @@
+COMMENT = X11 window managers
+
+SUBDIR += mango
+
+.include <bsd.port.subdir.mk>
diff --git a/x11-wm/mango/Makefile b/x11-wm/mango/Makefile
new file mode 100644
index 0000000..cb9359a
--- /dev/null
+++ b/x11-wm/mango/Makefile
@@ -0,0 +1,47 @@
+PORTNAME= mango
+DISTVERSION= 0.15.4
+
+CATEGORIES= x11-wm
+
+MAINTAINER= nivit@FreeBSD.org
+COMMENT= Lightweight, high-performance Wayland compositor built on dwl
+WWW= https://mangowm.github.io/
+
+LICENSE= GPLv3
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+BUILD_DEPENDS= hwdata>=0.399:misc/hwdata \
+ wayland-protocols>=1.24:graphics/wayland-protocols
+LIB_DEPENDS= libcjson.so:devel/libcjson \
+ libinput.so:x11/libinput \
+ libpcre2-8.so:devel/pcre2 \
+ libpixman-1.so:x11/pixman \
+ libscenefx-0.5.so:x11-toolkits/scenefx05 \
+ libwlroots-0.20.so:x11-toolkits/wlroots020 \
+ libxcb-icccm.so:x11/xcb-util-wm \
+ libxkbcommon.so:x11/libxkbcommon \
+ libwayland-server.so:graphics/wayland
+
+RUN_DEPENDS= hwdata>=0.399:misc/hwdata \
+ Xwayland:x11-servers/xwayland
+
+USES= meson pkgconfig
+
+USE_GITHUB= yes
+GH_ACCOUNT= mangowm
+
+MESON_ARGS= -Dsysconfdir=${PREFIX}/etc
+
+SUB_FILES= pkg-message
+
+OPTIONS_DEFINE= DOCS
+
+post-patch:
+ @${REINPLACE_CMD} -E -e "s|(assets/(config.conf))|\1', rename : '\2.sample|1" \
+ ${WRKSRC}/meson.build
+
+post-install-DOCS-on:
+ ${MKDIR} ${STAGEDIR}${DOCSDIR}
+ (cd ${WRKSRC}/docs && ${COPYTREE_SHARE} . ${STAGEDIR}${DOCSDIR})
+
+.include <bsd.port.mk>
diff --git a/x11-wm/mango/distinfo b/x11-wm/mango/distinfo
new file mode 100644
index 0000000..cecb731
--- /dev/null
+++ b/x11-wm/mango/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1784922544
+SHA256 (mangowm-mango-0.15.4_GH0.tar.gz) = 50d075e59e6dd9a4baa3eaf80985fc246d5bc1caad0de85911d567df8b2dc1ba
+SIZE (mangowm-mango-0.15.4_GH0.tar.gz) = 499975
diff --git a/x11-wm/mango/files/patch-meson.build b/x11-wm/mango/files/patch-meson.build
new file mode 100644
index 0000000..5fc5a00
--- /dev/null
+++ b/x11-wm/mango/files/patch-meson.build
@@ -0,0 +1,30 @@
+--- meson.build.orig 2026-05-29 13:04:35 UTC
++++ meson.build
+@@ -12,12 +12,16 @@ endif
+ endif
+ endif
+
++osname = build_machine.system()
++
+ prefix = get_option('prefix')
+ sysconfdir = get_option('sysconfdir')
+
+ # 如果 sysconfdir 以 prefix 开头,去掉 prefix
+-if sysconfdir.startswith(prefix) and not is_nixos
+- sysconfdir = sysconfdir.substring(prefix.length())
++if sysconfdir.startswith(prefix) and not is_nixos and osname != 'freebsd'
++ sysconfdir = sysconfdir.replace(prefix, '')
+ # 确保 sysconfdir 是绝对路径
+ if not sysconfdir.startswith('/')
+ sysconfdir = '/' + sysconfdir
+@@ -72,9 +76,8 @@ c_args = [
+ '-g',
+ '-Wno-unused-function',
+ '-DWLR_USE_UNSTABLE',
+- '-D_POSIX_C_SOURCE=200809L',
+ '-DVERSION="@0@"'.format(version_with_hash),
+- '-DSYSCONFDIR="@0@"'.format('/etc'),
++ '-DSYSCONFDIR="@0@"'.format(sysconfdir),
+ ]
+
+ # 仅在 debug 选项启用时添加调试参数
diff --git a/x11-wm/mango/files/patch-src_mango.c b/x11-wm/mango/files/patch-src_mango.c
new file mode 100644
index 0000000..140092f
--- /dev/null
+++ b/x11-wm/mango/files/patch-src_mango.c
@@ -0,0 +1,14 @@
+--- src/mango.c.orig 2026-05-29 13:04:35 UTC
++++ src/mango.c
+@@ -7,7 +7,11 @@
+ #include <getopt.h>
+ #include <libinput.h>
+ #include <limits.h>
++#ifdef __FreeBSD__
++#include <dev/evdev/input-event-codes.h>
++#else
+ #include <linux/input-event-codes.h>
++#endif
+ #include <scenefx/render/fx_renderer/fx_renderer.h>
+ #include <scenefx/types/fx/blur_data.h>
+ #include <scenefx/types/fx/clipped_region.h>
diff --git a/x11-wm/mango/files/pkg-message.in b/x11-wm/mango/files/pkg-message.in
new file mode 100644
index 0000000..07378ce
--- /dev/null
+++ b/x11-wm/mango/files/pkg-message.in
@@ -0,0 +1,36 @@
+[
+{ type: install
+ message: <<EOM
+Before using Mango run the following commands as user:
+
+ mkdir -p ~/.config/mango
+ cp %%PREFIX%%/etc/mango/config.conf ~/.config/mango/
+
+then customize that file, in particular the variable
+
+ xkb_rules_layout
+
+and the keyboard shortcut to launch a terminal
+
+ bind=Alt,Return,spawn,foot
+
+(replace foot with your preferred terminal emulator).
+EOM
+}
+{ type: upgrade
+ maximum_version: "0.14.0"
+ message: <<EOM
+ Version 0.14.0 of Mango has some breaking changes:
+
+ - IPC Protocol Upgrade: The old dwl IPC protocol is now deprecated and will
+ be removed in the next version.
+ - Socket Restructuring: mmsg(1) now restricts the use of independent sockets.
+ This structural change delivers a more powerful, concise, and reliable
+ syntax, allowing you to seamlessly retrieve data for all clients, tags,
+ monitors, and messages.
+
+ As a result, you must adapt any script that uses the mmsg(1) command to
+ the new syntax.
+EOM
+}
+]
diff --git a/x11-wm/mango/pkg-descr b/x11-wm/mango/pkg-descr
new file mode 100644
index 0000000..fae3842
--- /dev/null
+++ b/x11-wm/mango/pkg-descr
@@ -0,0 +1,19 @@
+Mango is a modern, lightweight, high-performance Wayland compositor built on
+dwl - crafted for speed, flexibility, and a customizable desktop experience.
+
+Feature Highlights
+
+ - Excellent xwayland support
+ - Base tags not workspaces (supports separate window layouts for each tag)
+ - Smooth and customizable complete animations (window open/move/close, tag
+ enter/leave,layer open/close/move)
+ - Excellent input method support (text input v2/v3)
+ - Flexible window layouts with easy switching (scroller, master-stack,
+ monocle,center-master, etc.)
+ - Rich window states (swallow, minimize, maximize, unglobal, global,
+ fakefullscreen, overlay, etc.)
+ - Simple yet powerful external configuration (support shortcuts hot-reload)
+ - Sway-like scratchpad and named scratchpad
+ - Ipc support (get/send message from/to compositor by external program)
+ - Hycov-like overview
+ - Window effects from scenefx (blur, shadow, corner radius, opacity)
diff --git a/x11-wm/mango/pkg-plist b/x11-wm/mango/pkg-plist
new file mode 100644
index 0000000..4a2609f
--- /dev/null
+++ b/x11-wm/mango/pkg-plist
@@ -0,0 +1,37 @@
+bin/mango
+bin/mmsg
+%%ETCDIR%%/config.conf.sample
+%%PORTDOCS%%%%DOCSDIR%%/bindings/index.mdx
+%%PORTDOCS%%%%DOCSDIR%%/bindings/keys.md
+%%PORTDOCS%%%%DOCSDIR%%/bindings/meta.json
+%%PORTDOCS%%%%DOCSDIR%%/bindings/mouse-gestures.md
+%%PORTDOCS%%%%DOCSDIR%%/configuration/basics.md
+%%PORTDOCS%%%%DOCSDIR%%/configuration/index.mdx
+%%PORTDOCS%%%%DOCSDIR%%/configuration/input.md
+%%PORTDOCS%%%%DOCSDIR%%/configuration/meta.json
+%%PORTDOCS%%%%DOCSDIR%%/configuration/miscellaneous.md
+%%PORTDOCS%%%%DOCSDIR%%/configuration/monitors.md
+%%PORTDOCS%%%%DOCSDIR%%/configuration/xdg-portals.md
+%%PORTDOCS%%%%DOCSDIR%%/faq.md
+%%PORTDOCS%%%%DOCSDIR%%/index.md
+%%PORTDOCS%%%%DOCSDIR%%/installation.md
+%%PORTDOCS%%%%DOCSDIR%%/ipc.md
+%%PORTDOCS%%%%DOCSDIR%%/meta.json
+%%PORTDOCS%%%%DOCSDIR%%/nix-options.md
+%%PORTDOCS%%%%DOCSDIR%%/quick-start.md
+%%PORTDOCS%%%%DOCSDIR%%/screenshot.md
+%%PORTDOCS%%%%DOCSDIR%%/visuals/animations.md
+%%PORTDOCS%%%%DOCSDIR%%/visuals/effects.md
+%%PORTDOCS%%%%DOCSDIR%%/visuals/index.mdx
+%%PORTDOCS%%%%DOCSDIR%%/visuals/meta.json
+%%PORTDOCS%%%%DOCSDIR%%/visuals/status-bar.md
+%%PORTDOCS%%%%DOCSDIR%%/visuals/theming.md
+%%PORTDOCS%%%%DOCSDIR%%/window-management/index.mdx
+%%PORTDOCS%%%%DOCSDIR%%/window-management/layouts.md
+%%PORTDOCS%%%%DOCSDIR%%/window-management/meta.json
+%%PORTDOCS%%%%DOCSDIR%%/window-management/overview.md
+%%PORTDOCS%%%%DOCSDIR%%/window-management/rules.md
+%%PORTDOCS%%%%DOCSDIR%%/window-management/scratchpad.md
+share/man/man1/mmsg.1.gz
+share/wayland-sessions/mango.desktop
+share/xdg-desktop-portal/mango-portals.conf
diff --git a/x11/Makefile b/x11/Makefile
new file mode 100644
index 0000000..dbc036b
--- /dev/null
+++ b/x11/Makefile
@@ -0,0 +1,5 @@
+COMMENT = X11 programs and utilities
+
+SUBDIR += i3bar-river
+
+.include <bsd.port.subdir.mk>
diff --git a/x11/i3bar-river/Makefile b/x11/i3bar-river/Makefile
new file mode 100644
index 0000000..f88dcec
--- /dev/null
+++ b/x11/i3bar-river/Makefile
@@ -0,0 +1,101 @@
+PORTNAME= i3bar-river
+DISTVERSION= 1.1.0
+CATEGORIES= x11
+MASTER_SITES= #
+DISTFILES= ${DISTNAME}${EXTRACT_SUFX}
+
+MAINTAINER= cashmere@autistici.org
+COMMENT= Port of i3bar for wlroots compositors, mango fork
+WWW= https://github.com/MaxVerevkin/i3bar-river
+
+LICENSE= GPLv3
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+LIB_DEPENDS= libcairo.so:graphics/cairo \
+ libpango-1.0.so:x11-toolkits/pango
+
+USES= cargo pkgconfig
+
+CARGO_CRATES= anstyle-1.0.10 \
+ anyhow-1.0.98 \
+ autocfg-1.4.0 \
+ bitflags-2.9.1 \
+ cairo-rs-0.20.10 \
+ cairo-sys-rs-0.20.10 \
+ cfg-expr-0.17.2 \
+ clap-4.5.38 \
+ clap_builder-4.5.38 \
+ clap_derive-4.5.32 \
+ clap_lex-0.7.4 \
+ equivalent-1.0.2 \
+ futures-channel-0.3.31 \
+ futures-core-0.3.31 \
+ futures-executor-0.3.31 \
+ futures-io-0.3.31 \
+ futures-macro-0.3.31 \
+ futures-task-0.3.31 \
+ futures-util-0.3.31 \
+ gio-0.20.10 \
+ gio-sys-0.20.10 \
+ glib-0.20.10 \
+ glib-macros-0.20.10 \
+ glib-sys-0.20.10 \
+ gobject-sys-0.20.10 \
+ hashbrown-0.15.3 \
+ heck-0.5.0 \
+ indexmap-2.9.0 \
+ itoa-1.0.15 \
+ libc-0.2.172 \
+ memchr-2.7.4 \
+ memmap2-0.9.5 \
+ pango-0.20.10 \
+ pango-sys-0.20.10 \
+ pangocairo-0.20.10 \
+ pangocairo-sys-0.20.10 \
+ pin-project-lite-0.2.16 \
+ pin-utils-0.1.0 \
+ pkg-config-0.3.32 \
+ proc-macro-crate-3.3.0 \
+ proc-macro2-1.0.95 \
+ quick-xml-0.37.5 \
+ quote-1.0.40 \
+ ryu-1.0.20 \
+ serde-1.0.219 \
+ serde_derive-1.0.219 \
+ serde_json-1.0.140 \
+ serde_spanned-0.6.8 \
+ shmemfdrs2-1.0.0 \
+ signal-hook-0.3.18 \
+ signal-hook-registry-1.4.5 \
+ slab-0.4.9 \
+ smallvec-1.15.0 \
+ syn-2.0.101 \
+ system-deps-7.0.3 \
+ target-lexicon-0.12.16 \
+ toml-0.8.22 \
+ toml_datetime-0.6.9 \
+ toml_edit-0.22.26 \
+ unicode-ident-1.0.18 \
+ version-compare-0.2.0 \
+ wayrs-client-1.3.0 \
+ wayrs-core-1.0.4 \
+ wayrs-proto-parser-3.0.1 \
+ wayrs-protocols-0.14.9+1.43 \
+ wayrs-scanner-0.15.4 \
+ wayrs-utils-0.17.1 \
+ windows-sys-0.59.0 \
+ windows-targets-0.52.6 \
+ windows_aarch64_gnullvm-0.52.6 \
+ windows_aarch64_msvc-0.52.6 \
+ windows_i686_gnu-0.52.6 \
+ windows_i686_gnullvm-0.52.6 \
+ windows_i686_msvc-0.52.6 \
+ windows_x86_64_gnu-0.52.6 \
+ windows_x86_64_gnullvm-0.52.6 \
+ windows_x86_64_msvc-0.52.6 \
+ winnow-0.7.10 \
+ xcursor-0.3.8
+
+PLIST_FILES= bin/i3bar-river
+
+.include <bsd.port.mk>
diff --git a/x11/i3bar-river/distinfo b/x11/i3bar-river/distinfo
new file mode 100644
index 0000000..4c8316f
--- /dev/null
+++ b/x11/i3bar-river/distinfo
@@ -0,0 +1,161 @@
+TIMESTAMP = 1784920280
+SHA256 (i3bar-river-1.1.0.tar.gz) = fe8b358927ba5d537cbf165827c0add322e7fa1ca4ee34630c4e97b0c4ca9586
+SIZE (i3bar-river-1.1.0.tar.gz) = 52864
+SHA256 (rust/crates/anstyle-1.0.10.crate) = 55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9
+SIZE (rust/crates/anstyle-1.0.10.crate) = 15725
+SHA256 (rust/crates/anyhow-1.0.98.crate) = e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487
+SIZE (rust/crates/anyhow-1.0.98.crate) = 53334
+SHA256 (rust/crates/autocfg-1.4.0.crate) = ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26
+SIZE (rust/crates/autocfg-1.4.0.crate) = 17712
+SHA256 (rust/crates/bitflags-2.9.1.crate) = 1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967
+SIZE (rust/crates/bitflags-2.9.1.crate) = 47913
+SHA256 (rust/crates/cairo-rs-0.20.10.crate) = b58e62a27cd02fb3f63f82bb31fdda7e6c43141497cbe97e8816d7c914043f55
+SIZE (rust/crates/cairo-rs-0.20.10.crate) = 57584
+SHA256 (rust/crates/cairo-sys-rs-0.20.10.crate) = 059cc746549898cbfd9a47754288e5a958756650ef4652bbb6c5f71a6bda4f8b
+SIZE (rust/crates/cairo-sys-rs-0.20.10.crate) = 14424
+SHA256 (rust/crates/cfg-expr-0.17.2.crate) = 8d4ba6e40bd1184518716a6e1a781bf9160e286d219ccdb8ab2612e74cfe4789
+SIZE (rust/crates/cfg-expr-0.17.2.crate) = 44034
+SHA256 (rust/crates/clap-4.5.38.crate) = ed93b9805f8ba930df42c2590f05453d5ec36cbb85d018868a5b24d31f6ac000
+SIZE (rust/crates/clap-4.5.38.crate) = 57140
+SHA256 (rust/crates/clap_builder-4.5.38.crate) = 379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120
+SIZE (rust/crates/clap_builder-4.5.38.crate) = 169177
+SHA256 (rust/crates/clap_derive-4.5.32.crate) = 09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7
+SIZE (rust/crates/clap_derive-4.5.32.crate) = 33441
+SHA256 (rust/crates/clap_lex-0.7.4.crate) = f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6
+SIZE (rust/crates/clap_lex-0.7.4.crate) = 12858
+SHA256 (rust/crates/equivalent-1.0.2.crate) = 877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f
+SIZE (rust/crates/equivalent-1.0.2.crate) = 7419
+SHA256 (rust/crates/futures-channel-0.3.31.crate) = 2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10
+SIZE (rust/crates/futures-channel-0.3.31.crate) = 31971
+SHA256 (rust/crates/futures-core-0.3.31.crate) = 05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e
+SIZE (rust/crates/futures-core-0.3.31.crate) = 14318
+SHA256 (rust/crates/futures-executor-0.3.31.crate) = 1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f
+SIZE (rust/crates/futures-executor-0.3.31.crate) = 17965
+SHA256 (rust/crates/futures-io-0.3.31.crate) = 9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6
+SIZE (rust/crates/futures-io-0.3.31.crate) = 9047
+SHA256 (rust/crates/futures-macro-0.3.31.crate) = 162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650
+SIZE (rust/crates/futures-macro-0.3.31.crate) = 11341
+SHA256 (rust/crates/futures-task-0.3.31.crate) = f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988
+SIZE (rust/crates/futures-task-0.3.31.crate) = 11217
+SHA256 (rust/crates/futures-util-0.3.31.crate) = 9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81
+SIZE (rust/crates/futures-util-0.3.31.crate) = 162124
+SHA256 (rust/crates/gio-0.20.10.crate) = ab2a654c887546d14fdb214cc04641cd30450c9b4fa4525fd989d25fd5a5561e
+SIZE (rust/crates/gio-0.20.10.crate) = 221061
+SHA256 (rust/crates/gio-sys-0.20.10.crate) = 521e93a7e56fc89e84aea9a52cfc9436816a4b363b030260b699950ff1336c83
+SIZE (rust/crates/gio-sys-0.20.10.crate) = 86258
+SHA256 (rust/crates/glib-0.20.10.crate) = c501c495842c2b23cdacead803a5a343ca2a5d7a7ddaff14cc5f6cf22cfb92c2
+SIZE (rust/crates/glib-0.20.10.crate) = 293754
+SHA256 (rust/crates/glib-macros-0.20.10.crate) = ebe6dc9ce29887c4b3b74d78d5ba473db160a258ae7ed883d23632ac7fed7bc9
+SIZE (rust/crates/glib-macros-0.20.10.crate) = 76345
+SHA256 (rust/crates/glib-sys-0.20.10.crate) = 8ab79e1ed126803a8fb827e3de0e2ff95191912b8db65cee467edb56fc4cc215
+SIZE (rust/crates/glib-sys-0.20.10.crate) = 67282
+SHA256 (rust/crates/gobject-sys-0.20.10.crate) = ec9aca94bb73989e3cfdbf8f2e0f1f6da04db4d291c431f444838925c4c63eda
+SIZE (rust/crates/gobject-sys-0.20.10.crate) = 22623
+SHA256 (rust/crates/hashbrown-0.15.3.crate) = 84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3
+SIZE (rust/crates/hashbrown-0.15.3.crate) = 140413
+SHA256 (rust/crates/heck-0.5.0.crate) = 2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea
+SIZE (rust/crates/heck-0.5.0.crate) = 11517
+SHA256 (rust/crates/indexmap-2.9.0.crate) = cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e
+SIZE (rust/crates/indexmap-2.9.0.crate) = 91214
+SHA256 (rust/crates/itoa-1.0.15.crate) = 4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c
+SIZE (rust/crates/itoa-1.0.15.crate) = 11231
+SHA256 (rust/crates/libc-0.2.172.crate) = d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa
+SIZE (rust/crates/libc-0.2.172.crate) = 791646
+SHA256 (rust/crates/memchr-2.7.4.crate) = 78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3
+SIZE (rust/crates/memchr-2.7.4.crate) = 96670
+SHA256 (rust/crates/memmap2-0.9.5.crate) = fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f
+SIZE (rust/crates/memmap2-0.9.5.crate) = 33280
+SHA256 (rust/crates/pango-0.20.10.crate) = d88d37c161f2848f0d9382597f0168484c9335ac800995f3956641abb7002938
+SIZE (rust/crates/pango-0.20.10.crate) = 49735
+SHA256 (rust/crates/pango-sys-0.20.10.crate) = 186909673fc09be354555c302c0b3dcf753cd9fa08dcb8077fa663c80fb243fa
+SIZE (rust/crates/pango-sys-0.20.10.crate) = 28457
+SHA256 (rust/crates/pangocairo-0.20.10.crate) = 58890dc451db9964ac2d8874f903a4370a4b3932aa5281ff0c8d9810937ad84f
+SIZE (rust/crates/pangocairo-0.20.10.crate) = 9465
+SHA256 (rust/crates/pangocairo-sys-0.20.10.crate) = b9952903f88aa93e2927e7bca2d1ebae64fc26545a9280b4ce6bddeda26b5c42
+SIZE (rust/crates/pangocairo-sys-0.20.10.crate) = 6667
+SHA256 (rust/crates/pin-project-lite-0.2.16.crate) = 3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b
+SIZE (rust/crates/pin-project-lite-0.2.16.crate) = 30504
+SHA256 (rust/crates/pin-utils-0.1.0.crate) = 8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184
+SIZE (rust/crates/pin-utils-0.1.0.crate) = 7580
+SHA256 (rust/crates/pkg-config-0.3.32.crate) = 7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c
+SIZE (rust/crates/pkg-config-0.3.32.crate) = 21370
+SHA256 (rust/crates/proc-macro-crate-3.3.0.crate) = edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35
+SIZE (rust/crates/proc-macro-crate-3.3.0.crate) = 12432
+SHA256 (rust/crates/proc-macro2-1.0.95.crate) = 02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778
+SIZE (rust/crates/proc-macro2-1.0.95.crate) = 51820
+SHA256 (rust/crates/quick-xml-0.37.5.crate) = 331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb
+SIZE (rust/crates/quick-xml-0.37.5.crate) = 190481
+SHA256 (rust/crates/quote-1.0.40.crate) = 1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d
+SIZE (rust/crates/quote-1.0.40.crate) = 31063
+SHA256 (rust/crates/ryu-1.0.20.crate) = 28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f
+SIZE (rust/crates/ryu-1.0.20.crate) = 48738
+SHA256 (rust/crates/serde-1.0.219.crate) = 5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6
+SIZE (rust/crates/serde-1.0.219.crate) = 78983
+SHA256 (rust/crates/serde_derive-1.0.219.crate) = 5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00
+SIZE (rust/crates/serde_derive-1.0.219.crate) = 57798
+SHA256 (rust/crates/serde_json-1.0.140.crate) = 20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373
+SIZE (rust/crates/serde_json-1.0.140.crate) = 154852
+SHA256 (rust/crates/serde_spanned-0.6.8.crate) = 87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1
+SIZE (rust/crates/serde_spanned-0.6.8.crate) = 9330
+SHA256 (rust/crates/shmemfdrs2-1.0.0.crate) = 70a05cf957f811e44f99c629e6d34025429912ffb2333f2960372669e670f54c
+SIZE (rust/crates/shmemfdrs2-1.0.0.crate) = 7919
+SHA256 (rust/crates/signal-hook-0.3.18.crate) = d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2
+SIZE (rust/crates/signal-hook-0.3.18.crate) = 50862
+SHA256 (rust/crates/signal-hook-registry-1.4.5.crate) = 9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410
+SIZE (rust/crates/signal-hook-registry-1.4.5.crate) = 19004
+SHA256 (rust/crates/slab-0.4.9.crate) = 8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67
+SIZE (rust/crates/slab-0.4.9.crate) = 17108
+SHA256 (rust/crates/smallvec-1.15.0.crate) = 8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9
+SIZE (rust/crates/smallvec-1.15.0.crate) = 38113
+SHA256 (rust/crates/syn-2.0.101.crate) = 8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf
+SIZE (rust/crates/syn-2.0.101.crate) = 299250
+SHA256 (rust/crates/system-deps-7.0.3.crate) = 66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005
+SIZE (rust/crates/system-deps-7.0.3.crate) = 26313
+SHA256 (rust/crates/target-lexicon-0.12.16.crate) = 61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1
+SIZE (rust/crates/target-lexicon-0.12.16.crate) = 26488
+SHA256 (rust/crates/toml-0.8.22.crate) = 05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae
+SIZE (rust/crates/toml-0.8.22.crate) = 76224
+SHA256 (rust/crates/toml_datetime-0.6.9.crate) = 3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3
+SIZE (rust/crates/toml_datetime-0.6.9.crate) = 12622
+SHA256 (rust/crates/toml_edit-0.22.26.crate) = 310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e
+SIZE (rust/crates/toml_edit-0.22.26.crate) = 121714
+SHA256 (rust/crates/unicode-ident-1.0.18.crate) = 5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512
+SIZE (rust/crates/unicode-ident-1.0.18.crate) = 47743
+SHA256 (rust/crates/version-compare-0.2.0.crate) = 852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b
+SIZE (rust/crates/version-compare-0.2.0.crate) = 13942
+SHA256 (rust/crates/wayrs-client-1.3.0.crate) = 05f83967f2f1eb62adac1a6eb5914b4bf21ce7b5287cc26620197f6eaee1f704
+SIZE (rust/crates/wayrs-client-1.3.0.crate) = 51722
+SHA256 (rust/crates/wayrs-core-1.0.4.crate) = b6a2e30dd453ac7005dba842dba3d61cd567e86c2a818770f093d70c8c7bc5c9
+SIZE (rust/crates/wayrs-core-1.0.4.crate) = 9456
+SHA256 (rust/crates/wayrs-proto-parser-3.0.1.crate) = 41679c033d8ad15f8d9bbb73e50bb4ded3d4b12b8ba2123e5c526ed809b2e43c
+SIZE (rust/crates/wayrs-proto-parser-3.0.1.crate) = 5856
+SHA256 (rust/crates/wayrs-protocols-0.14.9+1.43.crate) = 12d945447c7f7996e681022d1792e7e1fc751d2e7e16dcf1de93c55dbf455225
+SIZE (rust/crates/wayrs-protocols-0.14.9+1.43.crate) = 216661
+SHA256 (rust/crates/wayrs-scanner-0.15.4.crate) = 16b2f7c560a8d7cbca6af14443be51fb386acd02a558724c85dac8c7bf368d28
+SIZE (rust/crates/wayrs-scanner-0.15.4.crate) = 11005
+SHA256 (rust/crates/wayrs-utils-0.17.1.crate) = f1f13c8fddab7c554a3e4c680dbb6a117e81eeabe7f0eba37bf02d74b2bb6b0f
+SIZE (rust/crates/wayrs-utils-0.17.1.crate) = 15195
+SHA256 (rust/crates/windows-sys-0.59.0.crate) = 1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b
+SIZE (rust/crates/windows-sys-0.59.0.crate) = 2387323
+SHA256 (rust/crates/windows-targets-0.52.6.crate) = 9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973
+SIZE (rust/crates/windows-targets-0.52.6.crate) = 6403
+SHA256 (rust/crates/windows_aarch64_gnullvm-0.52.6.crate) = 32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3
+SIZE (rust/crates/windows_aarch64_gnullvm-0.52.6.crate) = 435718
+SHA256 (rust/crates/windows_aarch64_msvc-0.52.6.crate) = 09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469
+SIZE (rust/crates/windows_aarch64_msvc-0.52.6.crate) = 832615
+SHA256 (rust/crates/windows_i686_gnu-0.52.6.crate) = 8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b
+SIZE (rust/crates/windows_i686_gnu-0.52.6.crate) = 880402
+SHA256 (rust/crates/windows_i686_gnullvm-0.52.6.crate) = 0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66
+SIZE (rust/crates/windows_i686_gnullvm-0.52.6.crate) = 475940
+SHA256 (rust/crates/windows_i686_msvc-0.52.6.crate) = 240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66
+SIZE (rust/crates/windows_i686_msvc-0.52.6.crate) = 901163
+SHA256 (rust/crates/windows_x86_64_gnu-0.52.6.crate) = 147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78
+SIZE (rust/crates/windows_x86_64_gnu-0.52.6.crate) = 836363
+SHA256 (rust/crates/windows_x86_64_gnullvm-0.52.6.crate) = 24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d
+SIZE (rust/crates/windows_x86_64_gnullvm-0.52.6.crate) = 435707
+SHA256 (rust/crates/windows_x86_64_msvc-0.52.6.crate) = 589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec
+SIZE (rust/crates/windows_x86_64_msvc-0.52.6.crate) = 832564
+SHA256 (rust/crates/winnow-0.7.10.crate) = c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec
+SIZE (rust/crates/winnow-0.7.10.crate) = 176073
+SHA256 (rust/crates/xcursor-0.3.8.crate) = 0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61
+SIZE (rust/crates/xcursor-0.3.8.crate) = 7191
diff --git a/x11/i3bar-river/pkg-descr b/x11/i3bar-river/pkg-descr
new file mode 100644
index 0000000..66d9e2c
--- /dev/null
+++ b/x11/i3bar-river/pkg-descr
@@ -0,0 +1 @@
+A port of i3bar for wlroots-based compositors (mango fork).