Nucleus
Lifecycle

Taskbar progress

Barres de progression natives dans le dock / la taskbar / le launcher Unity — pour les backends AWT et Tao.

Opération longue ? Peins la progression directement sur l'icône du dock, le bouton de la taskbar ou l'entrée du launcher Unity — l'utilisateur la voit sans ramener la fenêtre au premier plan. Une API par-dessus NSDockTile, ITaskbarList3 et com.canonical.Unity.LauncherEntry.

TL;DR

  • taskbar-progress — pour les backends AWT / JBR / JNI. Travaille sur java.awt.Window.
  • taskbar-progress-tao — même API en extension functions sur NucleusWindow, pour les apps Tao.
  • États : Normal, Indeterminate, Paused, Error, NoProgress. Plus les demandes d'attention (flash / rebond).
  • Fallback cross-platform : bridge natif absent ou DE non supporté = renvoie false, ne throw jamais.

Installation

Backends AWT / JBR / JNI :

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

Backend Tao — variante qui tire nucleus-application pour que les extensions soient sur NucleusWindow :

dependencies {
    implementation("dev.nucleusframework:nucleus.taskbar-progress-tao:<version>")
}

Quickstart

AWT / JBR / JNI

import dev.nucleusframework.taskbarprogress.TaskbarProgress
import java.awt.Window

TaskbarProgress.showProgress(window, 0.75)        // 75% Normal
TaskbarProgress.showIndeterminate(window)         // Pulsing
TaskbarProgress.showError(window, 1.0)            // Barre rouge
TaskbarProgress.hide(window)                      // Efface

TaskbarProgress.requestAttention(window)
TaskbarProgress.stopAttention(window)

En Compose :

@Composable
fun DownloadScreen() {
    val window = LocalWindow.current ?: return
    var progress by remember { mutableStateOf(0.0) }

    DisposableEffect(Unit) { onDispose { TaskbarProgress.hide(window) } }

    LaunchedEffect(Unit) {
        TaskbarProgress.showIndeterminate(window)
        downloadFlow.collect {
            progress = it.fraction
            TaskbarProgress.showProgress(window, progress)
        }
        TaskbarProgress.hide(window)
    }
}

Backend Tao

// À l'intérieur d'un NucleusDecoratedWindowScope
nucleusWindow.setTaskbarProgress(0.42)
nucleusWindow.showTaskbarIndeterminate()
nucleusWindow.showTaskbarError()
nucleusWindow.hideTaskbarProgress()
nucleusWindow.requestTaskbarAttention()

Comment ça marche

OSMécanisme
WindowsCOM ITaskbarList3::SetProgressValue + SetProgressState, plus FlashWindowEx pour l'attention. COM initialisé paresseusement.
macOSNSDockTile avec un NSProgressIndicator custom rendu en bas de l'icône. NSApplication.requestUserAttention pour l'attention. Tous les appels AppKit passent en main thread via dispatch_sync.
LinuxD-Bus com.canonical.Unity.LauncherEntry via GLib/GIO. Délègue à launcher-linux.

Sur macOS la progression est app-wide

macOS affiche un seul indicateur par application. Le paramètre window est accepté pour la cohérence d'API mais l'indicateur s'applique au dock tile de l'app, pas à une fenêtre précise.

La variante Tao expose les mêmes opérations en extensions sur NucleusWindow. En interne elle route vers le bon bridge natif par OS — même noyau que la variante AWT, juste un handle différent.

Sur Linux, le module a besoin du nom de le .desktop. L'auto-détection essaie (dans cet ordre) NucleusApp.appId, GIO_LAUNCHED_DESKTOP_FILE, BAMF_DESKTOP_FILE_HINT, /proc/self/exe, puis scan du répertoire XDG applications. Surcharge via TaskbarProgress.linuxDesktopFilename = "com.example.myapp.desktop" si besoin.

Référence

TaskbarProgress (AWT)

Toutes les méthodes acceptent une java.awt.Window et renvoient Boolean.

Méthode
isAvailable(): Boolean
setProgress(window, value: Double)0.0–1.0 (clampé).
setState(window, state: State)
showProgress(window, value)Normal + valeur.
showError(window, value = 1.0)Error + valeur.
showIndeterminate(window)
showPaused(window, value = 1.0)
hide(window)NoProgress.
requestAttention(window) / stopAttention(window)Flash taskbar / rebond dock.

TaskbarProgress.State

ÉtatWindowsmacOSLinux
NoProgressPas d'overlayEnlevéprogress-visible: false
IndeterminatePulsation vertePulsationDépend du DE
NormalBarre verteBarre bleueBarre accent
ErrorBarre rougeBarre rougeurgent: true
PausedBarre jauneBarre jauneMappé sur progress

Extensions Tao sur NucleusWindow

setTaskbarProgress, setTaskbarState, showTaskbarProgress, showTaskbarError, showTaskbarIndeterminate, showTaskbarPaused, hideTaskbarProgress, requestTaskbarAttention, stopTaskbarAttention. Toutes renvoient Boolean.

Plus un helper Compose : @Composable fun rememberTaoTaskbarProgress(): TaoTaskbarProgressScope? pour un usage déclaratif.

Notes

  • En AWT, récupère la fenêtre via LocalWindow.current ou le scope Window / DecoratedWindow.
  • Cache la progression dans un onDispose pour éviter de laisser une barre fantôme quand le composable sort de l'arbre.
  • Pour les quicklists / badges Linux non liés à la progression, vois launcher-linux directement.