náhled|100px|X Window System logo X Window System core protokolRobert W. Scheifler and James Gettys: X Window System: Core and extension protocols, X version 11, releases 6 and 6.1, Digital Press 1996, RFC 1013Grant Edwards. An Introduction to X11 User Interfaces je základním protokolem X Window System, který je síťovým okenním systémem užívaným k tvorbě grafického uživatelského rozhraní pro Unix a další operační systémy. X Window System je postaven na modelu klient–server: samostatný server ovládá vstup/výstup hardwaru, například obrazovku, klávesnici a myš. Všechny aplikace se chovají jako klienti, komunikují s uživatelem a s dalšími aplikacemi pomocí serveru. Tato interakce je řízena pomocí X Window System core protokolu.
V X Window System core protokolu jsou používány pouze 4 druhy paketů, které jsou posílány asynchronně po síti: požadavky, odpovědi, události a chyby. Požadavky posílá klient na server, aby ho požádat o provedení určitých operací (například vytvoření nového okna) a o zaslání dat s odpovědí. Odpovědi jsou posílány serverem a obsahují poskytovaná data. Události jsou posílány serverem, aby informovaly klienty o uživatelských aktivitách nebo jiných zajímavých okolnostech. Server odesílá chyby v paketech, aby podal klientovi oznámení o chybách, které nastaly během zpracování jejich žádosti. Požadavky mohou generovat odpovědi, události a chyby. Kromě toho protokol nenařizuje, v jakém pořadí mají být pakety odesílány po síti. Existují také další rozšíření core protokolu. Každé z těchto rozšíření obsahuje vlastní požadavky, odpovědi, události a chyby.
Protokol byl vytvořen roku 1984 na univerzitě MIT, současná verze X11 byla vydána v roce 1987. Jeho tvůrci Bob Scheifler a Jim Gettys zavedli hlavní princip, že jejich core protokol měl "vytvořit mechanismus, ne zákonitosti". Proto core protokol nespecifikuje interakce mezi klienty a mezi klientem a serverem. Ty jsou předmětem zvláštní specifikace,Jim Gettys. Open Source Desktop Technology Road Map jako například ICCCM a freedesktop.org, a jsou typicky vynuceny automaticky využíváním dané knihovny widgetů.
Přehled
Klient se serverem spolu komunikují výměnou paketů přes komunikační kanál. Spojení je navázáno klientem. (Způsob navázání spojení není v protokolu specifikován.) Klient také odesílá první paket obsahující pořadí bajtů, které bude použito, informace o verzi protokolu a způsob autentizace, který klient očekává od serveru. Server odpovídá zasláním paketu oznamujícím přijetí nebo odmítnutí spojení, nebo požadavkem na další autentizaci. Pokud je spojení přijato, paket oznamující přijetí obsahuje data pro klienta, která klient využívá pro další interakci se serverem.
náhled|200px|Ukázka interakce mezi klientem a serverem.
Po ustanovení spojení mohou být mezi klientem a serverem vyměňovány 4 typy paketů. Požadavek: Klient požaduje informace ze serveru nebo po serveru požaduje provedení nějaké akce. Odpověď: Server odpovídá na požadavek. Ne všechny požadavky mají odpověď. Událost: Server informuje klienta o události, například o stisku klávesy nebo tlačítka myši, přesunu okna, změně velikosti okna, atd. Chyba: V případě chybného požadavku zasílá server paket oznamující chybu. Protože jsou požadavky řazeny do fronty, chybový paket nemusí být odeslán okamžitě.
Pakety s požadavky a odpověďmi mají proměnlivou délku, naopak pakety s událostmi a chybami mají pevně danou délku 32 bajtů.
Pakety s požadavky, jakmile jsou serverem přijaty, jsou číslovány postupně. První požadavek má číslo 1, druhý 2, atd. Nejméně významných 16 bitů z očíslování požadavku je zahrnuto v odpovědi a případně v paketu oznamujícím chybu. Jsou také zahrnuty v událostních paketech, aby naznačily očíslování požadavku, který je právě zpracováván, nebo bylo jeho zpracování právě dokončeno.
Okna
To, co bývá obvykle nazýváno oknem ve většině grafických prostředí, je v X Windows systému nazváno oknem na nejvyšší úrovni (). Pojem okno je také užíván k označení oken, které leží uvnitř jiného okna, což jsou podokna () rodičovského okna (). Grafické komponenty jako například tlačítka, menu, ikony a další mohou být vytvořeny použitím podoken.
rám|Možné umístění oken: 1 je hlavní okno, které překrývá celou obrazovku; 2 a 3 jsou okna na nejvyšší úrovni; 4 a 5 jsou podokna 2. Části okna, která jsou vně rodičovského okna, nejsou viditelná.
Klient může požádat o vytvoření okna, přesněji může požádat o vytvoření podokna z již existujícího okna. Výsledkem je tedy hierarchické uspořádání oken vytvořených klientem do stromu. Kořenem tohoto stromu je hlavní okno, což je speciální okno vytvořené serverem automaticky při spuštění. Všechna ostatní okna jsou přímá nebo nepřímá podokna hlavního okna. Okna na nejvyšší úrovni jsou přímými podokny okna hlavního. Hlavní okno je tak veliké jako virtuální plocha a leží za všemi ostatními okny.
Zachování obsahu okna není vždy garantováno. Ten může být zničen zejména při přemísťování okna, při změně velikosti okna, nebo například při překrytí okna jiným oknem. Obecně dochází k jeho zničení, pokud není okno viditelné, nebo je vidět jen jeho část. Ke ztrátě obsahu okna dochází zejména, pokud X server neudržuje záložní uložení () obsahu okna. Klient může požádat, aby záložní uložení bylo udržováno, ale server nemá žádnou povinnost mu vyhovět. Klienti tedy nemohou předpokládat, že je záložní uložení udržováno. Pokud má viditelná část okna blíže neurčený obsah, je poslána událost upozorňující klienta, že obsah okna musí být znovu vykreslen.
Každé okno má přidruženou sadu atributů, jako například geometrii okna (velikost a pozice), obrázek na pozadí, cokoliv, o co bylo záložní uložení požádáno, atd. Protokol zahrnuje požadavky pro klienta na zkontrolování a změnu atributů okna.
Okna mohou být InputOutput (vstup i výstup) nebo InputOnly (pouze vstup). InputOutput okna mohou být zobrazena na obrazovce a jsou použita pro kreslení. InputOnly okna nejsou nikdy zobrazována na obrazovce a jsou použita pouze pro obdržení vstupu.
vlevo|náhled|350px|Rozbor prvků FVWM okna. Bílá oblast je okno vytvořené a viděné klientem.
Orámování okna a titulek okna (možné i včetně tlačítek), které jsou většinou vidět okolo okna, jsou vytvořeny správcem oken, ne klientem, který vytváří samotná okna. Správce oken se také stará o vstupy související s těmito prvky, jako například o změnu velikosti v případě, že uživatel klikne na okenní rám a táhne s ním. Klienti většinou pracují na okně, které vytvořili, ignorujíce změny provedené správcem oken. Změna, která musí být vzata v úvahu, je, že re-parenting správci oken (většina dnešních moderních správců oken) mění rodiče okna na nejvyšší úrovni na okno, které není hlavní. Z pohledu core protokolu je správce oken klientem ničím nelišícím se od ostatních aplikací.
Data o oknu mohou být získána spuštěním programu xwiniinfo. Předání parametru -tree zobrazí program strom podoken okna spolu s jejich identifikátory a geometrickými daty.
Pixmapy a drawables
Pixmapa je místo v paměti, na které je možné kreslit. Na rozdíl od oken nejsou pixmapy automaticky zobrazovány na obrazovce. Obsah pixmapy nebo jeho část lze libovolně přesouvat do okna a zpět, tato operace je možná díky double bufferování. Většina proveditelných grafických operací na oknech může být také provedena na pixmapách.
Okna a pixmapy se společně označují jako drawables a jejich obsah je uložen na serveru. Klient o něj může server požádat.
Grafický kontext a fonty
Klient může požadovat spoustu grafických operací jako například vymazání oblasti, zkopírování jedné oblasti do druhé, vykreslení bodů, čar, obdélníků a textu. Kromě vymazání jsou všechny operace možné jak v oknech, tak i na pixmapách.
Většina požadavků na grafické operace zahrnuje grafický kontext, což je struktura, která obsahuje parametry grafických operací. Grafický kontext zahrnuje barvu popředí, barvu pozadí, font textu a ostatní grafické parametry. Při požadavku na grafickou operaci klient zahrnuje grafický kontext. Ne všechny parametry grafického kontextu mají vliv na operaci, například font neovlivňuje vykreslení obdélníku.
Protokol specifikuje použití fontů na straně serveru.comp.fonts FAQ: X11 Info Takové fonty jsou uloženy jako soubory a server k nim přistupuje buď přímo přes lokální souborový systém, nebo přes síť z jiného programu nazvaného font server. Klient může požádat server o seznam fontů, které jsou na něm dostupné, a také o načtení (pokud se tak ještě nestalo) nebo vyřazení (pokud není použit jinými klienty) fontu. Klient může také požádat o obecné informace o fontu a o místu, které zabere konkrétní řetězec při vykreslení konkrétním fontem.
náhled|450px|Program xfontsel umožňuje uživateli vidět glify fontu.
Jména fontů jsou libovolné řetězce na úrovni X Window core protokolu. Konvence X logical font description specifikuje, jak má být font pojmenován v závislosti na jeho atributech. Tyto konvence také specifikují hodnoty nepovinných vlastností, které mohou být připojeny k fontům.
Program xlsfonts tiskne seznam fontů uložených na serveru. Program xfontsel zobrazuje glify fontů a umožňuje uživateli vybrat jméno fontu pro vložení do dalšího okna.
Užití fontů na straně serveru je v současné době odmítané ve prospěch fontů na straně klienta.Matthieu Herrb and Matthias Hopf. New Evolutions in the X Window System. Takovéto fonty jsou vykreslovány klientem, ne serverem, s podporou Xft nebo cairo knihoven a rozšíření XRender. Fonty na straně klienta nejsou nijak specifikovány core protokolem.
Zdroje a identifikátory
Veškerá data o oknech, pixmapách, fontech a dalších objektech jsou uložena na serveru. Klient zná identifikátory těchto objektů, celá čísla, které používá při interakci se serverem. Například, pokud si klient vyžádá vytvoření okna, požádá server o vytvoření okna s daným identifikátorem. Identifikátor může být později použit klientem na další požadavky, příkladem může být vykreslení textového řetězce do daného okna. Následující objekty jsou na serveru a klient je zná díky číselnému identifikátoru: Okno Pixmapa Font Mapa barev (tabulka barev) Grafický kontext
Tyto objekty se nazývají zdroje. Pokud klient požaduje vytvoření zdroje, musí také specifikovat jeho identifikátor. Například při vytváření nového okna musí klient specifikovat nejen jeho atributy (rodič, šířka, výška, atd.), ale také mu musí přiřadit identifikátor.
Identifikátory jsou 32bitová celá čísla, u kterých se 3 nejvýznamnější bity rovnají nule. Každý klient má vlastní sadu identifikátorů, kterou může použít na vytvoření nových zdrojů. Tato sada je specifikována serverem jako dvě celá čísla připojená k paketu oznamujícímu přijetí spojení. Klienti volí identifikátory, které jsou v sadě tak, aby nedocházelo ke kolizím. Dva objekty (okna, pixmapy, fonty, mapy barev a grafické kontexty) nemohou mít stejný identifikátor.
Jakmile byl zdroj vytvořen, klient používá jeho identifikátor k požadavkům týkajících se zdroje na serveru. Některé operace ovlivňují daný zdroj (např. žádost k přesunu okna), další požadují data zdroje uložená na serveru (např. požadavky na atributy oken).
Identifikátory jsou jedinečné na serveru, ne pouze u klienta, např. dvě okna nemají stejné identifikátory, i když je vytvořili dva různí klienti. Klient má přístup k jakémukoli objektu, pokud je mu předán jeho identifikátor. Zvlášť má také přístup ke zdrojům vytvořeným jinými klienty, i když jejich identifikátory se nachází mimo sadu identifikátorů, které je klient schopný vytvořit.