Protokoly a architektura pro X Window System
X Window System (též X11, nebo jen X) je v informatice síťově transparentní grafické uživatelské rozhraní pro rastrové displeje. Vznikl jako součást projektu Athena na Massachusettském technologickém institutu v roce 1984.
Model klient-server a síťová transparentnost
X používá model klient-server. Program X Server běží na počítači s grafickým displejem a komunikuje s programy klientů. X Server funguje jako prostředník mezi uživatelem a programy klientů. Přijímá požadavky pro grafický výstup (okna) z programů klientů a zobrazuje je uživateli. Dále zpracovává vstup uživatele (klávesnice, myš) jako události a přenáší je do programů (klientů).
X server běží na počítači uživatele, přičemž klienti mohou běžet na různých počítačích. Je to obráceně než při běžných konfiguracích systémů klient-server, kde klient běží na počítači uživatele a server běží na vzdáleném počítači. Tato obměna často mate nové uživatele X Window System. X Window terminologie vychází z hlediska programu, nikoli konečného uživatele nebo hardwaru: vzdálené programy se pak připojí k displeji X Serveru operujícím na místním počítači, a tak působí jako klienti; zatímco místní X displej přijímá příchozí provoz, a tím vystupuje jako server. V tomto případě X Server přijímá vstup z klávesnice a myši a zobrazuje ho na obrazovce. Webový prohlížeč a emulátor terminálu operují na stanici uživatele a aktualizace systému běží na serveru vzdáleném, ovšem pod kontrolou počítače uživatele. Vzdálené aplikace pak fungují stejně, jako by se tomu dělo místně.
Komunikační protokol mezi serverem a klientem běží na síti transparentně: klient a server mohou operovat na počítači stejném nebo na počítačích odlišných, eventuálně s různými architekturami a operačními systémy. Klient a server spolu mohou bezpečně komunikovat za pomoci využití šifrovaných tunelových spojení.
Zásady návrhu
Bob Scheifler a Jim Gettys stanovili principy X takto (uvedeno v Scheifler/Gettys 1996):
- Nové funkce přidávat pouze v případě, kdy vykonavatel není schopen dokončit aplikace bez nich.
- Je stejně důležité rozhodnout, na co se systém bude používat, jako na co se používat nebude. Raději, než zcela univerzálně použitelný systém, vytvořit systém rozšiřitelný, aby další potřeby mohly být plněny vzestupně kompatibilním způsobem.
- Jediná věc, horší než zobecňovat z jednoho příkladu, je nepoužití příkladu vůbec.
- Pokud problému není zcela porozuměno, je pravděpodobně nejlepší neposkytovat žádné řešení.
- Můžete-li získat 90 % požadovaného účinku za 10 % práce, použijte jednodušší řešení.
- Omezit složitost na minimum
První zásada byla upravena během návrhu X11 na znění: Nové funkce přidávat pouze v případě, pokud víte o nějaké aplikaci, která je bude vyžadovat.
Jádro protokolu
Komunikace mezi serverem a klienty probíhá pomocí výměny paketů přes síťový kanál. Klient naváže spojení odesláním prvního paketu. Server odpoví, odešle zpět paket obsahujícím přijetí nebo odmítnutí spojení, nebo žádosti pro další ověření. Pokud je spojení přijato, server odešle klientovi paket obsahující data pro následující interakci se serverem.
Po navázání spojení si klient a server po síti vyměňují 4 různé typy paketů:
- Request (požadavek): Klient požaduje informace ze serveru, nebo požaduje po serveru, aby provedl nějaký úkon.
- Reply (odpověď): Server odpoví na žádost. Ne všechny požadavky vytváří odpovědi.
- Event (událost): Server odešle klientovi podnět, např. vstup myši nebo klávesnice, přesunutí, otevření nebo změna velikosti okna.
- Error (chyba): Pokud je požadavek neplatný, server odešle chybový paket. Protože požadavky se hromadí ve frontě, chybový paket nemusí být odeslán okamžitě.
X Server poskytuje sadu základních služeb, klientské programy realizují složitější funkce pomocí interakce se serverem.
Okna
To co ostatní grafická uživatelská rozhraní obvykle nazývají okno je v X Window System úrovní okna nejvyšší. Termín okno je také používán pro okna, která se nacházejí v jiném okně, to znamená tzv. podokno mateřského okna. Grafické elementy jako tlačítka, menu, ikony, atd., jsou všechna realizována pomocí oken.
Okno může být vytvořeno pouze jako podokno mateřského okna, což v praxi znamená, že okna jsou uspořádána hierarchicky ve stromu. X Server automaticky vytváří kořen stromu, tzv. hlavní okno (plochu). Nejvyšší úrovně oken jsou pak přímá podokna okna hlavního. Hlavní okno je tak viditelně stejně velké jako obrazovka a je umístěno za všemi ostatními okny.
Identifikátory
X Server ukládá všechna data o oknech, písmu atd. Uživatel zná identifikátory těchto objektů – integery. Mohou být užívány jako jména při komunikaci se serverem. Například, pokud chce uživatel vytvořit nové okno, je zaslán serveru požadavek pro vytvoření okna s přiděleným identifikátorem. Server vytvoří okno a je spojen s daným identifikátorem. Identifikátor může být později klientem použit při žádosti, např. pro zaznamenání vlákna do okna. Identifikátory jsou unikátní také pro server, nikoliv pouze pro uživatele. Například, žádná dvě stejná okna nemají stejný identifikátor, přestože jsou vytvořena dvěma různými uživateli. Uživatel může přistupovat ke každému objektu s přiděleným identifikátorem, přestože byl objekt vytvořen jiným uživatelem.
Atributy a vlastnosti
Každé okno má předdefinovanou sadu atributů a soubor vlastností, které jsou uloženy na X Serveru a jsou dostupné všem uživatelům prostřednictvím příslušných žádostí. Atributy jsou údaje o oknech, např. velikost, pozice, pozadí, barva atd. Vlastnosti jsou části dat, která jsou připojena k oknům. Na rozdíl od atributů, vlastnosti nemají žádný význam na úrovni X Window jádra protokolu. Uživatel může ukládat libovolná data do vlastností okna.
Vlastnosti jsou charakterizovány jménem, typem a hodnotou. Vlastnosti připomínají proměnné v imperativním programování, ve kterém může aplikace vytvořit nové vlastnosti s daným jménem, typem, úložištěm a vloženou hodnotou. Vlastnosti jsou sjednoceny s okny. Dvě vlastnosti mohou existovat na dvou rozdílných oknech, pokud mají odlišné typy a hodnoty. Vlastnosti jsou užívány převážně pro interní uživatelskou komunikaci. Například, vlastnost pojmenovanán WM_NAME ukládá jméno pro okno. Správce okna obvykle přečte jeho vlastnosti a zobrazí jméno okna na jeho horním okraji. Program xprop umožňuje zobrazení vlastností okna. Detailněji, program xprop – root zobrazuje vlastnosti kořenového okna, které obsahuje X-resources (parametry programu).
Události
Události jsou pakety zasílané serverem uživateli, s cílem sdělit mu, že došlo k situaci, která jej může zajímat. Uživatel může zaslat serveru žádost o přeposlání dalšímu uživateli. Toto se užívá při komunikaci mezi dvěma uživateli. Například, když uživatel požaduje text, který je aktuálně vybraný, událostí je zaslání uživateli informace, že nyní pracuje s oknem, které nese požadovaný výběr. Obsah okna může být „zničen“ za některých podmínek (například, pokud je okno zakryto). Kdykoliv se oblast zničení stane viditelnou, server generuje Expose událost za účelem oznámení uživateli, že část okna byla vyobrazena. Jiné události mohou sloužit k oznámení uživateli vstupních zařízení (klávesnice, myš) o vytvoření nového okna atd. Některé druhy událostí jsou uživateli zasílány vždy, ale většina z nich je zasílána pouze v případě předcházejícího zájmu uživatele, neboť se může zajímat pouze o některé z nich. Například, uživatel se může zajímat o události spjaté s klávesnicí, nikoliv však s myší.
Barevné režimy
Způsob, jakým X Window System zachází s barvami, může být někdy pro uživatele matoucí a historicky je podporováno několik různých módů. Nejmodernější aplikace užívají TrueColor (24bitové barvy, 8 bitů pro každou červenou, zelenou a modrou barvu). Starší speciální aplikace však mohou vyžadovat odlišný barevný mód. Mnoho komerčních speciálních aplikací užívají PseudoColor. Protokol X11 v současné době užívá jednoduchý 32bitový integer bez znaménka – zvaný pixelvalue – pro prezentování jednotlivých barev ve většině grafických operací. Při přenosu intenzity primárních barev je užíván 16bitový integer pro každou jednotlivou barevnou složku. Následující reprezentace barev existují, avšak některé z nich nemusí být podporovány na různých zařízení.
- DirectColor
- Hodnota pixelu je složena z oddělených červených, zelených a modrých podpoložek. Každá podpoložka indexuje oddělenou barevnou mapu. Vstupy ve všech barevných mapách mohou být
- TrueColor
- Stejné jako u Direct color s rozdílem, že vstupy barevných map jsou již předdefinované hardwarem a nemohou být pozměněny. Typicky, každá z červené, zelené a modré barevné mapy poskytuje lineární řazení intenzity.
- GrayScale
- Hodnoty pixelů indexují jednotlivé barevné mapy, které obsahují monochromatické intenzity. Vstupy barevných map mohou být
- StaticGray
- Stejné jako u GrayScale s rozdílem, že vstupy barevných map jsou již předdefinované hardwarem a nemohou být pozměněny.
- PseudoColor (Chunky)
- Hodnoty pixelu indexují jednotlivé barevné mapy, které obsahují barevné intensity. Vstupy barevných map mohou být pozměněny.
- StaticColor
- Stejné jako u PseudoColor s rozdílem, že vstupy barevných map jsou předdefinované hardwarem a nemohou být pozměněny.