Nucleus
Lifecycle

Launcher (Linux)

Badges de compte, barres de progression, drapeau urgent et menus quicklist via l'API Unity.

Les bureaux Linux n'ont pas d'"API Dock" — ils ont l'interface D-Bus com.canonical.Unity.LauncherEntry, supportée par GNOME, KDE, Plank, budgie-panel et compagnie. launcher-linux est un mapping Kotlin complet de cette interface, plus le protocole com.canonical.dbusmenu pour les quicklists du clic droit.

TL;DR

  • LinuxLauncherEntry.update(appUri, properties) — fixe le badge, la progress bar, l'urgence et le flag d'update en un seul signal D-Bus.
  • LinuxQuicklist(objectPath) — menus dynamiques avec callbacks, sous-menus, séparateurs, items toggle/radio.
  • Pure GLib/GIO via JNI — pas de JNA, pas de lib Java DBus.
  • Les icônes des quicklists passent par freedesktop-icons pour des noms symboliques type-safe.

Installation

dependencies {
    implementation("dev.nucleusframework:nucleus.launcher-linux:<version>")
}

Quickstart

Entrée launcher

import dev.nucleusframework.launcher.linux.*

val appUri = LinuxLauncherEntry.appUri("myapp.desktop")

LinuxLauncherEntry.setCount(appUri, 42)
LinuxLauncherEntry.setProgress(appUri, 0.65)

LinuxLauncherEntry.update(appUri, LauncherProperties(
    count = 5, countVisible = true,
    progress = 0.8, progressVisible = true,
    urgent = false,
))

Quicklist (menu clic droit)

import dev.nucleusframework.freedesktop.icons.FreedesktopIcon
import dev.nucleusframework.launcher.linux.*

val quicklist = LinuxQuicklist("/com/example/MyApp/Menu")

quicklist.listener = LinuxQuicklist.Listener { id ->
    when (id) {
        1 -> openNewWindow()
        2 -> openFile()
        8 -> exitApp()
    }
}

quicklist.setMenu(listOf(
    DbusmenuItem(id = 1, label = "Nouvelle fenêtre", icon = FreedesktopIcon.Action.WINDOW_NEW),
    DbusmenuItem(id = 2, label = "Ouvrir fichier",   icon = FreedesktopIcon.Action.DOCUMENT_OPEN),
    DbusmenuItem.separator(id = 3),
    DbusmenuItem(id = 8, label = "Quitter",
                 icon = FreedesktopIcon.Action.APPLICATION_EXIT,
                 disposition = DbusmenuItem.Disposition.ALERT),
))

LinuxLauncherEntry.update(appUri, LauncherProperties(quicklist = quicklist.objectPath))

Comment ça marche

L'API Unity Launcher est un protocole à signaux D-Bus : on émets un signal Update sur com.canonical.Unity.LauncherEntry avec l'URI de le .desktop et un dict de propriétés (count, progress, urgent, chemin quicklist, ...). Les shells s'y abonnent et rendent les changements sur le icône.

Nucleus fait tout ça à travers GLib/GIO via un bridge natif unique (pas de JNA, pas de reflection, pas de lib Java DBus). Chaque LinuxQuicklist lance son propre serveur D-Bus sur un thread dédié avec son GMainLoop, donc les requêtes du shell ne bloquent pas le UI. Les callbacks de clic reviennent sur l'EDT via SwingUtilities.invokeLater.

Le nom du .desktop compte : le shell s'en sert pour rattacher les signaux à le icône. Le nom auto-détecté (via NucleusApp.appId) suffit en général ; surcharge avec LinuxLauncherEntry.appUri("custom.desktop") si le packaging diverge.

Référence

LinuxLauncherEntry

MembreNotes
isAvailable: Booleanfalse hors Linux ou si la lib native n'a pas chargé.
appUri(desktopFileId)Construit l'URI application://<id> sujet du signal.
update(appUri, properties: LauncherProperties)Émet un seul signal Update avec tous les champs non nuls.
setCount / clearCount / setProgress / clearProgress / setUrgent / setUpdatingSucre par-dessus update(...).

LauncherProperties

count, countVisible, progress, progressVisible, urgent, quicklist (chemin du menu server), updating — tous nullables ; les nulls sont ignorés.

LinuxQuicklist

MembreNotes
objectPath: StringLe chemin D-Bus qu'on a bindé — passe-le à LauncherProperties(quicklist = ...).
listener: Listener?Callback de clic (Int) -> Unit.
setMenu(items: List<DbusmenuItem>)Remplace le layout. Le DE re-query sur le prochain GetLayout.
dispose()Détruit le serveur D-Bus.

DbusmenuItem

Item avec id, label (_ pour les mnemonics), icon (FreedesktopIcon), enabled, visible, type (STANDARD / SEPARATOR), toggleType (NONE / CHECKBOX / RADIO) et toggleState, shortcut, disposition, children.

DbusmenuItem.separator(id) pour les séparateurs.

Notes

  • Pour les items toggle, le protocole dbusmenu est sans état côté serveur — le shell re-query à chaque ouverture. Pour changer un état, ré-appelle setMenu(...) avec le nouveau toggleState.
  • Pour des progress bars cross-platform pures, voir taskbar-progress — qui délègue à launcher-linux sur Linux.
  • XFCE sans le docklike-plugin n'implémente pas l'API Unity. La détection marche mais le visuel n'apparaît pas.