Index | Thread | Search

From:
Volker Schlecht <openbsd-ports@schlecht.dev>
Subject:
[Fix] wayland/waybar
To:
ports <ports@openbsd.org>, Landry Breuil <landry@openbsd.org>, Matthieu Herrb <matthieu@herrb.eu>
Date:
Fri, 17 Apr 2026 00:01:35 +0200

Download raw body.

Thread
Attached is a quality-of-life improvement for users of wayland/waybar
that if possible I would still like to sneak in for 7.9:

waybar has the documented feature that you can toggle its visibility by sending
it SIGUSR1 and reload its configuration by sending SIGUSR2.

However, someone sought to improve things for OpenBSD by helpfully defining
SIGRTMIN and SIGRTMAX in terms of SIGUSR1:

https://github.com/Alexays/Waybar/blob/d808c00324618c35de30335ca6fd215f6d81860f/include/util/SafeSignal.hpp#L14

That has the unfortunate consequence that waybar handles SIGUSR1 and SIGUSR2 the
same way as it would handle SIGRTs on Linux, or in short: that functionality is
broken on OpenBSD.

I patched things up to make SIGUSR handling work again.

While testing that, I also noticed that the sndio module doesn't take very well
to being reloaded, and crashes or hangs in various exciting ways in those
situations - therefore I also adjusted the example configuration to replace the
sndio module by a few invocations of sndioctl(1).

ok?
Index: Makefile
===================================================================
RCS file: /cvs/ports/wayland/waybar/Makefile,v
retrieving revision 1.4
diff -u -p -r1.4 Makefile
--- Makefile	29 Mar 2026 12:01:55 -0000	1.4
+++ Makefile	16 Apr 2026 21:40:00 -0000
@@ -4,7 +4,7 @@ V =		0.15.0
 
 DIST_TUPLE=	github  Alexays Waybar ${V} .
 PKGNAME=	waybar-${V}
-REVISION=	0
+REVISION=	1
 
 CATEGORIES =	wayland
 
Index: patches/patch-include_util_SafeSignal_hpp
===================================================================
RCS file: patches/patch-include_util_SafeSignal_hpp
diff -N patches/patch-include_util_SafeSignal_hpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-include_util_SafeSignal_hpp	16 Apr 2026 21:40:00 -0000
@@ -0,0 +1,15 @@
+Index: include/util/SafeSignal.hpp
+--- include/util/SafeSignal.hpp.orig
++++ include/util/SafeSignal.hpp
+@@ -11,11 +11,6 @@
+ #include <type_traits>
+ #include <utility>
+ 
+-#ifdef __OpenBSD__
+-#define SIGRTMIN SIGUSR1 - 1
+-#define SIGRTMAX SIGUSR1 + 1
+-#endif
+-
+ namespace waybar {
+ 
+ /**
Index: patches/patch-resources_config_jsonc
===================================================================
RCS file: /cvs/ports/wayland/waybar/patches/patch-resources_config_jsonc,v
retrieving revision 1.3
diff -u -p -r1.3 patch-resources_config_jsonc
--- patches/patch-resources_config_jsonc	29 Mar 2026 12:01:56 -0000	1.3
+++ patches/patch-resources_config_jsonc	16 Apr 2026 21:40:00 -0000
@@ -24,7 +24,7 @@ Index: resources/config.jsonc
 -        "network",
 -        "power-profiles-daemon",
 +        //"mpd",
-+        "sndio",
++        "custom/sndio",
          "cpu",
          "memory",
 -        "temperature",
@@ -67,7 +67,7 @@ Index: resources/config.jsonc
          "format-alt": "{:%Y-%m-%d}"
      },
      "cpu": {
-@@ -122,98 +111,30 @@
+@@ -122,98 +111,32 @@
      "memory": {
          "format": "{}% "
      },
@@ -98,11 +98,13 @@ Index: resources/config.jsonc
 -        // "format-good": "", // An empty format will hide the module
 -        // "format-full": "",
 -        "format-icons": ["", "", "", "", ""]
-+    "sndio": {
-+         "scroll-step": "1",
-+         "format": "   {volume}% ",
-+         "on-scroll-down": "sndioctl output.level=-0.01",
-+         "on-scroll-up": "sndioctl output.level=+0.01"
++    "custom/sndio": {
++         "format": "   {}% ",
++         "interval": 10,
++         "exec": "if [ $(sndioctl -n output.mute) -eq 1 ]; then echo \"--\"; else sndioctl -n output.level | awk '{printf \"%.0f\\n\", $1 * 100}'; fi",
++         "on-click": "sndioctl output.mute=! > /dev/null",
++         "on-scroll-down": "sndioctl output.level=-0.01 > /dev/null",
++         "on-scroll-up": "sndioctl output.level=+0.01 > /dev/null"
      },
 -    "battery#bat2": {
 -        "bat": "BAT2"
Index: patches/patch-resources_style_css
===================================================================
RCS file: /cvs/ports/wayland/waybar/patches/patch-resources_style_css,v
retrieving revision 1.2
diff -u -p -r1.2 patch-resources_style_css
--- patches/patch-resources_style_css	29 Mar 2026 12:01:56 -0000	1.2
+++ patches/patch-resources_style_css	16 Apr 2026 21:40:00 -0000
@@ -49,11 +49,12 @@ Index: resources/style.css
  label:focus {
      background-color: #000000;
  }
-@@ -203,6 +226,16 @@ label:focus {
+@@ -203,6 +226,17 @@ label:focus {
      color: #2a5c45;
  }
  
-+#sndio {
++#sndio,
++#custom-sndio {
 +    background-color: #f1c40f;
 +    color: #000;
 +}
@@ -66,7 +67,7 @@ Index: resources/style.css
  #wireplumber {
      background-color: #fff0f5;
      color: #000000;
-@@ -227,6 +260,10 @@ label:focus {
+@@ -227,6 +261,10 @@ label:focus {
  }
  
  #temperature {
Index: patches/patch-src_main_cpp
===================================================================
RCS file: patches/patch-src_main_cpp
diff -N patches/patch-src_main_cpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_main_cpp	16 Apr 2026 21:40:00 -0000
@@ -0,0 +1,30 @@
+Index: src/main.cpp
+--- src/main.cpp.orig
++++ src/main.cpp
+@@ -52,9 +52,11 @@ static void catchSignals(waybar::SafeSignal<int>& sign
+   std::signal(SIGINT, writeSignalToPipe);
+   std::signal(SIGCHLD, writeSignalToPipe);
+ 
++#ifndef __OpenBSD__
+   for (int sig = SIGRTMIN + 1; sig <= SIGRTMAX; ++sig) {
+     std::signal(sig, writeSignalToPipe);
+   }
++#endif
+ 
+   while (true) {
+     int signum;
+@@ -116,12 +118,14 @@ void handleUserSignal(int signal, bool& reload) {
+ // If this signal should restart or close the bar, this function will write
+ // `true` or `false`, respectively, into `reload`.
+ static void handleSignalMainThread(int signum, bool& reload) {
++#ifndef __OpenBSD__
+   if (signum >= SIGRTMIN + 1 && signum <= SIGRTMAX) {
+     for (auto& bar : waybar::Client::inst()->bars) {
+       bar->handleSignal(signum);
+     }
+     return;
+   }
++#endif
+ 
+   switch (signum) {
+     case SIGUSR1:
Index: patches/patch-src_modules_custom_cpp
===================================================================
RCS file: patches/patch-src_modules_custom_cpp
diff -N patches/patch-src_modules_custom_cpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_modules_custom_cpp	16 Apr 2026 21:40:00 -0000
@@ -0,0 +1,16 @@
+Index: src/modules/custom.cpp
+--- src/modules/custom.cpp.orig
++++ src/modules/custom.cpp
+@@ -136,9 +136,9 @@ void waybar::modules::Custom::waitingWorker() {
+ }
+ 
+ void waybar::modules::Custom::refresh(int sig) {
+-  if (config_["signal"].isInt() && sig == SIGRTMIN + config_["signal"].asInt()) {
+-    thread_.wake_up();
+-  }
++  // if (config_["signal"].isInt() && sig == SIGRTMIN + config_["signal"].asInt()) {
++  //  thread_.wake_up();
++  // }
+ }
+ 
+ void waybar::modules::Custom::handleEvent() {
Index: patches/patch-src_modules_image_cpp
===================================================================
RCS file: patches/patch-src_modules_image_cpp
diff -N patches/patch-src_modules_image_cpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_modules_image_cpp	16 Apr 2026 21:40:00 -0000
@@ -0,0 +1,16 @@
+Index: src/modules/image.cpp
+--- src/modules/image.cpp.orig
++++ src/modules/image.cpp
+@@ -41,9 +41,9 @@ void waybar::modules::Image::delayWorker() {
+ }
+ 
+ void waybar::modules::Image::refresh(int sig) {
+-  if (config_["signal"].isInt() && sig == SIGRTMIN + config_["signal"].asInt()) {
+-    thread_.wake_up();
+-  }
++  // if (config_["signal"].isInt() && sig == SIGRTMIN + config_["signal"].asInt()) {
++  //  thread_.wake_up();
++  // }
+ }
+ 
+ auto waybar::modules::Image::update() -> void {