diff --git a/README.md b/README.md index 3981c67d0b48caca8c133684132088848575444b..56470855e3c8a944179dbadae0b2aa4cb1f829ea 100644 --- a/README.md +++ b/README.md @@ -54,3 +54,94 @@ User documentation ================== See `i3-woman -H`, `i3-woman -h` `i3-woman-daemon -h` and help in GUI. + + +Developer documentation +======================= + +**Czech language only, sorry.** + +Rozdělení na klienta a daemonka +------------------------------- + +Hlavní částí projektu je program `daemon.py`. Je možné ho ovládat pomocí +programu `client`. + +Klient je psaný v C a kompilovaný pomocí make. Pyton má moc pomalý startup a +tedy není vhodné ho spouštět pro každé přepnutí workspacu. Daemon se oproti +tomu pouští jen jednou za celou životnost window manageru, takže startup je +zanedbatelný a je možné využívat výhody vyššího programovacího jazyka v +převážné většině kódu. + +Klient předává zprávy (příkazy) daemonkovi pomocí X11 protokolu (skrz X server). +Tento způsob je zvolený zejména proto, aby se nemuselo řešit žádné další sdílení +prostředků jako například socketu/potrubí tak, aby různé X sessions měli vlastní +ovládání a přitom se vždy našlo, jak se připojit. Nyní tedy stačí, aby měl klient +správně nastavenou systémovou proměnnou `DISPLAY`. +Vedlejším efektem této konstrukce je, že je možné ovládání skrz ssh X tunel +(po připojení vedené z ovládaného počítače někam pryč). Nejsem si jistý, jestli +je to bug nebo featurka. +Nevýhodou dané konstrukce je absence zpětné vazby. Tedy po odeslání příkazu +není uživatel skrz klienta informován o výsledku. + +Zprávy se posílají přidáním textu do attributu root okna (jméno atributu viz +`woman/constants.py`). Protokol každý argument posílaného příkazu začne `>` a +ukončí `\n`. Příkazy se oddělují prázdným řádkem. + +Klient umí ověřovat syntaxi posílaných příkazů a stěžovat si, když něco nesedí. +Aby nebyl popis příkazů a jejich argumentů na více místech, tak se část kódu +klienta generuje pomocí Pythonu ze sdílených dat. O celé generování se stará +make, který volá `gen_c.py`. Tímto způsobem se do klienta dostane i +uživatelská dokumentace a jméno attributu X11 protokolu. + +**V další části textu se budeme věnovat již pouze daemonkovi** + +Vlákna +------ + +Daemonek se skládá z 2 hlavních vláken. + +Vlákno X serveru čeká na příkazy od klienta a stará se o jejich vyhodnocení. + +Vlákno `i3_watch` se stará o zpracovávání událostí generovaných i3wm jako +například focus na workspace, vytvoření a zaniknutí atd. Zejména se stará o +správu sdílených datových struktur popisující aktivní mastery a jejich hlavní +slavy. Tyto data bydlí v modulu `woman/shared` a jsou chráněné jedním zámkem +(zámek obsahuje hack pro zabránění daedlocku při komunikaci s vláknem +obsluhující Qt). + +V případě, že je aplikace spuštěna s GUI, tak vznikne ještě jedno vlákno, ve +kterém běží hlavní smyčka Qt. Z technických omezení pyqt se toto vlákno v tomto +případě spouští jako hlavní. Qt vlákno jednak využívá sdílené datové struktury +a také od ostatních vláken dostává příkazy. Ty jsou doručované pomocí pyqt +signálu/slotu obaleného do třídy Tasker. Tímto způsobem se doručují požadavky +na překreslení částí GUI (tedy informace o tom, že nastala nějaká událost). +Když nějaké vlákno (zejména vlákno X serveru) chce změnit workspace, tak tímto +protokolem požádá Qt vlákno a to nejprve vyrobí screenshot aktuálního workspacu +a pak teprve pošle i3wm požadavek na změnu. Když Qt vlákno neexistuje, tak se +požadavek přímo pošle i3wm. + +Každé vlákno má vlastní spojení s i3wm (implementace pomocí `threading.local`). +Komunikace probíhá pomocí socketu a protokolu i3ipc, o jehož zpracovávání se +stará knihovna `i3ipc`. Modul `woman.lib` obsahuje části kódu, které mohou být +použity v libovolném vlákně. + +GUI +--- + +Grafické rozhraní je navrhováno na vysokou efektivitu při ovládání z klávesnice +i pouze pomocí myši. Proto většina funkcí má zdvojené ovládání pouze za pomocí +klávesnice nebo pouze za pomocí myši. Je spíše optimalizováno na pokročilé +uživatele využívající rozhraní každý den než na začátečníky držící ho poprvé v +ruce. + +Grafické rozhraní je postavené na knihovně pyqt5. Ta byla zvolena zejména +proto, že je možné ji alespoň částečně ohýbat (i když za cenu zhoršení +objektového návrhu) k lepšímu chování pro pokročilé uživatele (například +jednoklávesové klávesové zkratky a vlastní layout), umí vyrábět screenshoty a +je rozumně rychlá. + +Aplikace se skládá z hlavního okna, které obsahuje widget pro každý workspace. +Hlavní okno se zejména stará o ošetření většiny klávesových zkratek. Workspacy +také obsahují widgety reprezentují stromovou strukturu otevřených oken. Tato +struktura se při každém reloadu smaže a vytvoří úplně znovu.