# SPDX-FileCopyrightText: 2026 glassosd contributors # SPDX-License-Identifier: GPL-2.0-or-later Name: glassosd Version: 0.3.2 # Plain Release rather than %%autorelease: rpmautospec is not available in # every builder, and a spec that only builds on Fedora infrastructure is not # much use to someone packaging this for anything else. Release: 1%{?dist} Summary: Glass notification daemon, OSD and notification centre for Wayland # The OSD event translation in src/osdmodel.cpp is a port of # plasma-workspace shell/osd.cpp, which is GPL-2.0-or-later; that licence # governs the whole binary. The icon set in qml/icons is CC0-1.0. License: GPL-2.0-or-later AND CC0-1.0 URL: https://github.com/SmallTardigrade/glassosd Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz BuildRequires: cmake >= 3.20 BuildRequires: gcc-c++ BuildRequires: ninja-build BuildRequires: extra-cmake-modules BuildRequires: pkgconfig(dbus-1) BuildRequires: systemd-rpm-macros # For %check only: the portal relay's round-trip tests run on a private # session bus started by dbus-run-session. Without it they are skipped rather # than failing, which would leave COPR never exercising the relay at all. BuildRequires: dbus-daemon BuildRequires: qt6-qtbase-devel >= 6.6 BuildRequires: qt6-qtdeclarative-devel >= 6.6 BuildRequires: kf6-kwindowsystem-devel BuildRequires: kf6-kguiaddons-devel BuildRequires: kf6-kconfig-devel BuildRequires: kf6-ki18n-devel BuildRequires: kf6-kglobalaccel-devel BuildRequires: kf6-kstatusnotifieritem-devel BuildRequires: kf6-kidletime-devel BuildRequires: layer-shell-qt-devel # The QML runtime is dlopen()ed, so RPM's automatic dependency generator # cannot see it. Requires: qt6-qtdeclarative%{?_isa} Requires: qt6-qtwayland%{?_isa} # Every icon this program ships is an SVG, and so is every icon in Breeze. # Without this plugin all of them render as blank space, and nothing says so: # it is loaded at runtime, so neither the linker nor rpm's dependency # generator can see that it is needed. Requires: qt6-qtsvg%{?_isa} # glassosdctl speaks to the daemon over the session bus. Requires: systemd # An icon theme, for the icons we do not draw ourselves — application icons on # notifications, and the handful of names the compositor sends. Requires: breeze-icons # Optional, and genuinely optional: glassosdctl uses kwriteconfig6 when it is # there and edits the INI itself when it is not. Recommends: kf6-kconfig # Sandboxed applications reach a notification daemon only through the portal, # and glassosd now implements the portal's notification backend itself — the # gtk backend is no longer needed as a relay. Recommended rather than required # because glassosd is perfectly useful on a system with no Flatpaks on it. Recommends: xdg-desktop-portal # KDE's icon engine, which renders Breeze's SVGs at whatever size is asked # for. Qt's built-in loader cannot: Breeze ships fixed sizes with no scalable # directory, so without this a 24px icon is stretched to 60 and looks it. # Reported from a package that did not have it. Recommends rather than # Requires because the daemon runs on compositors where Plasma is not # installed at all, and its own glyphs are unaffected either way. Recommends: plasma-integration # Only needed for `glassosdctl osd volume|mic` on compositors that have no # org.kde.osdService to monitor. Suggests: wireplumber Suggests: brightnessctl # Deliberately no Conflicts: with dunst/mako/swaync. They share no files, and # only one daemon can own org.freedesktop.Notifications at a time anyway — that # is a runtime question, not an install-time one. Blocking the install would # stop people trying glassosd without uninstalling what they have. %description glassosd draws four Wayland shell surfaces with one rounded, blurred, glass visual language: notification popups, the volume/brightness OSD, lock-key indicators, and a notification centre. As a notification daemon it implements the freedesktop Desktop Notifications specification plus the KDE extensions (inline reply, action icons, image hints), and adds the behaviour that makes a daemon usable on a busy desktop: rate limiting, replace-by-tag, per-app burst coalescing so a wake-from-suspend storm collapses into one card per app, an idle threshold, persistent history, Do Not Disturb, and per-app rules. It runs on any compositor implementing wlr-layer-shell-unstable-v1 — KDE Plasma, Hyprland, sway, river, Wayfire. Plasma integration (the native OSD event feed, global shortcuts, KWin background blur) is detected at runtime; everything it provides is also reachable over D-Bus for compositors that manage their own keybindings. %prep %autosetup -n %{name}-%{version} %build %cmake -GNinja %cmake_build # Run on every build, including COPR's. The tests need no display and no # session bus — they run offscreen against a temporary XDG tree — so a build # root can execute them, and a rebuild against a new Qt or KF6 proves the # behaviour still holds rather than only that it still compiles. %check %ctest %install %cmake_install install -Dpm0755 tools/demo-notifications.sh %{buildroot}%{_datadir}/%{name}/demo-notifications.sh install -Dpm0755 tools/stress-test.sh %{buildroot}%{_datadir}/%{name}/stress-test.sh install -Dpm0755 tools/verify-routing.sh %{buildroot}%{_datadir}/%{name}/verify-routing.sh install -Dpm0755 tools/input-audit.sh %{buildroot}%{_datadir}/%{name}/input-audit.sh %files %license LICENSE LICENSES/CC0-1.0.txt %doc README.md packaging/DEPENDENCIES.md %{_bindir}/glassosd %{_bindir}/glassosdctl %{_bindir}/glassosd-setup %{_mandir}/man1/glassosd.1* %{_mandir}/man1/glassosdctl.1* %{_mandir}/man5/glassosdrc.5* %{_datadir}/glassosd/themes/ %{_userunitdir}/glassosd.service %{_datadir}/dbus-1/services/org.freedesktop.Notifications.service %{_datadir}/dbus-1/services/org.freedesktop.impl.portal.desktop.glassosd.service %dir %{_datadir}/xdg-desktop-portal %dir %{_datadir}/xdg-desktop-portal/portals %{_datadir}/xdg-desktop-portal/portals/glassosd.portal %dir %{_datadir}/%{name} %{_datadir}/%{name}/demo-notifications.sh %{_datadir}/%{name}/stress-test.sh %{_datadir}/%{name}/verify-routing.sh %{_datadir}/%{name}/input-audit.sh %post cat <<'EOF' glassosd is installed. It is D-Bus activated, so the next application to post a notification will start it — but for the OSD and the notification centre you want it running for the whole session: systemctl --user enable --now glassosd.service On Plasma, turn off the built-in popups so they do not double up: kwriteconfig6 --file plasmarc --group OSD --key Enabled false To keep your existing notification daemon and use glassosd for the OSD only: glassosdctl set Enabled false EOF %postun # Only on uninstall, not on the removal half of an upgrade. # # The settings glassosd asks people to change are in their own config, so # neither rpm nor this script can revert them — and the one that bites is # Plasma's built-in OSD, which stays disabled after the package is gone. A # user removed glassosd entirely and was left with no volume or brightness # popups, with nothing connecting the two. if [ $1 -eq 0 ]; then cat <<'EOF' glassosd is removed, but two settings it may have changed are yours and stay as they are: glassosd-setup --undo restores both, asking before each If your volume and brightness popups have stopped appearing, that is Plasma's own OSD still switched off: kwriteconfig6 --notify --file plasmarc --group OSD --key Enabled true EOF fi %changelog * Mon Oct 12 2026 glassosd contributors - 0.3.2-1 - Fix a crash any application could cause with one notification: an image-data header whose size overflowed passed the length check, and the image was then read far past the end of its buffer - History and snoozed notifications are saved by replacing the file, so an interrupted save no longer leaves it truncated. A file that cannot be read is kept as .corrupt and logged instead of being overwritten - Limit what one notification can carry: 8 buttons, 1024 characters of summary, 64 KiB of body, 8 MiB of portal icon. Large images are scaled down when they arrive - The portal backend only accepts calls from xdg-desktop-portal, so the app id it records cannot be claimed by another process - A freedesktop replaces_id can no longer replace a portal notification - file:// icons are shown, and image-path takes precedence over app_icon as the specification says - glassosdctl set no longer warns about SnoozeMinutes, QuietWhileBusy, LockscreenPrivacy, Portal or Focus * Mon Oct 12 2026 glassosd contributors - 0.3.1-1 - Always answer the notification portal. If glassosd was started by the portal while another daemon was showing notifications, it declined, and the portal waited 25 seconds at every start and could fail outright. It now relays those notifications to whichever daemon is in charge, and says once why it was started - The glassosdrc man page now matches the keys glassosd reads: several were misnamed, three were under the wrong group, and six were missing - The rpm build runs the portal relay's tests on a private session bus * Fri Sep 25 2026 glassosd contributors - 0.3.0-1 - Serve the XDG desktop portal's notification backend, so Flatpaks reach glassosd directly instead of being relayed through xdg-desktop-portal-gtk or failing outright. Declares version 2, so sounds, categories, markup bodies, display hints and reply buttons are no longer stripped, and the app id arrives verified by the portal rather than claimed by the sender - Honour the portal's lock screen privacy hints, plus a LockscreenPrivacy setting that applies the same to senders that do not ask - Per-surface displays: NotifyOutput, OsdOutput and CentreOutput - Swipe a notification away, with a pointer or a finger - The popup's top row is configurable, and can be removed - The OSD draws its own icons, so it no longer depends on the icon theme shipping a large enough one; glassosdctl icons theme opts back in - Volume feedback sounds once at each end of a run rather than every step - Notification rules apply in a defined order rather than an arbitrary one - Ship a PKGBUILD, and put Plasma's OSD back when glassosd is removed - Unit tests for the queue, history, rules, sounds and the portal backend, run as part of both the rpm and Arch builds * Thu Sep 03 2026 glassosd contributors - 0.2.0-1 - Snooze, focus modes, sounds by freedesktop name, history search - Structured rule actions: run= and snooze= and repeat_window= - Auto Do Not Disturb while the screen is shared, and quiet-while-busy - Man pages: glassosd(1), glassosdctl(1), glassosdrc(5) - Popups now appear over fullscreen windows by default - Identical history entries collapse onto one counted row - glassosdctl export and import * Tue Aug 25 2026 glassosd contributors - 0.1.0-1 - First release.