← Zurück
2023-03-10

Side-Project #1 - ChatGPT Extension für GNOME


Eine einfache Erweiterung für GNOME, um ein ChatGPT-Overlay anzuzeigen. Im Hintergrund wird die OpenAI-API genutzt (API-Key wird benötigt). Github Projekt


Features

  • Light/Dark Mode
  • UI für Einstellungen
  • History löschen (STRG + L)
  • Optionales System Prompt

Lessons learned während dem Programmieren einer GNOME Extension

Dokumentation ist spärlich

GNOME Extensions werden in Javascript programmiert. Es gibt einen minimalen Developer Guide der den Einstieg in die Extension-Entwicklung erleichtert, aber die eigentliche Entwicklung ist nicht so einfach. Um zu verstehen wie produktive Extensions aufgebaut sind ist es hilfreich Source Code zu lesen:

Wichtige Quellen für Source Code sind:

Versionsunterschiede

Je nach verwendeter Version von GNOME werden unterschiedliche Versionen der Libraries verwendet. Um verschiedene Versionen gleichzeitig zu unterstützen, können spezifische Implementierungen erstellt werden und dann je nach Library-Version geladen werden.

Beispiel um Soup 2.4 und 3.0 zu supporten:

if (Soup.get_major_version() === 2) {
httpClient = Me.imports.HttpClientV1;
} else {
httpClient = Me.imports.HttpClientV2;
}

Development & Debugging

Um eine neue Version einer Extension zu testen muss zuerst der Source Code in den Extension Ordner kopiert werden. Danach muss die Extension neu geladen werden:

  • Mit X11 super easy:

    • ALT+F2 um Run-Command Dialog zu öffnen
    • 'r' eingeben um GNOME Shell neuzustarten
  • Mit Wayland, not so easy...

    • Entweder: Aus- und Einloggen
    • Oder: Nested Session starten
# Screen Size der Nested Session festlegen (sonst ist das Fenster minimal klein)
export MUTTER_DEBUG_DUMMY_MODE_SPECS=1920x768
# Nested Wayland Session starten
dbus-run-session -- gnome-shell --nested --wayland

Nächstes mal lieber ne GTK-App

Die Programmierung von Extensions ist begrenzt und weird. Eine normale native GTK-App mit System-Tray Icon ist vermutlich die bessere Alternative für die meisten Projekte (wird vielleicht das nächste Side-Project).