Nucleus
Lifecycle

Launcher (Windows)

Overlays taskbar, jump lists, badges et boutons de thumbnail toolbar sur Windows.

La taskbar Windows est la seconde surface de le app. Une overlay rouge dit "il y a un souci". Une jump list dit "voici ce qu'on fait le plus souvent". Un thumbnail toolbar offre des contrôles transport sans focuser la fenêtre. launcher-windows expose les quatre morceaux du shell Windows qui pilotent tout ça.

TL;DR

  • Quatre API dans un module — utiliser ce dont on a besoin :
    • WindowsOverlayIcon — petite icône 16x16 sur le bouton de la taskbar (tous formats de packaging).
    • WindowsJumpListManager — catégories et tâches dans le menu clic-droit de la taskbar (tous formats).
    • WindowsThumbnailToolbar — jusqu'à 7 boutons dans la preview du thumbnail (tous formats).
    • WindowsBadgeManager — compte numérique / badge glyphe sur le bouton et la Start tile (APPX / MSIX uniquement).
  • Tout passe par COM Windows (ITaskbarList3) ou WinRT en dessous ; les clics reviennent sur l'EDT AWT.
  • Les clics jump list lancent un nouveau process — combine avec SingleInstanceManager + DeepLinkHandler pour les renvoyer vers la primaire.

Installation

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

Quickstart

Overlay

import dev.nucleusframework.launcher.windows.*

WindowsOverlayIcon.set(
    window,
    TaskbarIconSource.FromStock(StockIcon.WARNING),
    description = "1 message non lu",
)
WindowsOverlayIcon.clear(window)

Jump list

WindowsJumpListManager.setCategories(
    categories = listOf(
        JumpListCategory("Récents", items = listOf(
            JumpListItem("Projet A", arguments = "myapp://open?project=a"),
            JumpListItem("Projet B", arguments = "myapp://open?project=b"),
        )),
    ),
    tasks = listOf(
        JumpListItem("Nouvelle fenêtre", arguments = "myapp://new"),
        JumpListItem.SEPARATOR,
        JumpListItem("Préférences", arguments = "myapp://settings"),
    ),
)

Thumbnail toolbar

WindowsThumbnailToolbar.setButtons(
    window,
    buttons = listOf(
        ThumbnailToolbarButton(id = 0, tooltip = "Précédent", icon = TaskbarIconSource.FromStock(StockIcon.MEDIA_REWIND)),
        ThumbnailToolbarButton(id = 1, tooltip = "Lecture",   icon = TaskbarIconSource.FromStock(StockIcon.MEDIA_PLAY)),
        ThumbnailToolbarButton(id = 2, tooltip = "Suivant",   icon = TaskbarIconSource.FromStock(StockIcon.MEDIA_FORWARD)),
    ),
    onClick = { id -> handleTransport(id) },
)

Badge (APPX / MSIX seulement)

WindowsBadgeManager.setBadge(window, BadgeGlyph.NEW_MESSAGE)
WindowsBadgeManager.setBadge(window, count = 5)

Comment ça marche

Le module embarque des bridges natifs qui parlent directement au shell Windows :

  • Overlay et thumbnail toolbar passent par l'interface COM ITaskbarList3, keyée par le HWND de la java.awt.Window. COM est initialisé paresseusement.
  • Jump lists passent par ICustomDestinationList — Windows possède le menu, donc les clics ne passent pas par le process. L'OS lance un nouvel .exe avec les arguments de l'item ajoutés en ligne de commande. Combine avec SingleInstanceManager + DeepLinkHandler pour les rediriger vers la primaire.
  • Badges demandent un AUMID (Application User Model ID) que Windows n'accorde qu'aux apps packagées. D'où la limitation APPX/MSIX. L'AUMID est dérivé de NucleusApp.aumid / appId.

Les trois autres API marchent aussi pour les apps non packagées — on peut livrer un .exe Win32 et avoir quand même jump list, overlay et thumbnail toolbar.

Référence

Stock icons

Toute API qui accepte une icône prend un TaskbarIconSource :

  • TaskbarIconSource.FromStock(stockIcon) — 94 icônes du shell Windows (StockIcon.WARNING, .ERROR, .SHIELD, .MEDIA_PLAY, ...). Pas de fichier à fournir.
  • TaskbarIconSource.FromFile(path) — fichier .ico sur disque.
  • TaskbarIconSource.FromResource(dllPath, index) — index d'icône dans une DLL de resources.

Éléments jump list

TypeUsage
JumpListCategory(name, items)Groupe nommé custom.
JumpListItem(title, arguments, icon?, description?)Une entrée cliquable.
JumpListItem.SEPARATORSéparateur (tasks uniquement).
KnownCategory.Recent / FrequentLaisse Windows peupler depuis les file associations.

Boutons thumbnail

ThumbnailToolbarButton(id, tooltip, icon?, enabled, hidden, noBackground, dismissOnClick, nonInteractive) — les boutons persistent pour la durée de vie de la fenêtre ; unregister(window) les cache, setButtons les ré-affiche.

Badges

WindowsBadgeManager.setBadge(window, glyph) / setBadge(window, count = 5) / clear(window). Glyphes : NEW_MESSAGE, ALERT, BUSY, AWAY, AVAILABLE, ERROR, etc.

Notes

  • Les jump list items demandent un vrai exécutable. Ils ne se déclenchent pas en ./gradlew run — teste depuis runDistributable ou un build packagé.
  • Pour des progress bars cross-platform dans le bouton de taskbar (pas l'overlay), utilise taskbar-progress.
  • Le module embarque la metadata reachability GraalVM — pas de config manuelle pour native-image.