Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A 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.

Inbox
ReportR-5068GitHub issuePublicReceived

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.

Received and recorded verbatim. Nothing has been checked yet.

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

Notification click does nothing for Telegram Desktop: "default" action trusted blindly + focus fallback can't match appName to window classrevision 1 · captured 2026-10-04 12:10 UTC via poll

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:

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:
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.