Tvorba aplikací s dotykovým displejem

Zkusím stručně popsat jak to realizuji:

Grafický driver zajišťuje vykreslení obsahu paměti (obrázku) na displej na určité místo

Ovladač displeje obsahuje canvas = kreslící plátno, do kterého se realizuje vykreslování. Nelze kreslit přímo na displej, prvky by problikávaly. Ale protože RAM není dost velká na celou obrazovku, je canvas jenom výřez (určitý počet linek). Ovladač displeje kreslý po pásech - při kreslení projede všechny pásy, při každém pásu všechny prvky a překreslí je, ale ořezává pro aktuální pás. Tím se dá realizovat každá velikost displeje i při malém bufferu bez blikání, rychlost kreslení je i přes to dost vysoká.

Ovládací prvky mám definované jako třídy (ve skutečnosti struktury, je to pod C). Obecný prvek obsahuje definici - rozměry a umístění na displeji, obrázek který může obsahovat, barvu podkladu a písma, text. Od základního prvku se odvozují prvky jako tlačítko, obdélník, obrázek, video atd. Prvky jsou jen ve statickém poli, obrázky jsou jako konstantní pole v programu, takže veškerá obsluha displeje se obejde bez alokace paměti malloc, všechno je jenom změnou ukazatelů v RAM.

Prvky jsou pomocí ukazatelů řazeny do stromových struktur. Pokud se přepne stránka displeje, přepne se jen ukazatel na Root prvek (obvykle jím je obrázek pozadí, jeho potomky je několik tlačítek). Kreslící funkce vezme Root prvek, zajistí jeho vykreslení do canvasu a potom vykresluje jeho potomky atd. Po vykreslení všech prvků překreslí pás canvasu na displej a opakuje kreslení pro další pás. Oříznutí na pás realizuje kreslící funkce pro základní prvek.

Ovladač displeje má uchované souřadnice rectanglu změn. Pokud se změní obsah displeje (stisk tlačítka, vytvoření nebo zrušení prvku atd), aktualizuje hranice rectanglu změn. Z hlavní smyčky se volá obsluha překreslení displeje - otestuje se rectangl změn a pokud je nějaká změna na displeji, zajistí se překreslení oblasti. Je to optimální kompromis mezi překreslováním celého displeje a mezi opakovaným kreslením po každé změně.

Ovladač touche zjistí stav stisk/uvolnění a souřadnice stisku, tyto informace se uloží do globálních proměnných. Z hlavní smyčky pokud je změna touche (např. stisk nebo přesun), zavolá se funkce Root prvku s informací o této události. Root prvek přepošle zprávu všem svým potomkům. Každý potomek testuje zda jeho souřadnice spadají do souřadnice události a pokud má na událost reagovat (např. je to tlačítko reagující na stisk), obslouží událost a vrátí rodič příznak, že událost už neplatí (tedy pokud ji prvku nezachytí nějaký jeho potomek).

Tlačítko při stisku neobsluhuje přímo požadovanou funkci - to by se funkce cyklicky zahltily a např. by nešlo změnit obsah displeje atd. Takže obsluha tlačítka jen vyšle událost do fronty zpráv - což je jen seznam struktur. Po návratu do hlavní smyčky prochází hlavní smyčka frontu zpráv a zprávy zpracovává - to znamená že volá funkci která se má zprávou obsloužit, např. funkci která zruší prvky a přepne na jinou stránku. Zpráva obsahuje adresu funkce která se má provést, ukazatel na prvek který zprávu vyvolal a volitelné parametry převzaté z definice od tlačítka - např. na kterou stránku displeje se má přepnout.