Multiplatformní Knihovna Pro Interakci S Grafickým Uživatelským Prostředím
Total Page:16
File Type:pdf, Size:1020Kb
Masarykova univerzita Fakulta}w¡¢£¤¥¦§¨ informatiky !"#$%&'()+,-./012345<yA| Multiplatformní knihovna pro interakci s grafickým uživatelským prostředím Bakalářská práce Jaromír Kala Brno, 2014 Prohlášení Prohlašuji, že tato bakalářská práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj. Jaromír Kala Vedoucí práce: RNDr. Pavel Troubil ii Poděkování Rád bych poděkoval RNDr. Pavlu Troubilovi za cenné rady, věcné připomínky a ochotu při konzultacích a vypracování bakalářské práce. iii Shrnutí Cílem bakalářské práce bylo vytvořit multiplatformní knihovnu pro manipulaci s grafickým uživatelským rozhraním. Vzniklá knihovna WDDMan podporuje detekci připojených monitorů a jejich rozlišení, zjištění otevřených oken a manipulaci s nimi (zavření, změny velikostí a přesuny) a detekci virtuálních ploch. Knihovna WDDMan funguje na operačních systémech skupiny Windows, Linux a Mac OS. Kni- hovna s podobnou funkcionalitou doposud nebyla k dispozici a bude použita v middleware CoUniverse pro manipulaci s objekty videokon- ferenčních nástrojů. Prostředí CoUniverse se využije pro vzdálené tlu- močení přednášek pro Středisko pro pomoc studentům se specifickými nároky Masarykovy univerzity. Knihovna WDDMan bude zveřejněna pod otevřenou licencí k volnému užití. Součástí knihovny je i anglická dokumentace a ukázkový a testovací příklad. iv Klíčová slova CoUniverse, Windows API, XLib, JNA, AppleScript, GUI v Obsah 1 Úvod ...............................2 2 Popis použitých technologií .................4 2.1 Java Native Access .....................4 2.1.1 Popis knihovny Java Native Access . .4 2.1.2 Použití JNA v knihovně WDDMan . .7 2.2 Windows API ........................8 2.3 X Window System a Xlib .................9 2.4 AppleScript ......................... 10 2.4.1 Přehled jazyka . 10 2.4.2 Použití jazyka AppleScript v knihovně WDDMan 12 3 Dokumentace knihovny WDDMan ............. 14 3.1 Úvod ............................. 14 3.2 Přehled souborů knihovny ................. 15 3.3 Třída WDDMan ...................... 17 3.3.1 Konstruktory . 17 3.3.2 Funkce pro práci s okny . 18 3.3.3 Funkce pro práci s plochami . 19 3.3.4 Funkce pro práci s monitory . 22 3.3.5 Další funkce . 24 3.4 Rozhraní Window ...................... 24 3.4.1 Funkce pro zjištění informací o okně . 25 3.4.2 Funkce pro manipulaci s oknem . 28 3.5 Rozhraní Desktop ...................... 30 3.6 Třída Display ........................ 31 3.7 Výčtový typ OperatingSystem ............... 32 3.8 Výjimky ........................... 33 4 Testování knihovny WDDMan ............... 34 5 Závěr ............................... 36 A Seznam příloh .......................... 38 1 1 Úvod Laboratoř pokročilých síťových technologií vyvíjí prostředí pro vzdálené tlumočení přednášek a cvičení do znakového jazyka pro Středisko pro pomoc studentům se specifickými nároky (používá se i název Středisko Teiresiás) Masarykovy univerzity. Pří vzdáleném tlumočení přednášek a cvičení není tlumočník do znakové řeči ve stejné místnosti jako studenti. Vzdálené tlumočení je nutné kvůli nedostatku tlumočníků do odborného znakového jazyka. Aplikační middleware CoUniverse1 se bude používat k řízení tohoto prostředí, protože umožňuje budování, ovládání a samoorganizaci rozsáh- lých kolaborativních prostředí skládajících se z množství komponent [1]. Při použití prostředí CoUniverse pro vzdálené tlumočení přednášek do znakové řeči je potřeba manipulace s grafickým uživatelským rozhraním pro zobrazení používaných videokonferenčních nástrojů. Manipulace s objekty používaných videokonferenčních nástrojů je potřeba kvůli přes- ným požadavkům na vzhled aplikace pro vzdálené tlumočení. Použitým videokonferenčním nástrojem bude UltraGrid2, který umožňuje nízko- latenční přenos videa ve vysokém rozlišení. Popis požadavků na vzhled aplikace a popis použití technologií se nachází v bakalářské práci Milana Semana3. Cílem bakalářské práce bylo navrhnout a implementovat multiplat- formní (pro operační systémy skupiny Windows, Linux a Mac OS) knihovnu napsanou v jazyce Java (protože prostředí CoUniverse je vyví- jeno v programovacím jazyce Java) pro manipulaci s objekty grafického uživatelského prostředí. Měla podporovat detekci připojených monitorů a jejich rozlišení, zjištění otevřených oken a základní manipulaci s nimi (zavření, změnu velikosti a přesunutí). Knihovna v jazyce Java s touto funkcionalitou dosud neexistovala. Ostatní uživatelé, kteří řešili podobné problémy, nejčastěji sami napro- gramovali potřebné řešení pro jejich operační systém, vizte například 1. https://www.sitola.cz/CoUniverse/index.php/CoUniverse 2. http://www.ultragrid.cz/en 3. https://is.muni.cz/th/374487/fi_b 2 1. Úvod získání oken na operačních systémech Windows4, Mac OS5 nebo Linux6. Bakalářská práce je rozdělena do čtyř kapitol. V druhé kapitole popisuji použité technologie a jejich použití při vývoji knihovny WDDMan. V její první sekci knihovnu Java Native Access (JNA), která umo- žňuje jednoduché volání nativních funkcí z programovacího jazyka Java. V další sekci Windows API, které se používá ke komunikaci s operačními systémy skupiny Windows. Knihovna WDDMan volá funkce WinAPI přes JNA k manipulaci s grafickým uživatelským rozhraním na oper- ačním systémech skupiny Windows. V třetí sekci popisuji okenní systém X Window System používaný na operačních systémech skupiny Linux a knihovnu Xlib, kterou knihovna WDDMan používá skrz JNA k manip- ulaci s GUI na operačních systémech skupiny Linux. V poslední sekci se věnuji skriptovacímu jazyku AppleScript podporovanému operačními systémy skupiny Mac OS. AppleScript používá knihovna WDDMan k manipulaci s GUI na operačních systémech Mac OS. Třetí kapitola je dokumentací ke knihovně WDDMan. Nejprve jsou v ní popsány podporované operační systémy a nutné programové vy- bavení k fungování knihovny, následuje stručný popis souborů, ze kterých je knihovna složena a v poslední části kapitoly je dokumentace veřejných tříd, rozhraní, výčtových typů a výjimek knihovny. Ve čtvrté kapitole popisuji, jak jsem testoval funkčnost knihovny testovací aplikací WDDManDemo. 4. http://stackoverflow.com/questions/3188484/ windows-how-to-get-a-list-of-all-visible-windows 5. http://stackoverflow.com/questions/1606321/ how-do-i-get-a-list-of-the-window-titles-on-the-mac-osx 6. http://stackoverflow.com/questions/15638885/ linux-how-to-get-a-list-of-all-visible-windows 3 2 Popis použitých technologií 2.1 Java Native Access 2.1.1 Popis knihovny Java Native Access Java Native Access (JNA) je knihovna pro programovací jazyk Java. JNA umožňuje volání funkcí sdílených knihoven napsaných v jazyce C přímo z kódu v jazyce Java bez psaní nativního kódu. JNA nepodporuje volání C++ funkcí, je potřeba napsat v jazyce C rozhraní, které bude odpovídající C++ funkce volat. JNA je zkompilovatelné a funkční na operačních systémech Windows, Linux, Mac OS, Android, Windows Mobile a dalších. Při vývoji knihovny JNA není výkon prioritou [2]. Při testování se ukázalo, že jsou výkonnější způsoby volání nativních funkcí (například JNI), ale zároveň byla knihovna JNA nejpohodlnější k použití [3]. Tipy k zlepšení výkonui při používání knihovny JNA jsou v dokumentaci1. Pro volání nativních funkcí používá JNA knihovnu libffi2, která umožňuje volání nativních funkcí za běhu programu. Součástí knihovny JNA je i platformně specifická knihovna, která obsahuje některé nativní funkce a struktury pro různé operační systémy (například některé funkce z WinAPI či Xlib) již namapované. Rovněž je součástí platformně specifické knihovny sada nástrojů, které fungují na OS Windows, Linux a Mac OS. Sada nástrojů obsahuje následující třídy: FileMonitor notifikace o změnách souborů. FileUtils funkce se soubory, které nejsou obsaženy přímo v jazyce Java (například přesunutí souboru do koše). KeyboardUtils informace o stavu klávesnice WindowUtils další funkce pro okna. 1. http://twall.github.io/jna/4.0/javadoc/overview-summary.html# performance 2. http://sourceware.org/libffi/ 4 2. Popis použitých technologií Základní použití knihovny JNA ukáži na příkladu, kdy ze souboru priklad.c zavolám funkci secti z jazyka Java. Soubor priklad.c napsaný v programovacím jazyce C vypadající následně: int secti(int x, int y) { return (x + y); } je potřeba standardním způsobem přeložit do sdílené knihovny, na- příklad na operačním systému Linux a kompilátoru GCC příkazem gcc -o libpriklad.so -shared priklad.c. Následně se vytvoří nové rozhraní Priklad.java v jazyce Java vypadající: import com.sun.jna.Library; public interface Priklad extends Library { public int secti(int x, int y); } Rozhraní musí rozšířit rozhraní Library a každá funkce, která je volána z jazyka Java, musí být v rozhraní specifikována – musí se jmenovat stejně jako v původním C souboru a datové typy se převádějí podle tabulky 2.1. Pointer a NativeLong jsou třídy knihovny JNA. Knihovna Java Native Access podporuje i složitější datové typy. Pole se převádějí přímo na pole v jazyce Java. Struktury a unie se převedou vytvořením nové třídy, která rozšíří třídu Structure, respektive Union, knihovny JNA. Kompletní popis, jak převést struktury a unie je v dokumentaci3. Načtení knihovny a zavolání funkce secti se v souboru Secti.java provede následně. import com.sun.jna.Native; public class Secti { public static void main(String argv[]) { 3. http://twall.github.io/jna/4.0/javadoc/overview-summary.html# structures 5 2. Popis použitých technologií Datový typ v C