\"/
\"/ \"/    

X Window Systém: Atributy X klientů

Michal Brandejs, FI MU
Ročník V - číslo 4, březen 1995
Citace: M. Brandejs. X Window Systém: Atributy X klientů. Zpravodaj ÚVT MU. ISSN 1212-0901, 1995, roč. V, č. 4, s. 5-7.
Tematické zařazení: Programy, nástroje
 předchozí článek | následující článek 

Upravovat chování a vzhled X klientů pomocí voleb na příkazovém řádku je sice pohodlné, ale uživateli to poskytuje příliš málo možností. O některých takových parametrech jsme četli v předcházejících číslech Zpravodaje. V tomto pokračování seriálu o X Window si popíšeme filosofii a způsob použití tzv. atributů.

V originální anglické literatuře se na tomto místě setkáváme s pojmem resource, v českých překladech se používá pojem atribut. Téměř každá komponenta X klienta se může nastavovat prostřednictvím atributů. Atribut se skládá ze jména a hodnoty. Hodnotou je booleovská konstanta, číslo nebo řetězec. Jméno atributu je tvořeno hierarchicky a zahrnuje jak jméno X klienta (předpokládá se, že byl vybudován prostředky knihovny Xt - X Toolkit, či některé z knihoven nadřazených), tak i přesné vymezení komponenty, na kterou se má hodnota atributu aplikovat.

Každý X klient je sestaven z předem přichystaných přípravků (v anglických originálech widgets). Přípravkem je např. tlačítko, lišta, rolovátko, seznam atd. Přípravky lze do sebe vnořovat. Toto všechno musí syntax jména atributu postihnout. Obecný formát zápisu atributu je následující:

     objekt.subobjekt[.subobjekt...].atribut: hodnota

Položkou objekt rozumíme buď jméno programu X klienta, nebo konkrétní spuštěnou instanci (podle volby -name, bude rozvedeno dále). Položky subobjekt korespondují s hierarchií použitých přípravků. Položka atribut jednoznačně popisuje vlastnost posledního subobjektu a konečně hodnota je to, co se atributu přiřadí. Uveďme příklad:

     xterm.vt100.scrollBar: True

Takto zapsaný atribut zapne (booleovskou hodnotou True) zobrazování posuvné lišty v aplikaci xterm v okně VT100. Konkrétní struktura aplikace xterm je taková, že na nejvyšší úrovni vedle okna s emulací terminálu VT100 mohou být ještě okno grafického výstupu Tektronix a menu. Posuvné lišty se vztahují k oknu VT100. Uživatel, když atribut zapisuje, musí přesně znát hierarchii přípravků v konkrétní aplikaci. Tyto informace by měl nalézt v manuálové stránce aplikace (např. man xterm). X Window nám však nabízí zjednodušený zápis pomocí hvězdičkové konvence, např.:

     xterm*scrollBar: True

V tomto konkrétním případě jsme se částečně odstínili od znalosti hierarchie přípravků v aplikaci xterm. Hvězdička zde představuje libovolný (tedy i nulový) počet komponent (objekt a subobjekty) jména atributu. Je významný rozdíl mezi interpretací hvězdičky na příkazovém řádku shellu a zde. Na příkazovém řádku shellu se hvězdička expanduje na libovolný počet znaků, zde na libovolný počet celých jmen komponent. Proto nelze hvězdičku použít v případě, že bychom pro aplikace xcalc, xclockxclipboard chtěli nastavit obrácené zobrazování následovně:

     xc*reverseVideo: True

Tady by se nastavení atributu vztahovalo k neexistující (?) aplikaci xc. Hvězdičku lze v zápisu atributu použít i více než jednu, lze je použít i společně s tečkami. Všeobecně se doporučuje na místě tečky používat hvězdičku. Můžete se tak vyvarovat problémů s drobnými nekompatibilitami při povýšení verze aplikace.

Instance a třída

Každá komponenta, z níž se atribut skládá, patří určité třídě (Class). Třída je tu k tomu, aby obsahovala více komponent. Např. již zmíněný xterm obsahuje třídu Foreground obsahující barvu textu (foreground), barvu ukazovátka a barvu textového kurzoru. Všechny tyto komponenty jsou definovány jako instance třídy Foreground. Pokud všem těmto atributům chceme nastavit tmavě modrou barvu, potom zadáme:

     xterm*foreground: darkblue
xterm*cursorColor: darkblue
xterm*pointerColor: darkblue

nebo totéž provedeme nastavením třídy:

     xterm*Foreground: darkblue

Třídu od konkrétní instance odlišuje úvodní velké písmeno. Podle konvence začínají instance malým písmenem a třídy velkým písmenem. Pokud je název instance nebo třídy tvořen více než jedním slovem, začíná každé další slovo velkým písmenem.

Aplikace xterm je jednoduchá na to, aby se na ní dala demonstrovat skutečná "moc" atributů. Ukažme si ještě jeden příklad. Mějme hypotetickou aplikaci xclient, která má pole tlačítek, v tomto poli mají být všechna tlačítka modrá s výjimkou jednoho tlačítka, které má být červené. Atributy potom zapíšeme např. následovně:

     xclient*buttonbox*Buttons*foreground: blue
xclient*buttonbox*delete*foreground: red

Třída Buttons zahrnuje všechna tlačítka a delete je instance jednoho konkrétního tlačítka. Každý intuitivně cítí, že nastavením instance bude změněna barva jednoho tlačítka, i když vybarvení tohoto tlačítka bylo spolu s jinými již definováno. V krajním případě můžeme také napsat:

     *Foreground: blue

Tím by měly být nastaveny všechny barvy popředí všech klientů na modrou barvu. Jména konkrétních tříd a instancí opět hledejte v manuálových stránkách příslušných aplikací. Často však zjistíte, že jméno třídy je identické se jménem instance (jediný rozdíl je ve velikosti počátečního písmena). To potom může znamenat, že třída je tvořena jedinou instancí. Může však také jít o jméno primární instance ve třídě s tím, že existují další podružné instance.

Nahrazovací znak ?

Počínaje verzí X Window R5 lze spolu s hvězdičkou používat další nahrazovací znak - otazník. Tento reprezentuje právě jednu komponentu (objekt, subobjekt) jména atributu. Ukažme si použití otazníku na příkladě:

     xclient.?.?.Background: whitesmoke

Tento atribut nastaví barvu pozadí všech přípravků aplikace xclient, které v hierarchii stojí na úrovni vnuka (aplikace.otec.syn.vnuk...). Typickými představiteli vnuka jsou dialogové boxy, menu apod. Možný je i tento zápis:

     xclient.?.?*Background: whitesmoke

V tomto případě se nastaví barva pozadí všech přípravků, které jsou na úrovni vnuka a na všech úrovních nižších. Zdůrazněme, že otazník představuje právě jednu komponentu a hvězdička žádnou, jednu nebo více komponent.

Priority při vyhodnocování zápisu atributu

Atributy se v systému definují na více úrovních. Ale i kdyby byly v jednom souboru, může i tam docházet ke konfliktům. Proto existují pravidla, která tyto konflikty řeší. Obecně platí, že přesnější zápis má přednost:

Připomeňme předchozí příklad, ve kterém červená barva pro instanci tlačítka delete měla přednost před modrým vybarvením třídy Buttons bez ohledu na pořadí obou definic. Uveďme ještě jeden příklad pro vyhodnocení atributů; řádky jsou seřazeny podle priority od nejnižší po nejvyšší:

     *scrollBar: True
?*scrollBar: True
XTerm*scrollBar: True
xterm*scrollBar: False

Zadávání atributu při spuštění aplikace

Standardní X klient má volbu -xrm, pomocí které lze k existující databázi atributů přidat atribut další. Např.:

     xterm -xrm 'xterm*pointerShape: pirate' &

Atribut se přidá k existujícímu obsahu databáze atributů a případné kolize se vyřeší podle uvedených prioritních pravidel. Proto se neuplatní takto zadaný atribut:

     xterm -xrm '*pointerShape: gumby' &

Poznamenejme, že atribut musí být uzavřen do dvojice apostrofů.

Význam volby -name

Opět každý standardní X klient rozpoznává volbu -name, pomocí níž lze změnit jméno instance konkrétní spouštěné aplikace, například:

     xterm -name bigxterm &

V tomto případě bude takto spuštěná aplikace akceptovat atributy určené třídě XTerm a instanci bigxterm (nikoli xterm). Proto můžeme mít atributy definované tímto způsobem:

     XTerm*Font: 8x13
bigxterm*Font: 14x26

Spustíme-li xterm bez uvedení volby -name nebo s volbou -name, ale s jiným jménem než bigxterm, použije se font 8x13. Pokud xterm spustíme podle předchozího příkladu, použije se font 14x26.

Zadávání atributů X serveru

Atributy uživatel zapíše do souboru. Vždy jeden atribut na jeden řádek. Pro snazší orientaci v souboru smí použít komentářepokračovací řádky. Komentář se uvozuje znakem vykřičník (!). Definice, která bude mít pokračování na dalším řádku, se ukončí obráceným lomítkem (\).

Soubor s uloženými definicemi atributů může mít libovolné jméno. Atributy X serveru předává klient xrdb. Zpravidale se tento klient spouští při inicializaci X systému pro daného uživatele. Implicitně se definice čtou ze souboru .Xresources nebo .Xdefaults; ten se nejprve hledá v systémovém adresáři X Window (např. někde pod /usr/X11) a potom v domovském adresáři uživatele.

Klientu xrdb se při spuštění vedle jména souboru s atributy zadávají také následující volby: Volbou -load zajistíme, že před zaváděním atributů se předchozí nastavení zruší. Tím se ubezpečíme, že námi zavedené atributy budou jediné. Tato varianta je implicitní.

Volbou -merge docílíme přidání našich atributů k atributům v X serveru již existujícím. Při kolizích se postupuje podle dříve popsaných pravidel pro vyhodnocování priorit. Například:

     xrdb -load .Xresources

Momentální obsah databáze atributů klient xrdb vypíše po uvedení volby -query. Máme také možnost uložit momentální obsah databáze do souboru se zachováním komentářů v souboru např. příkazem:

     xrdb -edit .Xresources

Klientu xrdb můžeme zadat ještě řadu dalších voleb. Jejich popis najdete např. ve výpisu man xrdb.

Výpis atributů týkajících se klienta

Pro snadnější přístup k atributům patřícím určité třídě nebo instanci máme X klienta appres (application resource). Jako parametr zadáváme třídu a příp. i instanci. Zjistíme tak, jaké atributy by aplikace určená třídou a instancí obdržela. Ukažme si použití appres na příkladech:

     appres XTerm
appres XTerm bigxterm
appres XTerm -name bigxterm

V prvním případě se vypíší všechny atributy určené třídě XTerm a ve druhém a třetím případě pouze ty, které se vztahují současně ke třídě XTerm a k instanci bigxterm.

Zpět na začátek
ÚVT MU, poslední změna 14.11.2011