Skip to content

feat(hotkey): Hotkey ueber gsettings in beiden Sitzungen (#58) - #160

Open
Toqsick wants to merge 7 commits into
mainfrom
feature/58-q4-hotkey
Open

Toqsick wants to merge 7 commits into
mainfrom
feature/58-q4-hotkey

Conversation

@Toqsick

@Toqsick Toqsick commented Oct 29, 2026

Copy link
Copy Markdown
Owner

Was

Q4 aus Issue #58: Das globale Tastenkürzel kommt in beiden Sitzungen (Wayland und X11) über die Desktop-Mechanik (gsettings), nicht mehr über einen eigenen libkeybinder-Grab. Die Abhängigkeit hotkey_manager und das Paket libkeybinder-3.0-0 fliegen raus.

Dazu kommt eine Diagnosezeile in der Linux-Health-Seite: aktuelles Binding, Registrierungsstatus und die Anzahl verwaister custom*-Einträge — mit einem Button zum Aufräumen.

Bereich Änderung
lib/main.dart initHotkeyToShowUp() registriert den Desktop-Shortcut immer (vorher: Wayland vs. X11 unterschieden)
lib/layouts/main_screen/main_search.dart SearchFieldShortcuts: Pfeil hoch/runter, Escape, Strg+D über Actions + Shortcuts mit eigenen Intent-Typen — wirken nur, solange das Suchfeld im Fokus ist
lib/layouts/run_command_queue.dart Enter nativ behandelt; HotKey?-Feld und dispose-Logik entfallen
lib/layouts/after_installation/activate_hotkey.dart Desktop-Shortcut wird in beiden Sitzungen registriert (vorher ein X11-Workaround gegen die Doppel-Auslösung)
lib/services/hotkey_diagnostics.dart (neu) HotkeyDiagnostics.loadReport() / .cleanupOrphans(), HotkeyReport, HotkeyOrphan
lib/services/linux.dart getHotkeyReport() / cleanupHotkeyOrphans() — Argumentliste, kein Shell-String
lib/layouts/linux_health/overview.dart HotkeyStatusRow — Binding, Status, Waisen, Aufräumen-Button
additional/python/keybinding_files.py Reine Regeln: find_orphans, remove_orphans, our_entries, build_report, next_custom_name, Desktop-/Session-Erkennung — ohne Desktop-Session testbar
additional/python/setup_keybinding.py Neue Modi --report und --cleanup; Verhalten ohne Argument unverändert
pubspec.yaml, pubspec.lock hotkey_manager raus
linux/flutter/generated_plugin_registrant.cc, linux/flutter/generated_plugins.cmake Von flutter pub get neu erzeugt — getrackte Dateien, ohne Regeneration bricht der Linux-Build
deb/DEBIAN/control libkeybinder-3.0-0 aus Depends: raus
README.md „Keyboard shortcut" auf einen Weg umgestellt
features.csv Neue Zeile Hotkey (gsettings), 21 Felder, Distributions-Spalten eingefroren
lib/l10n/*.arb (alle vier) 7 neue Keys in Deutsch, Englisch, Italienisch, Finnisch
docs/handoff/v0.8.6-q4-hotkey-gsettings.md (neu) Nachweis-Doc

Zusammengeführt aus drei Spuren (feature/58-q4-python, feature/58-q4-dart, feature/58-q4-packaging) mit disjunkten Dateimengen — der Merge war konfliktfrei.

Verifiziert

bash /workspace/tools/run-mla-gates.sh auf dem gemergten Baum — echte Exitcodes, nicht die von tail:

Gate Ergebnis
flutter pub get OK
tool/check-versions.sh OK
dart format OK — 135 Dateien, 0 geändert
flutter analyze OK — No issues found!
flutter test OK — 314 Tests (297 Baseline + 17 neue)
Python-Root-Runner OK — 102 Tests (62 Baseline + 40 neue)
GTK-Token-Gate OK — 96 Tests (2 skipped)
packages/la_core OK — 0 Findings, 68 Tests

GATES_EXIT=0 — ALLE GATES GRÜN.

Neu dazugekommen:

  • 17 Dart-Tests in test/q4_hotkey_test.dart — Report-Parsing, Fehlerpfade (kaputtes JSON, fehlende Felder, falsche Typen) und drei Widget-Tests als eigentlicher Beweis: arrow down moves the selection in the result list, escape empties the search field, the keys only work while the search field has the focus.
  • 40 Python-Tests in additional/python/tests/test_keybinding_report.py — darunter der entscheidende: fremde custom*-Einträge (firefox, thunderbird) werden weder als Waise erkannt noch entfernt, und ohne bekanntes Binding wird gar nichts gelöscht.

Zusätzlich per git diff geprüft: org.linux-assistant.operations.policy, die _privilegedEntryPoints-Liste in lib/services/linux.dart und der build-deb.sh-chmod sind nicht angefasst.

Risk-Register

Risiko Bewertung
Verhalten am Referenzsystem ungeprüft Der Gate „Hotkey holt das Fenster, Fokus im Suchfeld" braucht eine echte Desktop-Sitzung in Wayland und X11. Die Sandbox kann das nicht. Vor dem Merge auf Zorin OS 18.1 nachholen.
Der Shortcut hängt jetzt an der Desktop-Konfiguration Vorher griff die App das Key selbst; nachher registriert der Desktop es. Wer die Desktop-Einstellungen ändert, ändert den Shortcut. Deshalb die Diagnosezeile.
Der Cleanup löscht Benutzerdaten Deshalb die harte Grenze: our_entries() filtert zwingend auf command == "linux-assistant", und ohne bekanntes Binding wird nichts gelöscht. Mit Adversarial-Test belegt — fremde Einträge bleiben unangetastet.
X11-Doppelauslösung Auf X11 griffen vorher App-Grab und Desktop-Shortcut zu (das war der Grund für den bisherigen wayland ? … : true-Workaround). Jetzt gibt es nur noch den Desktop-Shortcut — das Double-Fire ist damit strukturell weg. Auf X11 gegenprüfen.
linux/flutter/generated_* sind getrackt Nach jedem Entfernen einer Plugin-Abhängigkeit müssen die generierten Dateien mit flutter pub get neu erzeugt werden, sonst bricht der Linux-Build. Hier passiert und behoben.
.github/workflows/build.yml nicht im PR Siehe „Deferred".

Deferred

  1. CI-apt-Zeile — manuelle Restarbeit. Die verbundene GitHub-App hat keine workflows-Permission und darf .github/workflows/* nicht schreiben; jeder Schreibzugriff dort wird abgelehnt. Die Änderung liegt in diesem Branch, ist aber nicht im PR enthalten.
    Manuell in .github/workflows/build.yml Zeile 71:
    - run: sudo apt-get install -y ninja-build libgtk-3-dev libkeybinder-3.0-0 libkeybinder-3.0-dev mesa-utils
    + run: sudo apt-get install -y ninja-build libgtk-3-dev mesa-utils
  2. Manuelle Abnahme auf dem Referenzsystem Zorin OS 18.1, Wayland und X11: Shortcut holt das Fenster, Fokus im Suchfeld, Binding stimmt, Cleanup räumt eine Wiese und lässt fremde Einträge unangetastet. (Issue [Vorbereitung] RV-1: Re-Verify von #45/#50/#42 über die gebaute App #51 führt den RV-1-Nachweis als eigenen Vorgang.)
  3. Q7 (Feedback an Upstream abklemmen) wartet auf Bastis Entscheidung und ist nicht Teil dieses PRs. Blockiert [V0.8.6] Welle 1 „Sofort-Nutzen": Q1–Q7 #58 nicht.
  4. build-bundle.sh und packaging/unmaintained/ referenzieren weiterhin libkeybinder. Beides ist geparkt und laut AGENTS.md ohnehin defekt bzw. unmaintained.

Nachweis-Doc: docs/handoff/v0.8.6-q4-hotkey-gsettings.md

Copilot AI lite review requested due to automatic review settings October 29, 2026 23:43

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

Toqsick commented Oct 29, 2026 •

Copy link
Copy Markdown
Owner Author

⚠️ Manuelle Restarbeit: eine Zeile in der CI

Die verbundene GitHub-App hat keine workflows-Permission und darf .github/workflows/* nicht schreiben — jeder Schreibzugriff dort wird abgelehnt. Die Änderung an der CI-apt-Zeile liegt in diesem Branch, ist aber nicht im PR enthalten.

Bitte manuell nachziehen in .github/workflows/build.yml Zeile 71:

- run: sudo apt-get install -y ninja-build libgtk-3-dev libkeybinder-3.0-0 libkeybinder-3.0-dev mesa-utils
+ run: sudo apt-get install -y ninja-build libgtk-3-dev mesa-utils

Der Build läuft mit dieser Zeile auch grün (so wie der PR aktuell ist) — die beiden Pakete werden nur nicht mehr gebraucht, seit die App den Shortcut über die Desktop-Mechanik registriert und nicht mehr selbst greift.


Nachweis, dass die Abhängigkeit wirklich weg ist:

$ grep -rn "hotkey_manager" lib/ test/ pubspec.yaml pubspec.lock \
    deb/DEBIAN/control README.md linux/flutter/
(keine Treffer)
$ grep -rn "libkeybinder" lib/ test/ pubspec.yaml pubspec.lock \
    deb/DEBIAN/control README.md linux/flutter/
lib/layouts/after_installation/activate_hotkey.dart:54:              // itself there (libkeybinder) and the desktop shortcut on top of
lib/layouts/main_screen/main_search.dart:803:/// field did not have the focus, and they needed the native libkeybinder
lib/main.dart:102:  /// libkeybinder, and that had two problems: on X11 the app's grab and the

Diese drei Treffer sind ausschliesslich Kommentare, die den alten Mechanismus erklaeren (die App griff das Key selbst per libkeybinder). Es gibt keine Abhaengigkeit, keinen Import und keinen Aufruf mehr.

Ebenfalls im PR: pubspec.lock und die getrackten generierten Linux-Plugin-Dateien (linux/flutter/generated_plugin_registrant.cc, linux/flutter/generated_plugins.cmake) sind von flutter pub get neu erzeugt. Ohne diese Regeneration bricht der Linux-Build, weil das hotkey_manager_linux-Plugin nicht mehr gebaut wird — deshalb sind die drei Dateien Teil des PRs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants