Nucleus
OS integration

Icônes FreeDesktop

Constantes Kotlin typées pour les noms définis par la FreeDesktop Icon Naming Specification.

freedesktop-icons fournit les noms d'icônes standards de la FreeDesktop Icon Naming Specification sous forme de constantes Kotlin typées. Les thèmes d'icônes Linux résolvent les icônes par nom : au lieu de livrer info.png, vous référencez dialog-information et le thème actif en rend sa propre version. Les autres modules Linux de Nucleus acceptent ces constantes partout où ils attendent une icône.

Ajouter la dépendance

build.gradle.kts
dependencies {
    implementation("dev.nucleusframework:nucleus.freedesktop-icons:2.0.7")
}

notification-linux et launcher-linux exposent freedesktop-icons via api(). Si vous dépendez déjà de l'un d'eux, les constantes sont sur votre classpath sans déclaration séparée.

Référencer une icône

Chaque icône est une valeur de l'interface scellée FreedesktopIcon. Choisissez une constante dans l'enum de catégorie qui correspond au contexte de l'icône :

import dev.nucleusframework.freedesktop.icons.FreedesktopIcon

val info = FreedesktopIcon.Status.DIALOG_INFORMATION
val open = FreedesktopIcon.Action.DOCUMENT_OPEN
val printer = FreedesktopIcon.Device.PRINTER

Pour un nom hors spec, un chemin de fichier ou une URI file://, utilisez FreedesktopIcon.Custom :

val named = FreedesktopIcon.Custom("my-app-icon")           // recherche par nom dans le thème
val path = FreedesktopIcon.Custom("/home/user/icon.png")    // chemin absolu
val uri = FreedesktopIcon.Custom("file:///home/user/icon.png")

FreedesktopIcon.flag construit un nom de drapeau à partir d'un code ISO 3166-1 alpha-2 :

val flag = FreedesktopIcon.flag("fr")   // FreedesktopIcon.Custom("flag-fr")

Fonctionnement

Chaque constante porte une chaîne value qui contient son nom spec — DIALOG_INFORMATION donne "dialog-information". Custom et flag enveloppent des chaînes arbitraires dans le même type, si bien qu'un FreedesktopIcon est toujours un nom qu'un thème peut résoudre.

Quand vous passez un FreedesktopIcon à un module Linux — notifications, quicklists du launcher — la value est envoyée sur D-Bus ou écrite en clair dans un fichier .desktop. Le thème d'icônes actif du système transforme ce nom en image concrète au moment du rendu, donc l'application suit le thème de l'utilisateur sans embarquer aucun bitmap.

Les constantes sont de simples chaînes et compilent donc sur toutes les plateformes. Hors Linux, elles ne produisent rien de visible, faute de thème FreeDesktop.

Référence de l'API

Catégories

FreedesktopIcon est une interface scellée. Chaque catégorie est un enum dont les entrées correspondent à des noms spec ; Custom est une value class pour tout le reste.

CatégorieExemples
FreedesktopIcon.ActionDOCUMENT_OPEN, EDIT_COPY, MEDIA_PLAYBACK_START
FreedesktopIcon.AnimationPROCESS_WORKING
FreedesktopIcon.ApplicationACCESSORIES_TEXT_EDITOR, MULTIMEDIA_VOLUME_CONTROL, UTILITIES_TERMINAL
FreedesktopIcon.CategoryAPPLICATIONS_INTERNET, PREFERENCES_DESKTOP, SYSTEM_HELP
FreedesktopIcon.DevicePRINTER, CAMERA_PHOTO, INPUT_KEYBOARD
FreedesktopIcon.EmblemIMPORTANT, FAVORITE, SHARED
FreedesktopIcon.EmoteFACE_SMILE, FACE_SAD, FACE_WINK
FreedesktopIcon.MimeTypeTEXT_X_GENERIC, IMAGE_X_GENERIC, X_OFFICE_DOCUMENT
FreedesktopIcon.PlaceFOLDER, USER_HOME, NETWORK_SERVER
FreedesktopIcon.StatusDIALOG_INFORMATION, DIALOG_WARNING, BATTERY_LOW
FreedesktopIcon.Customvalue class pour noms bruts, chemins de fichier ou URIs file://

Construire une icône custom

FreedesktopIcon.Custom(value: String) est une value class inline. Sa value est utilisée telle quelle, qu'il s'agisse d'un nom de thème, d'un chemin absolu ou d'une URI file://.

Construire un drapeau de pays

FreedesktopIcon.flag(countryCode: String) met le code en minuscules et retourne Custom("flag-<code>") :

FreedesktopIcon.flag("us")   // Custom("flag-us")
FreedesktopIcon.flag("jp")   // Custom("flag-jp")

Notes

  • Tous les thèmes n'implémentent pas tous les noms d'icônes. Rester sur le set canonique FreeDesktop donne le meilleur taux de correspondance.
  • Les drapeaux ne font pas partie de la spec FreeDesktop et dépendent d'un thème qui fournit des noms flag-<code>.

Et ensuite

  • Notifications Linux — passez un FreedesktopIcon comme icône de notification.
  • Launcher Linux — réutilisez les mêmes constantes dans les actions .desktop.
  • Barre système — définissez une icône de tray par thème via son nom.