From eb9fa6f4febd31cc39c699ad6d43baf50aca4802 Mon Sep 17 00:00:00 2001 From: Austin Lane Date: Mon, 20 Apr 2026 19:03:19 -0400 Subject: [PATCH] Notifications: Use libnotify Use libnotify for meshtasticd desktop notifications. Add "HAS_LIBNOTIFY" macro to guard for builds where libnotify is expected. This is not included in buildroot/openwrt builds. (no libnotify except when extra repos are added). Install desktop icon in the correct location on Debian and Fedora packages. Update dependencies in packaging and dockerfiles. --- .devcontainer/Dockerfile | 1 + Dockerfile | 4 +-- Dockerfile.test | 2 +- alpine.Dockerfile | 4 +-- bin/org.meshtastic.meshtasticd.png | Bin 13139 -> 0 bytes debian/control | 3 +- debian/meshtasticd.install | 2 ++ meshtasticd.spec.rpkg | 6 ++++ src/modules/ExternalNotificationModule.cpp | 32 ++++++++++++++++----- src/modules/ExternalNotificationModule.h | 2 +- variants/native/portduino/platformio.ini | 15 +++++++--- 11 files changed, 53 insertions(+), 18 deletions(-) delete mode 100644 bin/org.meshtastic.meshtasticd.png diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index f546d4cfd..589ad8c3e 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -34,6 +34,7 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ libxcb-xkb-dev \ libxkbcommon-dev \ libinput-dev \ + libnotify-dev \ && apt-get clean && rm -rf /var/lib/apt/lists/* RUN pipx install platformio diff --git a/Dockerfile b/Dockerfile index e00d81658..211c6e1b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \ curl wget g++ zip git ca-certificates pkg-config \ libgpiod-dev libyaml-cpp-dev libbluetooth-dev libi2c-dev libuv1-dev \ libusb-1.0-0-dev libulfius-dev liborcania-dev libssl-dev \ - libx11-dev libinput-dev libxkbcommon-x11-dev libsqlite3-dev libsdl2-dev \ + libx11-dev libinput-dev libxkbcommon-x11-dev libsqlite3-dev libsdl2-dev libnotify-dev \ && apt-get clean && rm -rf /var/lib/apt/lists/* \ && pip install --no-cache-dir -U platformio \ && mkdir /tmp/firmware @@ -53,7 +53,7 @@ USER root RUN apt-get update && apt-get --no-install-recommends -y install \ libc-bin libc6 libgpiod3 libyaml-cpp0.8 libi2c0 libuv1t64 libusb-1.0-0-dev \ liborcania2.3 libulfius2.7t64 libssl3t64 \ - libx11-6 libinput10 libxkbcommon-x11-0 libsdl2-2.0-0 \ + libx11-6 libinput10 libxkbcommon-x11-0 libsdl2-2.0-0 libnotify4 \ && apt-get clean && rm -rf /var/lib/apt/lists/* \ && mkdir -p /var/lib/meshtasticd \ && mkdir -p /etc/meshtasticd/config.d \ diff --git a/Dockerfile.test b/Dockerfile.test index 12479b36d..297c19c6e 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -9,7 +9,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \ g++ git ca-certificates pkg-config \ libgpiod-dev libyaml-cpp-dev libbluetooth-dev libi2c-dev libuv1-dev \ libusb-1.0-0-dev libulfius-dev liborcania-dev libssl-dev \ - libx11-dev libinput-dev libxkbcommon-x11-dev libsqlite3-dev libsdl2-dev \ + libx11-dev libinput-dev libxkbcommon-x11-dev libsqlite3-dev libsdl2-dev libnotify-dev \ && apt-get clean && rm -rf /var/lib/apt/lists/* \ && pip install --no-cache-dir platformio==6.1.19 \ && useradd --create-home --shell /usr/sbin/nologin meshtastic diff --git a/alpine.Dockerfile b/alpine.Dockerfile index 75c9aa594..ebbf9dab4 100644 --- a/alpine.Dockerfile +++ b/alpine.Dockerfile @@ -11,7 +11,7 @@ RUN apk --no-cache add \ bash g++ libstdc++-dev linux-headers zip git ca-certificates libbsd-dev \ libgpiod-dev yaml-cpp-dev bluez-dev \ libusb-dev i2c-tools-dev libuv-dev openssl-dev pkgconf argp-standalone \ - libx11-dev libinput-dev libxkbcommon-dev sqlite-dev sdl2-dev \ + libx11-dev libinput-dev libxkbcommon-dev sqlite-dev sdl2-dev libnotify-dev \ && rm -rf /var/cache/apk/* \ && pip install --no-cache-dir -U platformio \ && mkdir /tmp/firmware @@ -42,7 +42,7 @@ USER root RUN apk --no-cache add \ shadow libstdc++ libbsd libgpiod yaml-cpp libusb \ - i2c-tools libuv libx11 libinput libxkbcommon sdl2 \ + i2c-tools libuv libx11 libinput libxkbcommon sdl2 libnotify \ && rm -rf /var/cache/apk/* \ && mkdir -p /var/lib/meshtasticd \ && mkdir -p /etc/meshtasticd/config.d \ diff --git a/bin/org.meshtastic.meshtasticd.png b/bin/org.meshtastic.meshtasticd.png deleted file mode 100644 index d031c10e26fb62dba93df6d635567d204c0dfc0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13139 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 diff --git a/debian/control b/debian/control index 8e5f17af9..403b5537a 100644 --- a/debian/control +++ b/debian/control @@ -27,7 +27,8 @@ Build-Depends: debhelper-compat (= 13), libinput-dev, libxkbcommon-x11-dev, libsqlite3-dev, - libsdl2-dev + libsdl2-dev, + libnotify-dev Standards-Version: 4.6.2 Homepage: https://github.com/meshtastic/firmware Rules-Requires-Root: no diff --git a/debian/meshtasticd.install b/debian/meshtasticd.install index 62c0150db..3a30f1d7c 100644 --- a/debian/meshtasticd.install +++ b/debian/meshtasticd.install @@ -7,3 +7,5 @@ bin/meshtasticd.service lib/systemd/system bin/meshtasticd-start.sh usr/bin web/* usr/share/meshtasticd/web + +bin/org.meshtastic.meshtasticd.svg usr/share/icons/hicolor/scalable/apps diff --git a/meshtasticd.spec.rpkg b/meshtasticd.spec.rpkg index a9eb552d7..3ab9a5a7a 100644 --- a/meshtasticd.spec.rpkg +++ b/meshtasticd.spec.rpkg @@ -50,6 +50,7 @@ BuildRequires: pkgconfig(x11) BuildRequires: pkgconfig(libinput) BuildRequires: pkgconfig(xkbcommon-x11) BuildRequires: pkgconfig(sdl2) +BuildRequires: pkgconfig(libnotify) # libbsd is needed on older Fedora/RHEL to provide 'strlcpy' %if 0%{?fedora} >= 39 || 0%{?rhel} >= 10 @@ -112,6 +113,10 @@ cp -r web/* %{buildroot}%{_datadir}/meshtasticd/web # Install default SSL storage directory (for web) mkdir -p %{buildroot}%{_sysconfdir}/meshtasticd/ssl +# Install desktop icon +mkdir -p %{buildroot}%{_datadir}/icons/hicolor/scalable/apps +install -m 0644 bin/org.meshtastic.meshtasticd.svg %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/org.meshtastic.meshtasticd.svg + %pre # create spi group (for udev rules) getent group spi > /dev/null || groupadd -r spi @@ -171,6 +176,7 @@ fi %dir %{_datadir}/meshtasticd/web %{_datadir}/meshtasticd/web/* %dir %{_sysconfdir}/meshtasticd/ssl +%{_datadir}/icons/hicolor/scalable/apps/org.meshtastic.meshtasticd.svg %changelog %autochangelog diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp index 5da375074..32db73313 100644 --- a/src/modules/ExternalNotificationModule.cpp +++ b/src/modules/ExternalNotificationModule.cpp @@ -24,6 +24,10 @@ #include "mesh/generated/meshtastic/rtttl.pb.h" #include +#if HAS_LIBNOTIFY +#include +#endif + #if defined(HAS_RGB_LED) #include "AmbientLightingThread.h" uint8_t red = 0; @@ -408,7 +412,7 @@ ProcessMessage ExternalNotificationModule::handleReceived(const meshtastic_MeshP if (genericShouldAlert) { LOG_INFO("externalNotificationModule - Generic alert"); setExternalState(0, true); -#if ARCH_PORTDUINO +#if HAS_LIBNOTIFY portduinoNotify(mp); #endif } @@ -525,7 +529,7 @@ int ExternalNotificationModule::handleInputEvent(const InputEvent *event) return 0; } -#if ARCH_PORTDUINO +#if HAS_LIBNOTIFY void ExternalNotificationModule::portduinoNotify(const meshtastic_MeshPacket &mp) { std::string senderName; @@ -541,9 +545,23 @@ void ExternalNotificationModule::portduinoNotify(const meshtastic_MeshPacket &mp } std::string notificationSummary = "From: " + senderName; std::string notificationBody = std::string((char *)mp.decoded.payload.bytes, mp.decoded.payload.size); - std::string command = "notify-send -a Meshtasticd -i org.meshtastic.meshtasticd.png "; - command += "\"" + notificationSummary + "\" \"" + notificationBody + "\""; - LOG_INFO("Executing command: %s", command.c_str()); - exec(command.c_str()); + + if (!notify_is_initted()) { + if (!notify_init("Meshtasticd")) { + LOG_WARN("Failed to initialize libnotify"); + return; + } + } + NotifyNotification *notification = + notify_notification_new(notificationSummary.c_str(), notificationBody.c_str(), "org.meshtastic.meshtasticd"); + if (notification) { + GError *error = nullptr; + if (!notify_notification_show(notification, &error)) { + LOG_WARN("Failed to show notification: %s", error ? error->message : "unknown error"); + if (error) + g_error_free(error); + } + g_object_unref(G_OBJECT(notification)); + } } -#endif \ No newline at end of file +#endif diff --git a/src/modules/ExternalNotificationModule.h b/src/modules/ExternalNotificationModule.h index 1d9c207ad..bf1e8e6c1 100644 --- a/src/modules/ExternalNotificationModule.h +++ b/src/modules/ExternalNotificationModule.h @@ -78,7 +78,7 @@ class ExternalNotificationModule : public SinglePortModule, private concurrency: meshtastic_AdminMessage *request, meshtastic_AdminMessage *response) override; -#if ARCH_PORTDUINO +#if HAS_LIBNOTIFY void portduinoNotify(const meshtastic_MeshPacket &mp); #endif }; diff --git a/variants/native/portduino/platformio.ini b/variants/native/portduino/platformio.ini index 045e3edea..18b1865cd 100644 --- a/variants/native/portduino/platformio.ini +++ b/variants/native/portduino/platformio.ini @@ -2,6 +2,8 @@ extends = portduino_base build_flags = ${portduino_base.build_flags} -I variants/native/portduino -I /usr/include + !pkg-config --cflags --libs libnotify + -D HAS_LIBNOTIFY=1 board = cross_platform board_level = extra lib_deps = @@ -27,7 +29,8 @@ build_type = release lib_deps = ${native_base.lib_deps} ${device-ui_base.lib_deps} -build_flags = ${native_base.build_flags} -Os -lX11 -linput -lxkbcommon -ffunction-sections -fdata-sections -Wl,--gc-sections +build_flags = ${native_base.build_flags} + -Os -lX11 -linput -lxkbcommon -ffunction-sections -fdata-sections -Wl,--gc-sections -D RAM_SIZE=16384 -D USE_X11=1 -D HAS_TFT=1 @@ -55,7 +58,8 @@ build_type = release lib_deps = ${native_base.lib_deps} ${device-ui_base.lib_deps} -build_flags = ${native_base.build_flags} -Os -ffunction-sections -fdata-sections -Wl,--gc-sections +build_flags = ${native_base.build_flags} + -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -D RAM_SIZE=8192 -D USE_FRAMEBUFFER=1 -D LV_COLOR_DEPTH=32 @@ -84,7 +88,8 @@ build_type = debug lib_deps = ${native_base.lib_deps} ${device-ui_base.lib_deps} -build_flags = ${native_base.build_flags} -O0 -fsanitize=address -lX11 -linput -lxkbcommon +build_flags = ${native_base.build_flags} + -O0 -fsanitize=address -lX11 -linput -lxkbcommon -D DEBUG_HEAP -D RAM_SIZE=16384 -D USE_X11=1 @@ -112,7 +117,9 @@ build_src_filter = ${env:native-tft.build_src_filter} [env:coverage] extends = env:native -build_flags = -lgcov --coverage -fprofile-abs-path -fsanitize=address ${env:native.build_flags} +build_flags = + -lgcov --coverage -fprofile-abs-path -fsanitize=address + ${env:native.build_flags} ; https://docs.platformio.org/en/latest/projectconf/sections/env/options/test/test_testing_command.html test_testing_command = ${platformio.build_dir}/${this.__env__}/meshtasticd