OSF/Motif
- Jeden z nejstarších prostředků pro snadný vývoj aplikací pod X Window System
- Definuje společný look & feel aplikací
- Technické prostředky: Motif toolkit (Motif widgets, Xm)
- Postaveno na X Toolkit Intrinsics (Xt)
- 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í
- Analogie (předchůdce) Gnome, KDE
- Používá OSF/Motif
- Zároveň obsahuje řadu rozšiřujících widgetů
- Základní komponenty
- Login manager (Display manager)
- File manager
- Application manager
- Session manager
- 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
- 1996: OSF, X/Open
- 2000: Open Group
- Uvolnění zdrojového kódu Motifu pod veřejnou licencí jako OpenMotif
- 1989: Motif 1.0.x
- 1991: Motif 1.1.x
- 1992: Motif 1.1.4
- 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:
- Kompatibilita na úrovni API, chybí některé interní funkce
- Odpovídá Motifu 1.2
- úplná kompatibilita s Motifem 2.0 se neplánuje
- 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
- Core
- Vlastnosti jako pozadí, velikost, pozice (společné všem widgetům)
- Xt
- XmPrimitive
- Základní třída všech primitivních widgetů (ovládacích prvků)
- 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 <Xm/Xm.h> /* obsahuje taky X11/Intrinsics.h */
#include <Xm/PushB.h> /* 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);
}
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ů
- Specializované widgety (např. tlačítko) dědí vlastnosti obecných widgetů (např. od XmPrimitive)
- Widgety realizované (použité) v aplikaci tvoří strukturní hierarchii
- Např. listbox a tlačítko je součástí kontejneru, ten je součástí okna
- Neobjektová implementace objektů
- Každý widget je céčková struktura
- Resources (datové atributy, vlastnosti widgetu)
- Callbacks (ukazatele na metody)
- Ukázka:
- 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)
- 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
- 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
- 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.
- 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ů
- Instance jsou ukazatele na typy tříd
- Všechny metody jsou definovány jako callback funkce (speciální typy zdrojů)
Odkazy