OSF/Motif * Jeden z nejstarších prostředků pro snadný vývoj aplikací pod X Window System + Definuje společný look & feel aplikací o Technické prostředky: Motif toolkit (Motif widgets, Xm) # Postaveno na X Toolkit Intrinsics (Xt) @ Nadstavba Xlib o Netechnické prostředky: Motif Style Guide # Určuje normy vzhledu Motif-compliant aplikací * Implementuje různé zajímavé (na tehdejší dobu) vlastnosti + Clipboard, Drag & Drop, tisk + User Interface Language (UIL) CDE * Common Desktop Environment + Ucelené desktopové prostředí o Analogie (předchůdce) Gnome, KDE + Používá OSF/Motif o Zároveň obsahuje řadu rozšiřujících widgetů + Základní komponenty o Login manager (Display manager) o File manager o Application manager o Session manager o Window manager + Stále se používá na Solarisu Historie * 1985: MIT X Consorcium + Definice Xlib, Xt (X Toolkit Intricsics) + Později MIT X Consorcium přechází na X/Open * 1989: Open Software Foundation + Definice OSF/Motif * 1996: OSF, X/Open + Sloučení do Open Group * 2000: Open Group + Uvolnění zdrojového kódu Motifu pod veřejnou licencí jako OpenMotif * 1989: Motif 1.0.x + Pro X11R3 * 1991: Motif 1.1.x + Pro X11R4 * 1992: Motif 1.1.4 + Podpora X11R5 * 1992: Motif 1.2.x + Pro X11R5 + Binární kompatibilita s Motifem 1.1.x + Nové vlastnosti (Drag & Drop, odtrhávací menu, zdrojový kód v čistém ANSI C) * 1994: Motif 2.0.x + Podpora pro národní jazyky + Barevné ikony + Pop-up kontextová menu + Neoficiální podpora X11R6 + Příliš se nerozšířil (špatná binární kompatibilita) * 1997: Motif 2.1.x (OpenMotif 2.1.x) + Odstraněny některé nepoužívané widgety z 2.0 + Podpora pro X Print Server + Thread-safe + Pro X11R6.2, podpora X11R6.3 * 2002: Motif 2.2.x (OpenMotif 2.2.x) + Nové vlastnosti a widgety (strom, výběr fontu, výběr barvy, tool-tipy) LessTif * Nezávislá implementace Motifu + Od roku 1995, LGPL + Cíl: úplná binární kompatibilita + Současný stav: o Kompatibilita na úrovni API, chybí některé interní funkce # Odpovídá Motifu 1.2 # úplná kompatibilita s Motifem 2.0 se neplánuje o Ve vývoji # Překladač UIL # Nativní window manager (mwm) # Kompatibilita s Motifem 2.1+ (OpenMotifem) OpenMotif * Původní implementace OSF/Motif + Uvolněna pod veřejnou licencí * Soubor knihoven a hlavičkových souborů pro C + libXm, libXt + Neobjektové + C++ bindings třetích stran + wxWidgets (bývalé wxWindows) + YACL, WWL (již se nevyvíjí) + Wind/U (implementace MFC pomocí Motifu) + ObjectBuilder UIL * User Interface Language + Textový popis statického uživatelského rozhraní + Překládán do binárního UID (User Interface Definition) pomocí překladače uil + Načítán za běhu pomocí knihovny Mrm + Od verze 2.0 je formát UID platformově nezávislý (liší se však od předchozího formátu a formátu LessTifu) * Obzvláště vhodný pro popis hierarchie widgetů * Rozšíření: WML (Widget Markup Language) + Umožňuje popis vlastností standardních i uživatelských widgetů + Použit v některých vizuálních vývojových prostředích object main_win: XmMainWindow { controls { XmMenuBar main_menu; Xm_Separator1 sep_1; XmScrolledText text_win { arguments { XmNrows = 10; XmNwordWrap = true; }; }; Xm_Separator1 sep_2; XmPushButton ok_button { callbacks { XmNactivateCallback = procedure ok_button_down(ok_button_ident); }; }; }; }; Widgety * Základní GUI jednotky aplikace + Interakce s uživatelským kódem pomocí callback funkcí + Hierarchie o Core # Vlastnosti jako pozadí, velikost, pozice (společné všem widgetům) # Xt o XmPrimitive # Základní třída všech primitivních widgetů (ovládacích prvků) o Composite # Základní třída všech kontejnerů # Shell @ Komunikace s window managerem # Constraint @ Pozice, zarovnání a uspořádání obsažených widgetů Hello world #include /* obsahuje taky X11/Intrinsics.h */ #include /* každý widget má vlastní hlavičkový soubor */ void button_pushed(Widget widget, XtPointer data, XmPushButtonCallbackStruct * cbs) { /* ... */ } int main(int argc, char * argv[]) { Widget window, button; XtAppContext app; /* kontext aplikace, název třídy, X11 argumenty (2), argumenty programu (2), implicitní zdroje (seznam ukončený NULL), rozšiřující parametry (seznam ukončený NULL) */ window = XtVaAppInitialize(&app, "Application", NULL, 0, &argc, argv, NULL, NULL); /* rodičovský widget, název, argumenty (ArgList), počet argumentů */ button = XmCreatePushButton(window, "Button", NULL, 0); /* předání řízení widgetu rodičovskému widgetu, zobrazení */ XtManageChild(button); /* nastavení volání callback funkce button_pushed při události XmNactivate, bez doplňkových uživatelských dat */ XtAddCallback(button, XmNactivateCallback, (XtCallbackProc) button_pushed, NULL); /* zobrazení widgetu (zde top-level okna) */ XtRealizeWinget(window); /* zavolání hlavní smyčky událostí */ XtAppMainLoop(app); } * Kompilace gcc -o hello_world -I/usr/X11R6/include -L/usr/X11R6/lib -lXm -lXt -lX11 hello_world.c Programátorský model * Xlib + Jednoduché, neobjektové API implementující klientskou část X Window protokolu + Správa serverových objektů (oken, pixmap, fontů, kurzorů, grafických kontextů atd.) + Rutiny pro kreslení a rendering textu + Přijímání událostí a datové struktury pro jejich reprezentaci * Xt + API vyšší úrovně + Rozdělení funkčních celků aplikace na widgety * Xm + Konkrétní implementace různých widgetů + Společný vizuální styl Programátorský model (2) * Objektový model + Widgety v knihovně tvoří funkční hierarchii tříd objektů o Specializované widgety (např. tlačítko) dědí vlastnosti obecných widgetů (např. od XmPrimitive) + Widgety realizované (použité) v aplikaci tvoří strukturní hierarchii o Např. listbox a tlačítko je součástí kontejneru, ten je součástí okna * Neobjektová implementace objektů + Každý widget je céčková struktura o Resources (datové atributy, vlastnosti widgetu) o Callbacks (ukazatele na metody) + Ukázka: o XmPushButton # Implementuje tlačítko # Zdroje dědí od Core, XmPrimitive a XmLabel # Od XmLabel jsou to např.: @ XmNlabelString (zdroj, nápis na tlačítku/labelu) o Přidává některé vlastní zdroje a callbacky, např.: # XmNactivateCallback (callback události stisknutí tlačítka) # XmNarmColor (zdroj, barva při promáčknutí tlačítka) * Implementace + Jednoduchá typová dědičnost o První prvek struktury je rodičovská třída, následují zdroje, které třídu rozšiřují # Přetypováním na předka jsou tedy vždy vidět ty zdroje, které náleží do dané podmnožiny o Ke zdrojům koncový programátor nepřistupuje přímo # Jen přes speciální funkce, které pomocí postupného přetypovávání na předky prochází definice všech zdrojů # Vyhodnocují se přístupová práva @ Některé zdroje nesmí být měněny apod. o Definice zdrojů pomocí pětice vlastností # Jméno, název třídy, typ objektu, výchozí hodnota, přístupová práva + Nejsou potřeba speciální typy pro instance objektů o Instance jsou ukazatele na typy tříd o Všechny metody jsou definovány jako callback funkce (speciální typy zdrojů) Odkazy * http://www.openmotif.org * http://www.opengroup.org/motif/ * http://www.lesstif.org * http://www.rahul.net/kenton/xsites.html * http://www.rahul.net/kenton/faqs/Motif-FAQ.html