Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.
Notification click does nothing for Telegram Desktop: "default" action trusted blindly + focus fallback can't match appName to window class
Reported by MAXIDEA · filed Sep 13, 2026Closed upstream on 2026-09-21 by bjarneo via an automated message, as a duplicate of #7369 (R-1689). GitHub close reason: completed.
At a glance
- 1 · What is claimed?
- Only the report text below — no validator has restated it as checkable claims yet.
- 2 · What does it affect?
- Not yet mapped to any requirement or component.
- 3 · Is it reproducible?
- No validation has been run yet.
- 4 · What remains unclear?
- Not validated yet: no claims, no reproducer.
- 5 · What happens next?
- Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.
Original report
What happens
Clicking a toast notification from Telegram Desktop (running) dismisses the toast but never focuses/raises Telegram's window. Nothing visible happens. The same flow works for e.g. WhatsApp Web (notifications sent by Chrome).
Why — two independent defects
1. A registered `default` action is trusted blindly and skips the focus fallback.
In shell/plugins/notifications/Service.qml, invokePopupDefault() invokes the notification's "default" action when the app registers one, and then only runs if (!invoked) focusApp(entry). Telegram Desktop registers a default ("Open") action but does not raise its window when it receives ActionInvoked on Linux — so the click visibly does nothing.
2. The focus fallback fails when appName differs from the window class.
focusApp() passes only entry.app to bin/omarchy-hyprland-focus-app, which substring-matches the app name against the Hyprland window class. Telegram sends appName "Telegram Desktop" while its window class is org.telegram.desktop — the space makes the match fail and the helper exits 1 silently. entry.appIcon (which equals the class here) is never tried.
Chrome-sent notifications (WhatsApp Web) work only because appName Chrome happens to substring-match class chrome-web.whatsapp.com__-Default.
Evidence
dbus-monitor while clicking a real Telegram toast:
Notify(...) actions: ["default", "Open", "mail-mark-read", "Mark as read"]
ActionInvoked(id=10, "default") <- shell invokes it
NotificationClosed(id=10, 2) <- toast dismissed, window never raisedDeterministic reproduction
No mouse needed (omarchy-shell notifications invokeLast runs the same code path as clicking the toast); watch focus with hyprctl activewindow -j | jq -r .class:
N() { gdbus call --session --dest org.freedesktop.Notifications \
--object-path /org/freedesktop/Notifications \
--method org.freedesktop.Notifications.Notify "$@" ; }
# A: Telegram-like — appName "Telegram Desktop", app_icon set, default action that nobody handles
N "Telegram Desktop" 0 "org.telegram.desktop" "Repro A" "body" "['default','Open']" {} 0
omarchy-shell notifications invokeLast # -> focus unchanged
# B: no default action, appName != window class
N "Telegram Desktop" 0 "org.telegram.desktop" "Repro B" "body" [] {} 0
omarchy-shell notifications invokeLast # -> focus unchanged
# C: appName == window class -> works
N "org.telegram.desktop" 0 "org.telegram.desktop" "Repro C" "body" [] {} 0
omarchy-shell notifications invokeLast # -> Telegram focusedValidated fix (tested locally by cloning the plugin)
- In
invokePopupDefault(): still invoke thedefaultaction when present (it may do useful side work), but always callfocusApp(entry)— a toast click must always jump to the app. - In
focusApp(): tryentry.appIconas a first match candidate (it is typically the desktop-file id and usually equals the window class), then fall back toentry.app:
function focusApp(entry) {
if (!entry) return
var candidates = []
if (entry.appIcon && String(entry.appIcon).length > 0) candidates.push(String(entry.appIcon))
if (entry.app && String(entry.app).length > 0) candidates.push(String(entry.app))
// run the helper once per candidate until one matches (exit 0)
}With this patch, clicking real Telegram toasts focuses the Telegram window reliably (verified against live notifications).
Minor related
Clicking entries in the notification history panel never opens/focuses the app — only live toasts are wired. Fine if intentional, but worth a look.
System
Omarchy 4.0.3-1 · Hyprland 0.56.2 · kernel 7.2.3-arch1-3 · AMD Ryzen 7 5700U (Lucienne iGPU).
The relevant code on current master (bin/omarchy-hyprland-focus-app, shell/plugins/notifications/Service.qml) matches the packaged 4.0.3.
Happy to submit a PR if the approach sounds good.
View raw text
### What happens
Clicking a toast notification from **Telegram Desktop** (running) dismisses the toast but never focuses/raises Telegram's window. Nothing visible happens. The same flow works for e.g. WhatsApp Web (notifications sent by Chrome).
### Why — two independent defects
**1. A registered `default` action is trusted blindly and skips the focus fallback.**
In `shell/plugins/notifications/Service.qml`, `invokePopupDefault()` invokes the notification's `"default"` action when the app registers one, and then only runs `if (!invoked) focusApp(entry)`. Telegram Desktop registers a `default` ("Open") action but does **not** raise its window when it receives `ActionInvoked` on Linux — so the click visibly does nothing.
**2. The focus fallback fails when appName differs from the window class.**
`focusApp()` passes only `entry.app` to `bin/omarchy-hyprland-focus-app`, which substring-matches the app name against the Hyprland window class. Telegram sends appName `"Telegram Desktop"` while its window class is `org.telegram.desktop` — the space makes the match fail and the helper exits 1 silently. `entry.appIcon` (which equals the class here) is never tried.
Chrome-sent notifications (WhatsApp Web) work only because appName `Chrome` happens to substring-match class `chrome-web.whatsapp.com__-Default`.
### Evidence
`dbus-monitor` while clicking a real Telegram toast:
```
Notify(...) actions: ["default", "Open", "mail-mark-read", "Mark as read"]
ActionInvoked(id=10, "default") <- shell invokes it
NotificationClosed(id=10, 2) <- toast dismissed, window never raised
```
### Deterministic reproduction
No mouse needed (`omarchy-shell notifications invokeLast` runs the same code path as clicking the toast); watch focus with `hyprctl activewindow -j | jq -r .class`:
```bash
N() { gdbus call --session --dest org.freedesktop.Notifications \
--object-path /org/freedesktop/Notifications \
--method org.freedesktop.Notifications.Notify "$@" ; }
# A: Telegram-like — appName "Telegram Desktop", app_icon set, default action that nobody handles
N "Telegram Desktop" 0 "org.telegram.desktop" "Repro A" "body" "['default','Open']" {} 0
omarchy-shell notifications invokeLast # -> focus unchanged
# B: no default action, appName != window class
N "Telegram Desktop" 0 "org.telegram.desktop" "Repro B" "body" [] {} 0
omarchy-shell notifications invokeLast # -> focus unchanged
# C: appName == window class -> works
N "org.telegram.desktop" 0 "org.telegram.desktop" "Repro C" "body" [] {} 0
omarchy-shell notifications invokeLast # -> Telegram focused
```
### Validated fix (tested locally by cloning the plugin)
- In `invokePopupDefault()`: still invoke the `default` action when present (it may do useful side work), but **always** call `focusApp(entry)` — a toast click must always jump to the app.
- In `focusApp()`: try `entry.appIcon` as a first match candidate (it is typically the desktop-file id and usually equals the window class), then fall back to `entry.app`:
```qml
function focusApp(entry) {
if (!entry) return
var candidates = []
if (entry.appIcon && String(entry.appIcon).length > 0) candidates.push(String(entry.appIcon))
if (entry.app && String(entry.app).length > 0) candidates.push(String(entry.app))
// run the helper once per candidate until one matches (exit 0)
}
```
With this patch, clicking real Telegram toasts focuses the Telegram window reliably (verified against live notifications).
### Minor related
Clicking entries in the notification **history** panel never opens/focuses the app — only live toasts are wired. Fine if intentional, but worth a look.
### System
Omarchy 4.0.3-1 · Hyprland 0.56.2 · kernel 7.2.3-arch1-3 · AMD Ryzen 7 5700U (Lucienne iGPU).
The relevant code on current `master` (`bin/omarchy-hyprland-focus-app`, `shell/plugins/notifications/Service.qml`) matches the packaged 4.0.3.
Happy to submit a PR if the approach sounds good.
Validation
Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.
Linked
Not linked to any known issue, other report or change yet.
Decision
Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.
No decision has been recorded yet.