[[!meta title="Grafická uživatelská prostředí a knihovny"]] [[!toc levels=2]] #Grafická uživatelská prostředí a knihovny ## X Window System - Grafické prostředí pro operační systém UNIX - Začal vyvíjet institut MIT (Massachusetts Institute of Technology) v r. 1984. - Označení X11 (verze 11) od r. 1987 - Další verze jsou označovány jako revize. - Současná podoba systému oken X se principiálně nemění a nová vydání jsou rozšiřující především z pohledu způsobů implementace grafických režimů. - Klient-server architektura, klient (GUI aplikace) nemusí nutně běžet na stejném stroji, jako server. - Server se stará o klávesnici, myš a zobrazení grafického výstupu aplikací. - Klient komunikuje se serverem pomocí socketu. Používá [X-protokol](#x-protocol). - XFree86 v roce 1992 z X386, což byla implementace X serveru pro 386 architekturu. - X11R6.4 restriktivnější licence ve verzi 4.4 v únoru 2004. - Referenční implementací je X server vyvíjený X.Org Foundation. ![X architektura][1] ## Správce oken (window manager) Samotný X Server má na starost pouze zobrazení na obrazovku, obsluhu hardware (grafická karta, myš, klávesnice, touchpad) a sám o sobě je těžko použitelný. Proto se používá spolu se správcem oken (anglicky window manager), který se stará o ovládání uživatelem (přesun a změna velikosti okna) a podobně (horní lišta oken, ohraničení oken, změna velikosti, překrývání atp.). Z hlediska X Serveru je ovšem správce oken jen další klient, a proto je snadno zaměnitelný. Pro Linux existuje několik desítek správců oken, přičemž mezi nejznámějším patří IceWM, FVWM, Sawfish, Window Maker, Kwm, Metacity nebo Fluxbox. ## X protokol ### - Specifikuje způsob komunikace mezi X-Serverem a X-Klienty. - Nejslavnější implementací je Xlib. ![Xlib][3] Používat přímo xlib by bylo poněkud těžkopádné ([[příklad| xlib-example]]), proto vzniklo mnoho knihoven, které se snaží tvorbu GUI aplikací zjednodušit. Např. GTK+, Qt, FLTK, wxWindows, HTML + DOM + JavaScript, atd. ---------- ## Gnome - GNU Network Object Model Environment - Window manager - Vývojová platforma - GTK+ - V r. 1997 Miguel de Icaza and Federico Mena právě kvůli problémům s Qt licencí v KDE. ---------- ## KDE - 1996 Matthias Ettrich, student Eberhard Karls University v Tübingen. - Qt - Trošku jiná filosofie než Gnome, ale v podstatě to samé. ---------- ## GTK+ (GIMP Toolkit) - Vytvořen v roce 1997 členy skupiny eXperimental Computing Facility (XCF) Kalifornské university v Berkeley (Spencer Kimball, Peter Mattis a Josh MacDonald) pro vývoj programu GIMP (GNU Image Manipulation Program). - Napsán objektově v jazyce C, což sebou nese řadu výhod i nevýhod. - LGPL licence. - Současná verze již multiplatformní. - Součást GNU projektu. - Využívá jej mnoho vyšších programovacích jazyků pro snadný wrapping. [[GTK+ hello world]] ---------- ## QT - Haavard Nord a Eirik Chambe-Eng začali vývoj v roce 1991, později založili firmu Trolltech [celkem zajímavé](http://www.civilnet.cn/book/embedded/gui/qt4/pref04.html). - V r. 2009 ji koupila Nokia. - V C++ => obtížnější wrapping. - Od samého počátku multiplatformní (dokonce vlastni make systém). - Signal/Slot koncept (implementace observer pattern). - Komerční a LGPL licence (od r. 2009), dříve GPL, ještě dříve podivná QPL (1998) kvuli KDE. - Snaží se doplnit C++ a libc/c++ o chybějící vlastnosti vyplývající zejména z chabého RTTI v C++ 1. signals and slots 1. object properties 1. QSharedPointer, QWeakPointer, QScopedPointer - guarded pointers that are automatically set to 0 when the referenced object is destroyed, unlike normal C++ pointers which become dangling pointers when their objects are destroyed 1. qobject_cast - a dynamic cast that works across library boundaries 1. contextual string translation for internationalization 1. sophisticated interval driven timers that make it possible to elegantly integrate many tasks in an event-driven GUI 1. hierarchical and queryable object trees that organize object ownership in a natural way - Implementují velké množství objektů, které se využívají při tvorbě aplikací jako kontajnery, grafické formáty, sockety, SQL konektivita, SSL, JavaScript interpreter, QML apod. **multiplatformním způsobem**. - Model/View architektura. - Implicitně sdílené objekty. - Cenou, kterou za to platíme je MOC (Meta Object Compiler) [[Qt hello world]] # Tvorba grafických aplikací Kromě aplikací určených k zpracování a zobrazení grafických dat, je tu GUI. Proč GUI: - Uživatel může být hloupější, existuje jisté latentní Know-How, aplikace se ovládají obdobně pomocí stejných typů widgetů. - Stačí pasivní znalost UI. ## Model-View architektura - Odděluje data od jejich prezentace. - Jedny data mohpu být zobrazeny více způsoby či perspektivami. - Více fronendů. [[!img modelview-overview.png align="right" size="" alt=""]] [[!img modelview.svg align="right" size="" alt=""]] ## Komunikace objektů, Signal/Slot koncept - Obecně řeší observer pattern. - Many to many relationship. - Velice se hodí na řešení volání callback funkcí widgetů. - Kromě toho řeší mnoho dalších problémů, zejména neexistující reference (dangling pointers). ![signal-slot][4] [1]: X_client_sever_example.svg [2]: http://cs.wikipedia.org/wiki/X_display_manager [3]: xlib.png [4]: abstract-connections.png