Portál AbcLinuxu, 30. dubna 2025 10:17
Type
, Name
a Exec
, jsem si přečetl
specifikaci (a poznámky
zveřejním zde, když už jsem si ten blog založil).
V textu budu průběžně odkazovat na specifikaci verze 1.5 (jednostránkovou verzi), aby bylo snažší dohledat podrobnosti. Z této specifikace vycházím, ale tento můj text je značně zkrácený a zjednodušený.
Soubory popisující adresář se jmenují .desktop
, ostatní končí na .desktop
. Systém by
měl být schopen fallbacku na magickou detekci.
Pro aplikace by mělo platit to, že text před .desktop
je D-Bus well-known name, tedy
něco ve stylu Javovských jmenných prostorů – posloupnost částí (min. jedna) oddělených tečkou, kde každá část
nezačíná číslicí a je ze znaků [A-Za-z0-9-_]
.
Vezmu cestu relativně k adresáři v $XDG_DATA_DIRS
, odeberu prefix applications/
a nahradím
lomítka tečkami. Dostanu ID desktop souboru. Pokud je více souborů se stejným ID, má přednost ten ze dříve uvedeného
adresáře.
Soubor je podobný tzv. INI souborům. Je v UTF-8, řádky končí LF. Formát je case-sensitive.
Komentáře
uvozujeme #
,
skupiny
řádkem s názvem v hranaté závorce.
Soubor začíná magickým stringem [Desktop Entry]
, který zároveň uvozuje první skupinu.
Údaje jsou typu klíč-hodnota, kde klíč je tvořen malými, velkými, číslicemi a spojovníkem (0x2d).
Typy jsou string (jen tisknutelné ASCII), localestring (UTF-8 string pro uživatele), iconstring
(cesty a názvy ikon, UTF-8), boolean (true
, false
) numeric (float dle
scanf
s %f
v C
locale).
Stringové typy rozumí escape sekvencím \s
(pro 0x20), \n
, \t
, \r
,
a \\
.
Seznamy se v hodnotě oddělují středníkem, můžeme ho pak escapovat \;
.
Loklizované údaje značíme hranatou závorkou s locale hned za názvem klíče. Text závorky je ve formátu
lang_COUNTRY.ENCODING@MODIFIER
. Čím více toho uvedeme, tím vyšší má přednost.
Type
, který nabývá hodnot Application
, Link
, nebo Directory
.
Version
, tedy hodnota 1.5
(k době psaní textu).
Pokud je Type
rovno Link
, pak ještě URL
.
Name
(např. „KWrite“) a GenericName
(např. „Textový editor“) — název aplikace
Comment
— Poznámka pro uživatele
NoDisplay
(boolean) — Skrýt v UI
Hidden
(boolean) — Používá se pro smazání, pokud nemá uživatel přístup k systémovým Desktop souborům
OnlyShowIn
a NotShowIn
(alespoň jeden string) — Omezujeme na daná desktopová prostředí, dle
$XDG_CURRENT_DESKTOP
.
DBusActivatable
(boolean) — Aplikace se bude
aktivovat po
D-Busu místo spuštění
TryExec
— Položka se má ignorovat pokud soubor na této cestě není spustitelný
Exec
— Spustitelný soubor (tato položka má svá specifika – viz níže)
Path
— pracovní adresář
Terminal
(boolean) — označuje terminálovou aplikaci
Actions
— alternativní akce pro aplikaci, nebudu se rozepisovat, více v specifikaci
MimeType
(alespoň jeden string) — MIME typy otvírané aplikací
Categories
, Keywords
(alespoň jeden string) — více viz
specifikaci desktop menu
Implements
— Pro D-Bus, více viz specifikaci
StartupNotify
, StartupWMClass
— Kolem ukazování průběhu spouštění, má svůj
protokol
Exec
a jeho specifika
Exec
je buď absolutní cesta, nebo název programu (hledá se v $PATH
). Nultý argument by neměl
obsahovat rovnítko. Pokud použijeme uvozovky, tak dvojité a escapujeme backtick, dolar
a zpětné lomítko zpětným lomítkem.
Rezervované znaky: 0x20, 0x9, 0xd a "'\><~|&;$*?#()`
Exec
%f
— právě jeden lokální soubor k otevření
%F
— více lokálních souborů k otevření
%u
— právě jedno URL či lokální cesta k otevření
%U
— více URL či cest k otevření
%i
— ikona jako --icon cestaKIkoně
(pokud není ikona, tak nic)
%c
— název tak, jak se ukázal (tj. lokalizovaný/přeložený)
%k
— cesta či URI desktop souboru
%%
— %
doslovně
S %f
a %u
by měl být spuštěn program pro každý soubor zvlášť.
S %f
a %F
se soubor překopíruje na lokální úložiště, je-li to nutné.
Nejde uvést více než jednu proměnnou ze sady %f
, %F
, %u
, %U
.
Použití proměnné v uvozovkách způsobí nedefinované chování.
Tiskni
Sdílej:
supr článeček akorátže nemam naploše vůůbec žádný ikonky takže se nemužu kouknout jestli to jakoby fakt všecko sedí :D
jj máte voba pravdu tam jich je moc :O :D
Pěkný zápisek. Tyhle specifikace jsem před nedávnem taky studoval, když jsem psal parser INI souborů. Ty .desktop
soubory jsou jeden z dialektů. Ještě to není úplně odladěné a vydané, ale celkem už mi to funguje :-)
$ cat /usr/share/applications/org.kde.konsole.desktop \ | relpipe-in-ini --enable-sub-keys true \ | relpipe-tr-awk \ --relation "ini" - --where 'sub_key == "cs" || key !~ "Name|Comment|GenericName"' \ | relpipe-out-tabular ini: ╭──────────────────────────┬───────────────────────┬──────────────────┬─────────────────────────────────╮ │ section (string) │ key (string) │ sub_key (string) │ value (string) │ ├──────────────────────────┼───────────────────────┼──────────────────┼─────────────────────────────────┤ │ Desktop Entry │ Type │ │ Application │ │ Desktop Entry │ TryExec │ │ konsole │ │ Desktop Entry │ Exec │ │ konsole │ │ Desktop Entry │ Icon │ │ utilities-terminal │ │ Desktop Entry │ Terminal │ │ false │ │ Desktop Entry │ Categories │ │ Qt;KDE;System;TerminalEmulator; │ │ Desktop Entry │ Actions │ │ NewWindow;NewTab; │ │ Desktop Entry │ X-DocPath │ │ konsole/index.html │ │ Desktop Entry │ X-DBUS-StartupType │ │ Unique │ │ Desktop Entry │ StartupNotify │ │ true │ │ Desktop Entry │ X-KDE-AuthorizeAction │ │ shell_access │ │ Desktop Entry │ Name │ cs │ Konsole │ │ Desktop Entry │ GenericName │ cs │ Terminál │ │ Desktop Entry │ Comment │ cs │ Přístup k příkazové řádce │ │ Desktop Action NewWindow │ Name │ cs │ Otevřít nové okno │ │ Desktop Action NewWindow │ Exec │ │ konsole │ │ Desktop Action NewTab │ Name │ cs │ Otevřít novou kartu │ │ Desktop Action NewTab │ Exec │ │ konsole --new-tab │ ╰──────────────────────────┴───────────────────────┴──────────────────┴─────────────────────────────────╯ Record count: 18
Mimochodem, hodně podobné jsou konfiguráky systemd, akorát tam mají jednu záludnost/odlišnost kolem zalamování řádků… to ještě nemám implementované.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.