UHU-menü

Egységes menürendszer az UHU-Linux különféle ablakkezelőihez


Bevezetés

Az UHU-Linux 1.1-es változatától kezdve az alkalmazásokat egységes menürendszerbe szervezzük. Ez a menürendszer fogadja a felhasználót szinte mindegyik grafikus környezetben, név szerint BlackBox, Enlightenment, Fluxbox, FVWM, Gnome, IceWM, KDE, Sawfish, Window Maker és Xfce alatt.

A menüt azonban a különböző ablakkezelők különböző formátumban várják, így szükség van egy programra, amely egy közös forrásból előállítja a sok különböző formátumot. Ezt végzi az uhu-menu program.

Habár az uhu-menu több különböző formátumban is képes beolvasni a menüt, ebben a leírásban csak az UHU-Linuxban használt bemeneti formátumot tárgyaljuk.


Szerkezet

A menü felépítését a /usr/lib/applications és /usr/lib/desktop-directories könyvtárak fájljai határozzák meg. Előbbi könyvtár alól csak a .desktop, utóbbi alól csak a .directory kiterjesztésű fájlokat vesszük figyelembe. A ponttal kezdődő (rejtett) fájlokat figyelmen kívül hagyjuk. Ezeket leszámítva a fájlok neve teljesen közömbös, nem hordoz semmilyen információt; a fájlok átnevezése nem változtat a menü felépítésén.

A /usr/lib/applications alatt található .desktop fájlok egy-egy konkrét alkalmazásindító menübejegyzés tulajdonságait rögzítik, mint például a futtatandó parancs, a menüben megjelenítendő ikon, az ott kiírandó név több nyelven, vagy éppen a bejegyzés helye a menüszerkezetben. A /usr/lib/desktop-directories alatti .directory fájlok hasonló módon az almenünyitó bejegyzések tulajdonságait rögzítik.

Ezek a fájlok nemcsak a menü felépítésében játszanak szerepet, például az UHU-Linux alap beállításaiban Gnome és KDE felső paneljein lévő alkalmazás-ikonok is a /usr/lib/applications könyvtár .desktop fájljaiból szedik a tulajdonságokat.

Az uhu-menu parancs a fenti fájlok alapján készíti el a menüt a /usr/lib/menu könyvtár alá, minden ablakkezelő számára külön könyvtárat nyitva. Ha tehát /usr/lib/menu alatt változtatunk valamit, az a változás az uhu-menu következő futásakor elvész, felülíródik.

Az egyes ablakkezelők ezt a /usr/lib/menu/ablakkezelőneve könyvtár alatt lévő, az uhu-menu által készített menüt használják, a /usr/lib/applications és /usr/lib/desktop-directories könyvtárak tartalmát nem figyelik. Ha tehát globálisan (minden ablakkezelőre, minden felhasználó számára) változtatni kívánunk a menü felépítésén, akkor a /usr/lib/applications és /usr/lib/desktop-directories könyvtárak tartalmát kell igényeink szerint módosítani, majd lefuttatni az uhu-menu parancsot, természetesen rendszergazdaként.

Fontos megjegyezni, hogy az ablakkezelők többsége sajnos nem veszi észre, ha megváltozik a menü a fájlrendszerben. Így miután megváltoztattuk a rendszerszintű menüt, általában szükség van a grafikus felületből ki- és újból bejelentkezésre ahhoz, hogy az új menüt lássuk. Némely ablakkezelőnél (például IceWM) lehetőség van annak kilépés nélküli újraindítására. Gnome-ban pediig az alábbi trükkhöz folyamodhatunk: indítsunk egy xkill programot, majd a négyzet alakú egérkurzorral kattintsunk a panelra.

Az UHU-Linux rendszerben az uhu-menu parancs automatikusan lefut, valahányszor olyan programot telepítünk, frissítünk vagy távolítunk el, amely szállít fájlt /usr/lib/applications vagy /usr/lib/desktop-directories alá. Továbbá valamely ablakkezelő, illetve maga az uhu-menu telepítésekor, illetve frissítésekor is lefut a program.

Az uhu-menu parancs argumentumok nélkül is futtatható, futása a kívánt eredménnyel jár. Ugyanakkor a csomagkezelés során automatikusan elinduló uhu-menu az alábbi kapcsolókkal fut:

A további kapcsolókról az uhu-menu --help parancs ad rövid leírást.


Desktop fájlok

A /usr/lib/applications és /usr/lib/desktop-directories könyvtár fájljainak tartalma a www.freedesktop.org oldalon található Desktop Entry Specification dokumentumot követi, néhány kiegészítéssel és néhány megszorítással. Leírásunknak nem célja ezt a specifikációt pontosan megismételni, így csak kiragadjuk belőle a legfontosabb mozzanatokat. Az itt nem tárgyalt kérdésekben a freedesktop-on lévő leírás a mérvadó. Az uhu-menu készítésekor ezen leírás 0.9.4-es változata volt a legújabb, ehhez alkalmazkodtunk. Ugyanakkor ki is egészítjük a specifikációt tanácsokkal, útmutatásokkal, konvenciók ismertetésével.

A Gnome és KDE rendszerek már évek óta ehhez a specifikációhoz tartják magukat, így alkalmazásaik általában szállítanak nagyjából megfelelő .desktop fájlt. Egy ilyen fájlhoz azonban, mint látni fogjuk, legalább egy X-UHU-Menu sort fel kell vennünk ahhoz, hogy az UHU-Linux menüszerkezetében megjelenjen a bejegyzés.

A "#" karakterrel kezdődő sorok megjegyzések, ezeket figyelmen kívül hagyjuk. A sorok végén álló szóköz és tabulátor karaktereket is eltávolítjuk. Üres sorok is bárhol megengedettek, nincs jelentőségük. Ennek ellenére nem szokás üres sorokat, vagy megjegyzést rakni a fájlba.

A továbbiakban mindezek elhagyásával vizsgáljuk a fájlt.

A Unix-okban megszokott módon a \ az ún. escape karakter. \s, \t, \n és \\ jelentése rendre: szóköz, tabulátor, újsor, illetve egyetlen \. Az escape szekvenciával megadott szóköz és tabulátor megmarad a sor végén, valamint (később) az egyenlőségjel körül.

A fájl érzékeny a kis- és nagybetűk különbözőségére.

A (megjegyzések és üres sorok kigyomlálása után kapott képzeletbeli) fájl első sorának pontosan ennek kell lennie:

[Desktop Entry]

A specifikáció 0.9.3-as változata még megengedi, bár elavultnak minősíti a [KDE Desktop Entry] fejlécet. A 0.9.4-es verzió ezt már nem engedi meg, és az uhu-menu sem támogatja. Tehát csak a [Desktop Entry] jó.

Ezt követően soronként egy-egy változó=érték pár következik a fájlban. Ezen sorok sorrendje tetszőleges. Az egyenlőségjel körül állhat szóköz vagy tabulátor, ezek eltűnnek (kivéve, ha \s vagy \t formában voltak megadva). A gyakorlatban nem szokás szóközt tenni az egyenlőségjel köré.

Habár nem igazán találkozni ilyennel, de megengedett, hogy valahol újabb fejezet kezdődjön a fájlban, szögletes zárójelek között megnevezve a nevét, például egy [Desktop Action Edit] sorral. Ilyen esetben ez a sort, valamint a fájl teljes ezt követő részét figyelmen kívül hagyja az uhu-menu. Tehát ha több fejezet van a fájlban, akkor is csak a [Desktop Entry] fejezetben található sorokkal foglalkozunk a továbbiakban.

Encoding=UTF-8

A specifikáció megköveteli, hogy szerepeljen Encoding sor, két lehetséges érték egyikével. Az uhu-menu ezek közül csak a javasolt UTF-8 értéket támogatja, az elavultnak tartott Legacy-Mixed értéket nem. A karakterkészlet megnevezéseként pontosan az UTF-8 sztring írandó, más alak (például UTF8, utf-8, utf8) nem jó.

A fenti sornak megfelelően a fájlnak UTF-8 kódolásban kell az ékezetes betűket tartalmaznia. Ajánlott egy UTF-8 kódolást támogató szövegszerkesztőt használni, például gedit, kate, kwrite. Amennyiben kedvenc szövegszerkesztőnk nem támogatja az UTF-8 kódolást, a Latin2-ben elkészített fájl átalakítható például a recode latin2..utf8 fájlnév vagy az iconv -f latin2 -t utf8 <régifájl >újfájl paranccsal. A munkánk végeztével elkészített desktop fájlnak érvényes UTF-8 kódolásúnak kell lennie, erről például az iconv -f utf8 -t utf8 <fájlnév >/dev/null paranccsal győződhetünk meg; ha ez nem ad hibát, akkor jó.

A gyakorlatban az Encoding=UTF-8 sor elhagyása nem szokott gondot okozni (habár ekkor is UTF-8 kódolásban kell a fájlnak állnia). Mivel azonban a specifikáció megköveteli ezt a sort, ne hagyjuk ki szándékosan.

Name=Potato Guy

Kötelező mező, a program nevét írjuk ide angolul. Ez nem feltétlenül egyezik meg a végrehajtandó parancs nevével, például a program neve lehet Midnight Commander, Acrobat Reader stb.

Name[hu]=Krumpli bácsi
Name[fr]=Monsieur patate

A program magyar, illetve egyéb idegen nyelvű nevét írhatjuk ide. Általában a programoknak nincsen külön magyar nevük, hanem az angol nevet használjuk. Ez esetben fölösleges felvenni ezt a sort. Például Name=Mozilla esetén valószínűleg Name[hu]=Mozilla a magyar név is, ekkor ezt a sort nyugodtan elhagyhatjuk.

A mező értéke lehetőség szerint nagybetűvel kezdődjék, bár természetesen kisbetű is elfogadható, ha a program neve kisbetűvel kezdődik (például xterm). Indítsuk el a programot, tanulmányozzuk dokumentációját, honlapját annak eldöntésére, hogy a fejlesztője hogyan írja pontosan annak nevét.

A Name értéket jeleníti meg az összes ablakkezelő a menüben.

GenericName=Game for Children
GenericName[hu]=Gyermekjáték

A GenericName nevű opcionális mezőben a program típusát nevezhetjük meg szövegesen. Például a Mozilla esetén valószínűleg GenericName=Web Browser, GenericName[hu]=Webböngésző soroknak van értelme.

A specifikáció megköveteli, hogy amennyiben akár egyetlen nyelven is fel van véve a GenericName értéke, az esetben angolul is legyen felvéve. Tehát hiba, ha van GenericName[hu]=... sor, de nincs GenericName=... sor. Ez nemcsak a GenericName-re, hanem mindegyik kulcsszóra fennáll.

A GenericName mezőt címként fogjuk fel, vagyis nagybetűvel kezdjük, és nem zárjuk ponttal. Ne ismételjük meg benne Name értékét. Ha nincs ötletünk a GenericName-re, akkor ne vegyünk fel ilyen mezőt.

A GenericName értékét a KDE ablakkezelője jeleníti meg a menüben (megfelelő beállítás esetén).

Comment=The funniest game ever
Comment[hu]=A valaha látott legmókásabb játék

Az opcionális Comment mezőbe szabadon írható szinte bármi megjegyzés a programmal kapcsolatban. Itt is teljesül: ha írunk magyar (vagy bármilyen angoltól különböző nyelvű) megjegyzést, akkor angolt is írnunk kell.

A Comment mezőt szintén címként fogjuk fel, vagyis nagybetűvel kezdjük, és nem zárjuk ponttal. Lehetőség szerint ne ismételjük meg benne se a Name, se a GenericName tartalmát. Ha nincs frappáns ötletünk, inkább ne vegyünk fel ilyen mezőt.

A Comment értéke a Gnome menüjében jelenik meg felbukkanó ablakban.

Icon=ktuberling.png

Az Icon kulcsszóval a menüben megjelenő ikont nevezhetjük meg. Ha nem abszolút útvonalat adunk meg, a Gnome és KDE az aktuális ikontémához tartozó útvonal mentén keresi meg a képet.

Ha a program saját ikont szállít magával, azt vagy a program saját területére (például /usr/share/programneve), vagy a /usr/share/pixmaps könyvtárba helyezzük. A /usr/share/icons nem erre való, ez nem az egyedülálló ikonok, hanem az ikontémák helye.

Type=Application

A Type kulcsnak kötelező szerepelnie, az applications/*.desktop fájlokban Application, a desktop-directories/*.directory fájlokban Directory értékkel.

Exec=ktuberling

Az Exec= mezővel adjuk meg az indítandó programot, szükség esetén argumentumokkal. Ez a sor tehát kötelező a applications/*.desktop fájlokra, míg a desktop-directories/*.directory fájlokra nincs értelme.

A program lehetőleg ne tartalmazzon útvonalat. Ha az indítandó program nincs benne a PATH-ban, akkor sokkal inkább célszerű elhelyezni egy szimlinket vagy indító szkriptet a PATH mentén, hogy parancssorból is könnyen indítható legyen a program, ne csak a menüből.

Ha a program képes megnyitni egy argumentumban kapott fájlt, akkor a parancs után írjunk egy %f-et. Ha több fájlt is képes megnyitni egyszerre, akkor %F. Hasonlóan URL-ek esetén %u és %U. Könyvtárnévre %d illetve %D, ez például fájlkezelő argumentumának lehet hasznos. Ha % jelet kívánunk a programnak a parancssorban átadni, a printf-nél megszokhatott módon két % jelet kell írnunk. Még néhány ilyen %-os paraméter definiálva van a specifikációban, azokat is lehet használni, bár kevésbé hasznosak. Miért is fontos ez? Amikor a menüben bóklászva indítunk egy progit, akkor nyilván semmilyen argumentumot nem kap pluszban, a %f és társai eltűnnek. Ugyanakkor Gnome-ban és KDE-ben a fogd és vidd módszerrel lehetőségünk van egy menübejegyzést megfogni a menüből, és kihúzni az asztalra vagy a panelra. Ezt követően egy másik fájlt ráejthetünk erre az ikonra, és ilyenkor arra számítunk, hogy a program nem "üresen" indul el, hanem megnyitva a ráejtett fájlokat. Ehhez szükséges a %F-hez hasonló argumentumok pontos megadása.

Terminal=true

Amennyiben true értéket adunk, a program terminálban fog elindulni.

Opcionális kulcsszó, alapértelmezett értéke a false. A Terminal=false sort nem szokás felvenni. A specifikáció 0.9.3-as változata még megengedte a 0 és 1 értékeket is rendre a false és true helyett, a 0.9.4-es változat már nem engedi meg. Az uhu-menu támogatja a 0 és 1 értéket is, de lehetőség szerint a false és true szavakat használjuk.

StartupNotify=true

Amennyiben true értéket adunk, úgy a grafikus környezet (Gnome, KDE) vizuálisan tájékoztatja valahogyan (egérkurzor, ablaklista...) a felhasználót arról, hogy program indulása folyamatban van. Ez a tájékoztatás mindaddig fennmarad, amíg az alkalmazás nem jelez vissza, hogy elindult. Ehhez az alkalmazásnak támogatnia kell a Startup Notification protokollt. Tehát csak olyan alkalmazásra adjunk true értéket, amely egészen biztos, hogy ezt támogatja. Ellenkező esetben azt fogjuk látni, hogy a program már régen elindult, de a grafikus környezet még mindig idegesítő módon villogtatja az egérkurzort vagy hasonló jelenségek közepette várja a program elindulását.

Opcionális kulcsszó, alapértelmezett értéke a false. A StartupNotify=false sort nem szokás felvenni. A 0 és 1 értékekről lásd a megjegyzést feljebb.

NoDisplay=true
Hidden=true

Habár a NoDisplay és Hidden kulcsszavak jelentése a specifikáció szerint lényegesen különböző, az uhu-menu számára azonos jelentéssel bírnak: az adott desktop fájlt úgy tekintik, mintha ott sem volnának.

Természetesen mindkét mező opcionális, alapértelmezett értékük a false.

Categories=...;...;

Habár a Gnome és KDE eredeti menüjének felépítésében kulcsfontosságú ez a mező, az uhu-menu nem használja semmire.

OnlyShowIn=GNOME;XFCE;
NotShowIn=KDE;

A két kulcsszóból csak az egyik szerepelhet, értéke ablakkezelők nevei pontosvesszővel elválasztva. Az utolsó ablakkezelő után is kell tenni pontosvesszőt. Segítségével megadhatjuk, hogy az adott bejegyzés csak bizonyos ablakkezelőkben jelenjen meg, vagy bizonyos ablakkezelők alatt ne jelenjen meg.

A specifikáció szerint az ablakkezelők neve érzékeny a betűméretre, és a GNOME, KDE, ROX, XFCE és Old kulcsszavak vannak definiálva.

Az uhu-menu számára viszont a betűméret nem számít, így GNOME, Gnome és gnome ugyanazt jelentik. Az egyes ablakkezelők neve például az uhu-menu --list-plugins paranccsal deríthető ki. Az Old kulcsszót nem ismeri az uhu-menu.

A fent felsorolt ablakkezelőket a specifikáció szerinti betűmérettel vegyük fel, mivel a Gnome és KDE számára generált menüben bennmaradhat ez a sor, és nem lenne jó, ha szándékunkkal ellentétben a Gnome vagy a KDE saját maga kiszűrné az adott bejegyzést.

X-UHU-Menu=Games/Action

Az X-UHU-Menu mező határozza meg azt, hogy az önálló fájlokat milyen hierarchikus szerkezetbe szervezi az uhu-menu. Az X-UHU-Menu mezővel nem rendelkező fájlokat az uhu-menu teljesen figyelmen kívül hagyja.

Az alkalmazások esetén a mező értéke azt adja meg, hogy azok mely menübe kerüljenek. Például X-UHU-Menu=Games/Action esetén a Games menü Action almenüje alá kerül a program. Ha közvetlenül a nyitó menülapon kívánjuk a programot látni, üres értéket adjunk meg, tehát egy X-UHU-Menu= sort vegyünk fel.

A *.directory fájlokban ez az érték azt adja meg, hogy az adott fájl melyik almenüt definiálja. Például az X-UHU-Menu=Games/Action bejegyzéssel rendelkező .directory fájl azt definiálja, hogy a Games menüben állva az Action menüt kinyitó bejegyzés hogyan nézzen ki. Pontosan egy .directory fájlban kell üres értéknek, vagyis X-UHU-Menu= sornak állnia, ez a fájl a főmenü tulajdonságait határozza meg, a legtöbb ablakkezelőben ez nem jelenik meg.

Az X-UHU-Menu értékének választott nevek (tehát fenti példánkban a Games és Action angol szavak) nem jelennek meg a felhasználó szeme előtt, pusztán belső technikai azonosítók, melyek segítségével a .desktop és .directory fájlokat menüszerkezetbe tudjuk rendezni.

X-UHU-Major=10
X-UHU-Minor=-2

Két opcionális mező, melyek az azonos menülapon lévő bejegyzések sorrendjét, valamint az elválasztó vízszintes vonalak helyzetét határozzák meg, amennyiben az ablakkezelő támogatja ezeket a lehetőségeket. A nagy grafikus rendszerek (Gnome, KDE) kevésbé támogatják az ilyet, viszont az IceWM és az FVWM tökéletesen.

A mezők értéke (előjeles) egész szám, hiányuk esetén az alapértelmezett érték a 0. Magasabb értékek följebb helyezik a bejegyzést, míg kisebb számok esetén lejjebb kerül az adott bejegyzés.

Ha két elem eltér a major értékben, úgy a nagyobbik major értékű fog följebb kerülni. Ha azonos a major értékük, akkor a minor érték eltérése esetén hasonló módon történik döntés. Ha a major és a minor értékük is megegyezik, akkor a megjelenített név szerinti, az adott nyelv ábécérendbe rendezési szabályainak megfelelő rendezés dönt.

Ahol a major érték megváltozik két bejegyzés között, ott egy vízszintes elválasztó vonal is elhelyezésre kerül. A minor érték változásánál nincs ilyen vonal. Így ha egy bejegyzést a lista aljára szeretnénk tenni elválasztó vonal nélkül, azt egy nagy abszolútértékű negatív X-UHU-Minor mezővel tehetjük meg, míg ha elválasztó vonalat is szeretnénk látni, akkor az X-UHU-Major értékét állítsuk be egy nagy abszolútértékű negatív számra.