blob: a31f4fdea34dc3f04b5c5b640d7956efaec5588b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# Plasma Task Manager Notifications
Taskbar badge notifications for KDE Plasma 6. Dynamically discovers running applications via KWin, monitors desktop notifications via D-Bus, and sets badge counts on taskbar icons using the Unity Launcher API. No hardcoded app list needed.
## How it works
1. **Discovers apps dynamically** by querying KWin via D-Bus — enumerates open windows using `WindowsRunner.Match`, then calls `KWin.getWindowInfo` for each to get the `desktopFile` property. Rediscovers every 30 seconds in a background thread.
2. Runs an **unfiltered `dbus-monitor --session`** subprocess (unfiltered is required to capture method return messages which contain the assigned notification ID).
3. Parses the dbus-monitor output as a stream, tracking three message types:
- `method_call` with `member=Notify` — extract the `app_name` and message `serial`
- `method_return` with matching `reply_serial` — extract the notification ID
- `signal` with `member=NotificationClosed` — notification was dismissed
4. Matches `app_name` (case-insensitive) against the dynamically discovered app map. Also supports Flatpak apps via `desktop-entry` hints.
5. Emits `com.canonical.Unity.LauncherEntry.Update` signals via `gdbus emit` to set/clear badge counts and the `urgent` flag on the corresponding taskbar icon.
6. On shutdown (SIGINT/SIGTERM), clears all badges.
## Requirements
- KDE Plasma 6 with KWin and Task Manager
- `dbus-monitor` (from `dbus-tools`, typically pre-installed)
- `gdbus` (from `glib2`, typically pre-installed)
- Rust toolchain (to build)
## Install
```bash
git clone ssh://git@git.nmm.ee/asko/plasma-task-manager-notifications.git
cd plasma-task-manager-notifications
make install
```
This installs the binary to `~/.local/bin/` and the systemd service to `~/.config/systemd/user/`.
### Enable at login
```bash
systemctl --user enable --now notification-badge.service
```
### Check status
```bash
systemctl --user status notification-badge.service
journalctl --user -u notification-badge.service -f
```
## Uninstall
```bash
make uninstall
```
## Usage
Run manually (logs to stderr):
```bash
notification-badge
```
Test with a sample notification:
```bash
notify-send --app-name=firefox "Test" "Badge should appear"
```
## Development
```bash
cargo test # run all tests
cargo build # debug build
make build # release build
```
## Architecture
The crate is split into four modules:
| Module | Purpose |
|---|---|
| `parser` | Streaming parser for `dbus-monitor` text output |
| `app_map` | Tracks discovered apps, pending notifications, and active badge counts |
| `discovery` | Queries KWin D-Bus interfaces to discover running apps and their desktop file IDs |
| `badge` | Emits Unity LauncherEntry Update signals via `gdbus` |
All modules are designed for testability — external D-Bus calls are injected as function parameters in tests.
## Known limitations
- Processes all session bus traffic (unfiltered monitor). Lightweight in practice but could theoretically be optimized with `BecomeMonitor` D-Bus API.
- Only badges apps that currently have an open window. Pinned taskbar icons without a running instance won't be badged.
- If two apps share the same last dot-segment in their desktop file ID, they would collide in the match map. Unlikely in practice.
- Firefox web app notifications all badge under the single Firefox icon.
- Notifications that expire via timeout also emit `NotificationClosed`, so badges clear when notifications auto-dismiss.
## License
MIT
|