CVS commit: pkgsrc/wayland/waybar

"Robert Bagdan" <[email protected]>
Newsgroups gmane.os.netbsd.devel.pkgsrc.cvs
Message-ID <[email protected]>
Module Name:	pkgsrc
Committed By:	kikadf
Date:		Mon Aug 24 14:25:32 UTC 2026

Added Files:
	pkgsrc/wayland/waybar: DESCR Makefile PLIST distinfo
	pkgsrc/wayland/waybar/patches: patch-include_modules_battery.hpp
	    patch-include_util_udev__deleter.hpp patch-meson.build
	    patch-src_factory.cpp patch-src_modules_battery.cpp
	    patch-src_modules_cpu__frequency_bsd.cpp
	    patch-src_modules_custom.cpp patch-src_modules_simpleclock.cpp
	    patch-src_modules_user.cpp patch-src_util_icon__loader.cpp

Log Message:
waybar: new package

Waybar is a highly customizable Wayland bar for Sway and
Wlroots based compositors.


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 pkgsrc/wayland/waybar/DESCR \
    pkgsrc/wayland/waybar/Makefile pkgsrc/wayland/waybar/PLIST \
    pkgsrc/wayland/waybar/distinfo
cvs rdiff -u -r0 -r1.1 \
    pkgsrc/wayland/waybar/patches/patch-include_modules_battery.hpp \
    pkgsrc/wayland/waybar/patches/patch-include_util_udev__deleter.hpp \
    pkgsrc/wayland/waybar/patches/patch-meson.build \
    pkgsrc/wayland/waybar/patches/patch-src_factory.cpp \
    pkgsrc/wayland/waybar/patches/patch-src_modules_battery.cpp \
    pkgsrc/wayland/waybar/patches/patch-src_modules_cpu__frequency_bsd.cpp \
    pkgsrc/wayland/waybar/patches/patch-src_modules_custom.cpp \
    pkgsrc/wayland/waybar/patches/patch-src_modules_simpleclock.cpp \
    pkgsrc/wayland/waybar/patches/patch-src_modules_user.cpp \
    pkgsrc/wayland/waybar/patches/patch-src_util_icon__loader.cpp

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
(unnamed) (text/x-diff, 22.8 KB)
Added files:

Index: pkgsrc/wayland/waybar/DESCR
diff -u /dev/null pkgsrc/wayland/waybar/DESCR:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/DESCR	Mon Aug 24 14:25:31 2026
@@ -0,0 +1,2 @@
+Highly customizable Wayland bar for Sway and
+Wlroots based compositors.
Index: pkgsrc/wayland/waybar/Makefile
diff -u /dev/null pkgsrc/wayland/waybar/Makefile:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/Makefile	Mon Aug 24 14:25:31 2026
@@ -0,0 +1,65 @@
+# $NetBSD: Makefile,v 1.1 2026/08/24 14:25:31 kikadf Exp $
+
+DISTNAME=	waybar-0.15.0
+CATEGORIES=	wayland
+MASTER_SITES=	${MASTER_SITE_GITHUB:=Alexays/}
+GITHUB_PROJECT=	Waybar
+GITHUB_TAG=	${PKGVERSION_NOREV}
+
+MAINTAINER=	[email protected]
+HOMEPAGE=	https://github.com/Alexays/Waybar/
+COMMENT=	Wayland bar for Wlroots based compositors
+LICENSE=	mit
+
+USE_CXX_FEATURES+=	filesystem
+USE_LANGUAGES=		c c++
+
+USE_TOOLS+=	pkg-config gdbus-codegen
+
+SUBST_CLASSES+=		nogit
+SUBST_STAGE.nogit=	pre-configure
+SUBST_MESSAGE.nogit=	Set version
+SUBST_FILES.nogit+=	meson.build
+SUBST_SED.nogit+=	-e 's/git =/\#git =/g'
+SUBST_SED.nogit+=	-e 's/git.found()/false/g'
+
+SUBST_CLASSES+=		conf
+SUBST_STAGE.conf=	pre-configure
+SUBST_MESSAGE.conf=	Set SYSCONFDIR
+SUBST_FILES.conf+=	src/config.cpp
+SUBST_SED.conf+=	-e 's|SYSCONFDIR "|"${PKG_SYSCONFBASE}|g'
+
+EGDIR=		${PREFIX}/share/examples/waybar
+CONF_FILES=	${EGDIR}/config.jsonc ${PKG_SYSCONFDIR}/config.jsonc
+CONF_FILES+=	${EGDIR}/style.css ${PKG_SYSCONFDIR}/style.css
+CONF_FILES+=	${EGDIR}/power_menu.xml ${PKG_SYSCONFDIR}/power_menu.xml
+
+PKG_SYSCONFSUBDIR=	xdg/waybar
+BUILD_DEFS+=		PKG_SYSCONFBASE
+
+post-install:
+	${INSTALL_DATA} ${WRKSRC}/resources/custom_modules/power_menu.xml \
+		${DESTDIR}${EGDIR}
+
+# Linux uses udev for battery plugin
+.include "../../mk/bsd.fast.prefs.mk"
+.if ${OPSYS} == "Linux"
+.include "../../sysutils/libudev/buildlink3.mk"
+.endif
+
+.include "../../devel/meson/build.mk"
+.include "../../textproc/scdoc/tool.mk"
+.include "../../devel/chrono-date/buildlink3.mk"
+.include "../../devel/libdbusmenu-gtk3/buildlink3.mk"
+.include "../../devel/libinotify/buildlink3.mk"
+.include "../../devel/spdlog/buildlink3.mk"
+.include "../../devel/wayland/buildlink3.mk"
+.include "../../devel/wayland-protocols/buildlink3.mk"
+.include "../../geography/gpsd/buildlink3.mk"
+.include "../../textproc/fmtlib/buildlink3.mk"
+.include "../../textproc/jsoncpp/buildlink3.mk"
+.include "../../textproc/libxml2/buildlink3.mk"
+.include "../../wayland/gtk-layer-shell/buildlink3.mk"
+.include "../../x11/libxkbcommon/buildlink3.mk"
+.include "../../x11/gtkmm3/buildlink3.mk"
+.include "../../mk/bsd.pkg.mk"
Index: pkgsrc/wayland/waybar/PLIST
diff -u /dev/null pkgsrc/wayland/waybar/PLIST:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/PLIST	Mon Aug 24 14:25:31 2026
@@ -0,0 +1,43 @@
+@comment $NetBSD: PLIST,v 1.1 2026/08/24 14:25:31 kikadf Exp $
+bin/waybar
+man/man5/waybar-battery.5
+man/man5/waybar-cffi.5
+man/man5/waybar-clock.5
+man/man5/waybar-cpu.5
+man/man5/waybar-custom.5
+man/man5/waybar-disk.5
+man/man5/waybar-dwl-tags.5
+man/man5/waybar-dwl-window.5
+man/man5/waybar-ext-workspaces.5
+man/man5/waybar-gamemode.5
+man/man5/waybar-gps.5
+man/man5/waybar-hyprland-language.5
+man/man5/waybar-hyprland-submap.5
+man/man5/waybar-hyprland-window.5
+man/man5/waybar-hyprland-workspaces.5
+man/man5/waybar-idle-inhibitor.5
+man/man5/waybar-image.5
+man/man5/waybar-inhibitor.5
+man/man5/waybar-memory.5
+man/man5/waybar-menu.5
+man/man5/waybar-niri-language.5
+man/man5/waybar-niri-window.5
+man/man5/waybar-niri-workspaces.5
+man/man5/waybar-river-layout.5
+man/man5/waybar-river-mode.5
+man/man5/waybar-river-tags.5
+man/man5/waybar-river-window.5
+man/man5/waybar-states.5
+man/man5/waybar-styles.5
+man/man5/waybar-sway-language.5
+man/man5/waybar-sway-mode.5
+man/man5/waybar-sway-scratchpad.5
+man/man5/waybar-sway-window.5
+man/man5/waybar-sway-workspaces.5
+man/man5/waybar-temperature.5
+man/man5/waybar-tray.5
+man/man5/waybar-wlr-taskbar.5
+man/man5/waybar.5
+share/examples/waybar/config.jsonc
+share/examples/waybar/power_menu.xml
+share/examples/waybar/style.css
Index: pkgsrc/wayland/waybar/distinfo
diff -u /dev/null pkgsrc/wayland/waybar/distinfo:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/distinfo	Mon Aug 24 14:25:31 2026
@@ -0,0 +1,15 @@
+$NetBSD: distinfo,v 1.1 2026/08/24 14:25:31 kikadf Exp $
+
+BLAKE2s (waybar-0.15.0.tar.gz) = 59b011bb71da6acc9b3ee333f6ab9bbb4ccbb22b1627112b53b13135db4baa22
+SHA512 (waybar-0.15.0.tar.gz) = f267c1ad2af1e4e74c3d8c966009a013c0b5c2849bfaf312b3b91e9d6f6856dc5466118f308208948118ea1de0cf70986cc3b592cc830f84d634b8518c5b8c9e
+Size (waybar-0.15.0.tar.gz) = 355671 bytes
+SHA1 (patch-include_modules_battery.hpp) = 3bebca10de357bc25a70d26d677a8f7717d3b495
+SHA1 (patch-include_util_udev__deleter.hpp) = 8f95df3fc76f9f7461fe4576994c6fdfacb3b91b
+SHA1 (patch-meson.build) = ffb2de1b1c11b79312ef166411ac93f3f4433cc7
+SHA1 (patch-src_factory.cpp) = de849a029ac8b51381bbe4b94ea59ab9c94c44ef
+SHA1 (patch-src_modules_battery.cpp) = 4ee104fb0ed46112c09d8559687d910e08ee93b0
+SHA1 (patch-src_modules_cpu__frequency_bsd.cpp) = 9ad194942940b2b38b0f01d6a96408cd23969269
+SHA1 (patch-src_modules_custom.cpp) = 644740e4862444b7ed33523affe5d97e5fcbdd32
+SHA1 (patch-src_modules_simpleclock.cpp) = 7ffa485e5cc9033e090d46133654243cbd1b3f8d
+SHA1 (patch-src_modules_user.cpp) = 7b9d5578a64d2b1fefbecd650549c5e9f8ea19ad
+SHA1 (patch-src_util_icon__loader.cpp) = 29b8f755333ab617263b6f80e20c993025300e9a

Index: pkgsrc/wayland/waybar/patches/patch-include_modules_battery.hpp
diff -u /dev/null pkgsrc/wayland/waybar/patches/patch-include_modules_battery.hpp:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/patches/patch-include_modules_battery.hpp	Mon Aug 24 14:25:32 2026
@@ -0,0 +1,18 @@
+$NetBSD: patch-include_modules_battery.hpp,v 1.1 2026/08/24 14:25:32 kikadf Exp $
+
+* Use udev only for linux
+
+--- include/modules/battery.hpp.orig	2026-05-24 09:20:05.456525925 +0000
++++ include/modules/battery.hpp
+@@ -40,9 +40,11 @@ class Battery : public ALabel {
+   void processEvents(std::string& state, std::string& status, uint8_t capacity);
+ 
+   std::map<fs::path, int> batteries_;
++#ifdef HAVE_LIBUDEV
+   std::unique_ptr<udev, util::UdevDeleter> udev_;
+   std::array<pollfd, 1> poll_fds_;
+   std::unique_ptr<udev_monitor, util::UdevMonitorDeleter> mon_;
++#endif
+   fs::path adapter_;
+   int battery_watch_fd_;
+   std::mutex battery_list_mutex_;
Index: pkgsrc/wayland/waybar/patches/patch-include_util_udev__deleter.hpp
diff -u /dev/null pkgsrc/wayland/waybar/patches/patch-include_util_udev__deleter.hpp:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/patches/patch-include_util_udev__deleter.hpp	Mon Aug 24 14:25:32 2026
@@ -0,0 +1,21 @@
+$NetBSD: patch-include_util_udev__deleter.hpp,v 1.1 2026/08/24 14:25:32 kikadf Exp $
+
+* Use udev only for linux
+
+--- include/util/udev_deleter.hpp.orig	2026-05-24 09:05:13.454406135 +0000
++++ include/util/udev_deleter.hpp
+@@ -1,5 +1,6 @@
+ #pragma once
+ 
++#ifdef HAVE_LIBUDEV
+ #include <libudev.h>
+ 
+ namespace waybar::util {
+@@ -18,4 +19,5 @@ struct UdevEnumerateDeleter {
+ struct UdevMonitorDeleter {
+   void operator()(udev_monitor* ptr) const { udev_monitor_unref(ptr); }
+ };
+-}  // namespace waybar::util
+\ No newline at end of file
++}  // namespace waybar::util
++#endif // HAVE_LIBUDEV
Index: pkgsrc/wayland/waybar/patches/patch-meson.build
diff -u /dev/null pkgsrc/wayland/waybar/patches/patch-meson.build:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/patches/patch-meson.build	Mon Aug 24 14:25:32 2026
@@ -0,0 +1,49 @@
+$NetBSD: patch-meson.build,v 1.1 2026/08/24 14:25:32 kikadf Exp $
+
+* Build battery on NetBSD, link with -lprop
+* Config files to examples
+
+--- meson.build.orig	2026-02-06 20:15:03.000000000 +0000
++++ meson.build
+@@ -58,15 +58,19 @@ if compiler.links(code, name : 'nl_langi
+     add_project_arguments('-DHAVE_LANGINFO_1STDAY', language: 'cpp')
+ endif
+ 
+-add_global_arguments(cpp_args, language : 'cpp')
+-add_global_link_arguments(cpp_link_args, language : 'cpp')
+-
+ is_linux = host_machine.system() == 'linux'
+ is_dragonfly = host_machine.system() == 'dragonfly'
+ is_freebsd = host_machine.system() == 'freebsd'
+ is_netbsd = host_machine.system() == 'netbsd'
+ is_openbsd = host_machine.system() == 'openbsd'
+ 
++if is_netbsd
++    cpp_link_args += ['-lprop']
++endif
++
++add_global_arguments(cpp_args, language : 'cpp')
++add_global_link_arguments(cpp_link_args, language : 'cpp')
++
+ thread_dep = dependency('threads')
+ fmt = dependency('fmt', version : ['>=8.1.1'], fallback : ['fmt', 'fmt_dep'])
+ spdlog = dependency('spdlog', version : ['>=1.15.2'], fallback : ['spdlog', 'spdlog_dep'], default_options : ['std_format=disabled', 'tests=disabled'])
+@@ -245,7 +249,7 @@ elif is_dragonfly or is_freebsd or is_ne
+         'man/waybar-cpu.5.scd',
+         'man/waybar-memory.5.scd',
+     )
+-    if is_freebsd
++    if is_freebsd or is_netbsd
+         src_files += files('src/modules/battery.cpp')
+         man_files += files('man/waybar-battery.5.scd')
+     endif
+@@ -572,7 +576,8 @@ executable(
+ install_data(
+     'resources/config.jsonc',
+     'resources/style.css',
+-    install_dir: sysconfdir / 'xdg/waybar'
++    #install_dir: sysconfdir / 'xdg/waybar'
++    install_dir: prefix / 'share/examples/waybar'
+ )
+ 
+ scdoc = dependency('scdoc', version: '>=1.9.2', native: true, required: get_option('man-pages'))
Index: pkgsrc/wayland/waybar/patches/patch-src_factory.cpp
diff -u /dev/null pkgsrc/wayland/waybar/patches/patch-src_factory.cpp:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/patches/patch-src_factory.cpp	Mon Aug 24 14:25:32 2026
@@ -0,0 +1,24 @@
+$NetBSD: patch-src_factory.cpp,v 1.1 2026/08/24 14:25:32 kikadf Exp $
+
+* Enable battery module on NetBSD
+
+--- src/factory.cpp.orig	2026-05-24 09:08:08.278804792 +0000
++++ src/factory.cpp
+@@ -46,7 +46,7 @@
+ #include "modules/wayfire/window.hpp"
+ #include "modules/wayfire/workspaces.hpp"
+ #endif
+-#if defined(__FreeBSD__) || defined(__linux__)
++#if defined(__FreeBSD__) || defined(__linux__) || defined(__NetBSD__)
+ #include "modules/battery.hpp"
+ #endif
+ #if defined(HAVE_CPU_LINUX) || defined(HAVE_CPU_BSD)
+@@ -129,7 +129,7 @@ waybar::AModule* waybar::Factory::makeMo
+     auto hash_pos = name.find('#');
+     auto ref = name.substr(0, hash_pos);
+     auto id = hash_pos != std::string::npos ? name.substr(hash_pos + 1) : "";
+-#if defined(__FreeBSD__) || defined(__linux__)
++#if defined(__FreeBSD__) || defined(__linux__) || defined(__NetBSD__)
+     if (ref == "battery") {
+       return new waybar::modules::Battery(id, bar_, config_[name]);
+     }
Index: pkgsrc/wayland/waybar/patches/patch-src_modules_battery.cpp
diff -u /dev/null pkgsrc/wayland/waybar/patches/patch-src_modules_battery.cpp:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/patches/patch-src_modules_battery.cpp	Mon Aug 24 14:25:32 2026
@@ -0,0 +1,219 @@
+$NetBSD: patch-src_modules_battery.cpp,v 1.1 2026/08/24 14:25:32 kikadf Exp $
+
+* Add NetBSD support
+* Use udev only for linux
+
+--- src/modules/battery.cpp.orig	2026-02-06 20:15:03.000000000 +0000
++++ src/modules/battery.cpp
+@@ -2,15 +2,79 @@
+ 
+ #include <algorithm>
+ #include <cctype>
++#include <cstddef>
+ 
+ #include "util/command.hpp"
+ #if defined(__FreeBSD__)
+ #include <sys/sysctl.h>
+ #endif
++#ifdef HAVE_LIBUDEV
+ #include <libudev.h>
+ #include <poll.h>
+-#include <spdlog/spdlog.h>
+ #include <sys/signalfd.h>
++#endif
++#include <spdlog/spdlog.h>
++
++#if defined(__NetBSD__)
++#include <fcntl.h>
++#include <unistd.h>
++#include <prop/proplib.h>
++#include <sys/envsys.h>
++
++#define SYSMON "/dev/sysmon"
++
++static prop_array_t get_device(const char* name) {
++  prop_dictionary_t dict;
++  prop_object_t obj;
++  prop_array_t array;
++  int fd;
++
++  if (name == nullptr) { return nullptr; }
++  if ((fd = open(SYSMON, O_RDONLY)) < 0) { return nullptr; }
++  if (prop_dictionary_recv_ioctl(fd, ENVSYS_GETDICTIONARY, &dict) != 0) {
++    close(fd);
++    return nullptr;
++  }
++  close(fd);
++
++  if ((obj = prop_dictionary_get(dict, name)) == nullptr) {
++    prop_object_release(dict);
++    return nullptr;
++  }
++  if (prop_object_type(obj) != PROP_TYPE_ARRAY) {
++    prop_object_release(dict);
++    return nullptr;
++  }
++
++  array = (prop_array_t)obj;
++  prop_object_retain(array);
++  prop_object_release(dict);
++
++  return array;
++}
++
++static int64_t handle_stat(prop_dictionary_t stat, const char * key) {
++  prop_object_t obj;
++
++  if ((stat == nullptr || key == nullptr) ||
++      ((obj = prop_dictionary_get(stat, key)) == nullptr) ||
++      (prop_object_type(obj) != PROP_TYPE_NUMBER))
++  { return -1; }
++
++  return prop_number_signed_value((prop_number_t)obj);
++}
++
++static bool stat_is_valid(prop_dictionary_t stat) {
++  prop_object_t obj;
++
++  if ((stat == nullptr) ||
++      ((obj = prop_dictionary_get(stat, "state")) == nullptr) ||
++      (prop_object_type(obj) != PROP_TYPE_STRING))
++  { return false; }
++
++  return prop_string_equals_string((prop_string_t)obj, "valid");
++}
++#endif
+ 
+ waybar::modules::Battery::Battery(const std::string& id, const Bar& bar, const Json::Value& config)
+     : ALabel(config, "battery", id, "{capacity}%", 60), last_event_(""), bar_(bar) {
+@@ -56,7 +120,7 @@ waybar::modules::Battery::~Battery() {
+ }
+ 
+ void waybar::modules::Battery::worker() {
+-#if defined(__FreeBSD__)
++#if defined(__FreeBSD__) || defined(__NetBSD__)
+   thread_timer_ = [this] {
+     dp.emit();
+     thread_timer_.sleep_for(interval_);
+@@ -248,6 +312,82 @@ waybar::modules::Battery::getInfos() {
+     // spdlog::info("{} {} {} {}", capacity,time,status,rate);
+     return {capacity, time / 60.0, status, rate, 0, 0.0F};
+ 
++#elif defined(__NetBSD__)
++    //Need: [capacity, time_remaining, status,      power, cycles,   health]
++    //      [uint8_t,  float,          std::string, float, uint16_t, float ]
++    prop_array_t bat;
++    prop_object_iterator_t iter;
++    prop_dictionary_t id;
++    prop_string_t desc;
++    int32_t cur_charge = 0;
++    int32_t max_charge = 0;
++    int32_t last_max_charge = 0;
++    int32_t charge_rate = 0;
++    int32_t discharge_rate = 0;
++    std::string status;
++    int32_t capacity;
++    float time_remaining;
++    float power;
++
++    if ((bat = get_device("acpibat0")) == nullptr) {
++        throw std::runtime_error("get acpibat0 device info failed");
++    }
++    if ((iter = prop_array_iterator(bat)) == nullptr) {
++        prop_object_release(bat);
++        throw std::runtime_error("prop_array_iterator failed");
++    }
++    while ((id = (prop_dictionary_t)prop_object_iterator_next(iter)) != nullptr) {
++        desc = (prop_string_t)prop_dictionary_get(id, "description");
++        if (desc == nullptr) continue;
++        if (prop_string_equals_string(desc, "charge")) {
++            cur_charge = handle_stat(id, "cur-value");
++            max_charge = handle_stat(id, "max-value");
++        } else if (prop_string_equals_string(desc, "last full cap")) {
++            if (stat_is_valid(id)) last_max_charge = handle_stat(id, "cur-value");
++        } else if (prop_string_equals_string(desc, "charge rate")) {
++            if (stat_is_valid(id)) charge_rate = handle_stat(id, "cur-value");
++        } else if (prop_string_equals_string(desc, "discharge rate")) {
++            if (stat_is_valid(id)) discharge_rate = handle_stat(id, "cur-value");
++        }
++    }
++    prop_object_iterator_release(iter);
++    prop_object_release(bat);
++
++    spdlog::info("{} {} {} {}", max_charge,cur_charge,charge_rate,discharge_rate);
++
++    if (max_charge <= 0) max_charge = last_max_charge;
++    if (charge_rate == 0 && (discharge_rate == 0 || discharge_rate == -1000)) {
++        time_remaining = 0.0;
++        power = 0.0;
++    } else {
++        if (charge_rate) {
++            time_remaining = -(float)(max_charge - cur_charge) / (float)charge_rate;
++            power = charge_rate;
++        } else {
++            time_remaining = -(float)cur_charge / (float)discharge_rate;
++            power = discharge_rate;
++        }
++    }
++
++    capacity = (cur_charge * 100) / max_charge;
++    // Handle full-at
++    if (config_["full-at"].isUInt()) {
++        auto full_at = config_["full-at"].asUInt();
++        if (full_at < 100) {
++            capacity = 100.f * capacity / full_at;
++        }
++    }
++    if (capacity > 100.f) {
++        // This can happen when the battery is calibrating and goes above 100%
++        // Handle it gracefully by clamping at 100%
++        capacity = 100.f;
++    }
++
++    status = getAdapterStatus(capacity);
++
++    spdlog::info("{} {} {} {}", capacity,time_remaining,status,power);
++    return {capacity, time_remaining, status, power, 0, 0.0F};
++
+ #elif defined(__linux__)
+     uint32_t total_power = 0;  // μW
+     bool total_power_exists = false;
+@@ -639,6 +779,38 @@ const std::string waybar::modules::Batte
+   bool online = state == 2;
+   std::string status{"Unknown"};  // TODO: add status in FreeBSD
+   {
++#elif defined(__NetBSD__)
++  prop_array_t ac;
++  prop_object_iterator_t iter;
++  prop_dictionary_t id;
++  prop_string_t desc;
++  std::string status;
++  bool online = false;
++
++  if ((ac = get_device("acpiacad0")) == nullptr) {
++    status = "Unknown";
++  } else {
++    if ((iter = prop_array_iterator(ac)) == nullptr){
++      prop_object_release(ac);
++      throw std::runtime_error("prop_array_iterator failed");
++    }
++    while ((id = (prop_dictionary_t)prop_object_iterator_next(iter)) != nullptr) {
++      desc = (prop_string_t)prop_dictionary_get(id, "description");
++        if (desc == nullptr) continue;
++        if (!prop_string_equals_string(desc, "connected")) continue;
++        // Unknown > Full > Not charging > Discharging > Charging
++        if (handle_stat(id, "cur-value") != 0) {
++          status = "Charging";
++          online = true;
++        } else {
++          status = "Discharging";
++        }
++        break;
++    }
++    prop_object_iterator_release(iter);
++    prop_object_release(ac);
++  }
++  {
+ #else
+   if (!adapter_.empty()) {
+     bool online;
Index: pkgsrc/wayland/waybar/patches/patch-src_modules_cpu__frequency_bsd.cpp
diff -u /dev/null pkgsrc/wayland/waybar/patches/patch-src_modules_cpu__frequency_bsd.cpp:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/patches/patch-src_modules_cpu__frequency_bsd.cpp	Mon Aug 24 14:25:32 2026
@@ -0,0 +1,28 @@
+$NetBSD: patch-src_modules_cpu__frequency_bsd.cpp,v 1.1 2026/08/24 14:25:32 kikadf Exp $
+
+* Add NetBSD support
+
+--- src/modules/cpu_frequency/bsd.cpp.orig	2026-05-25 08:52:26.638052357 +0000
++++ src/modules/cpu_frequency/bsd.cpp
+@@ -8,7 +8,7 @@ std::vector<float> waybar::modules::CpuF
+   size_t len;
+   int32_t freq;
+ 
+-#ifndef __OpenBSD__
++#if defined(__FreeBSD__)
+   char buffer[256];
+   uint32_t i = 0;
+   while (true) {
+@@ -18,7 +18,11 @@ std::vector<float> waybar::modules::CpuF
+     frequencies.push_back(freq);
+     ++i;
+   }
+-#else
++#elif defined(__NetBSD__)
++  if (sysctlbyname("machdep.cpu.frequency.current", &freq, &len, NULL, 0) == 0) {
++    frequencies.push_back((float)freq);
++  }
++#elif defined(__OpenBSD__)
+   int getMhz[] = {CTL_HW, HW_CPUSPEED};
+   len = sizeof(freq);
+   sysctl(getMhz, 2, &freq, &len, NULL, 0);
Index: pkgsrc/wayland/waybar/patches/patch-src_modules_custom.cpp
diff -u /dev/null pkgsrc/wayland/waybar/patches/patch-src_modules_custom.cpp:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/patches/patch-src_modules_custom.cpp	Mon Aug 24 14:25:32 2026
@@ -0,0 +1,16 @@
+$NetBSD: patch-src_modules_custom.cpp,v 1.1 2026/08/24 14:25:32 kikadf Exp $
+
+* Portable WEXITSTATUS usage
+
+--- src/modules/custom.cpp.orig	2025-12-18 09:25:10.973327997 +0000
++++ src/modules/custom.cpp
+@@ -81,7 +81,8 @@ void waybar::modules::Custom::continuous
+     if (getline(&buff, &len, fp_) == -1) {
+       int exit_code = 1;
+       if (fp_) {
+-        exit_code = WEXITSTATUS(util::command::close(fp_, pid_));
++        int status = util::command::close(fp_, pid_);
++        exit_code = WEXITSTATUS(status);
+         fp_ = nullptr;
+       }
+       if (exit_code != 0) {
Index: pkgsrc/wayland/waybar/patches/patch-src_modules_simpleclock.cpp
diff -u /dev/null pkgsrc/wayland/waybar/patches/patch-src_modules_simpleclock.cpp:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/patches/patch-src_modules_simpleclock.cpp	Mon Aug 24 14:25:32 2026
@@ -0,0 +1,17 @@
+$NetBSD: patch-src_modules_simpleclock.cpp,v 1.1 2026/08/24 14:25:32 kikadf Exp $
+
+* fmt::localtime was removed in fmtlib-12
+
+--- src/modules/simpleclock.cpp.orig	2025-12-18 09:42:22.535423519 +0000
++++ src/modules/simpleclock.cpp
+@@ -17,7 +17,9 @@ waybar::modules::Clock::Clock(const std:
+ auto waybar::modules::Clock::update() -> void {
+   tzset();  // Update timezone information
+   auto now = std::chrono::system_clock::now();
+-  auto localtime = fmt::localtime(std::chrono::system_clock::to_time_t(now));
++  auto t = std::chrono::system_clock::to_time_t(now);
++  std::tm localtime{};
++  localtime_r(&t, &localtime);
+   auto text = fmt::format(fmt::runtime(format_), localtime);
+   label_.set_markup(text);
+ 
Index: pkgsrc/wayland/waybar/patches/patch-src_modules_user.cpp
diff -u /dev/null pkgsrc/wayland/waybar/patches/patch-src_modules_user.cpp:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/patches/patch-src_modules_user.cpp	Mon Aug 24 14:25:32 2026
@@ -0,0 +1,21 @@
+$NetBSD: patch-src_modules_user.cpp,v 1.1 2026/08/24 14:25:32 kikadf Exp $
+
+* Portable uptime usage, fallback to CLOCK_MONOTONIC
+
+--- src/modules/user.cpp.orig	2025-12-18 09:12:40.964198952 +0000
++++ src/modules/user.cpp
+@@ -63,10 +63,12 @@ long User::uptime_as_seconds() {
+ #if HAVE_CPU_BSD
+   struct timespec s_info;
+   int flags = 0;
+-#ifndef __OpenBSD__
++#ifdef CLOCK_UPTIME_PRECISE
+   flags = CLOCK_UPTIME_PRECISE;
+-#else
++#elif defined(CLOCK_UPTIME)
+   flags = CLOCK_UPTIME;
++#else
++  flags = CLOCK_MONOTONIC;
+ #endif
+   if (0 == clock_gettime(flags, &s_info)) {
+     uptime = s_info.tv_sec;
Index: pkgsrc/wayland/waybar/patches/patch-src_util_icon__loader.cpp
diff -u /dev/null pkgsrc/wayland/waybar/patches/patch-src_util_icon__loader.cpp:1.1
--- /dev/null	Mon Aug 24 14:25:32 2026
+++ pkgsrc/wayland/waybar/patches/patch-src_util_icon__loader.cpp	Mon Aug 24 14:25:32 2026
@@ -0,0 +1,15 @@
+$NetBSD: patch-src_util_icon__loader.cpp,v 1.1 2026/08/24 14:25:32 kikadf Exp $
+
+* Fix ctype usage
+
+--- src/util/icon_loader.cpp.orig	2026-07-27 13:52:11.975754660 +0000
++++ src/util/icon_loader.cpp
+@@ -185,7 +185,7 @@ Glib::RefPtr<Gio::DesktopAppInfo> IconLo
+ 
+     auto lower_app_id = app_id;
+     std::ranges::transform(lower_app_id, lower_app_id.begin(),
+-                           [](char c) { return std::tolower(c); });
++                           [](char c) { return static_cast<char>(std::tolower(static_cast<unsigned char>(c))); });
+     app_info_ = get_desktop_app_info(lower_app_id);
+     if (app_info_) {
+       return app_info_;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.