17.11.2023, 21:39 Tags: EmacsLinux

Global org-todo capture in wayland

Ich nutze Ubuntu 23.04 mit Wayland. Hier funktioniert wmctrl nicht mehr. Damit konnte man unter X relativ einfach Applikationsfenster selektieren und in Fokus bringen. Für meinen TODO Capture habe ich das genutzt, um einen Global Shortcut zu setzen. Zusammen mit org-protocol und einem gestarteten Server kann man dabei das Emacs Fenster in den Vordergrund bringen, um für den Capture im Emacs Fenster zu landen.

Der folgende Code zeigt die Init im Emacs.

lisp
(server-start)
(defadvice raise-frame (after make-it-work (&optional frame) activate)
  "Replaced wmctrl with gnome extension for Ubuntu wayland"
     (call-process
     "busctl" nil nil nil "--user" "call" "org.gnome.Shell" "/de/lucaswerkmeister/ActivateWindowByTitle" "de.lucaswerkmeister.ActivateWindowByTitle" "activateBySubstring" "s" "GNU Emacs"))
(add-hook 'server-switch-hook 'raise-frame)

Hier wird ein emacs Server gestartet und eine hook Funktion definiert, die beim server-switch-hook ausgeführt werden soll. Da der Call des global shortcuts mit org-protocol den Server anspricht, führt dieser Hook dazu, das Emacs in den Vordergrund gebracht wird. Der call-process ist ein Aufruf eines dbus events, der mit Hilfe der GNOME-SHELL Erweiterung ActivateWindowByTitle, das Emacs Fenster in den Vordergrund bringt.

Um das ganze jetzt mit einem globalen Shortcut in Ubuntu zu versehen, muss man diesen in den Einstellungen unter "Keyboard" konfigurieren: Tastaturkombination festlegen und damit emacsclient org-protocol://capture?template=t rufen. Das führt dazu das der obige hook ausgeführt wird und das Fenster über den dbus event in den Vordergrund gebracht wird. Dann kann man bspw. direkt ein TODO eingeben und sich anschließend dem Weiterlesen zuwenden.