summaryrefslogtreecommitdiff
path: root/README.md
blob: f4878ca3ffe40f3d7ea4bbb75caaba8c454c09b9 (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 https://github.com/example/notification-badge.git
cd notification-badge
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