Motif
Martin Děcký

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)

Nadstavba Xlib

Netechnické prostředky: Motif Style Guide

Určuje normy vzhledu Motif-compliant aplikací

Implementuje různé zajímavé* vlastnosti

Clipboard, Drag & Drop, tisk

User Interface Language (UIL)

*) na svou dobu

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

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

Historie (2)

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)

Historie (3)

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

Historie (4)

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

UIL (2)

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>

#include <Xm/PushB.h>

void button_pushed(Widget widget, XtPointer data, XmPushButtonCallbackStruct * cbs) { /* ... */ }

int main(int argc, char * argv[]) {

Widget window, button;

XtAppContext app;

window = XtVaAppInitialize(&app, “Application”, NULL, 0, &argc, argv, NULL, NULL);

button = XmCreatePushButton(window, “Button”, NULL, 0);

XtManageChild(button);

XtAddCallback(button, XmNactivateCallback, (XtCallbackProc) button_pushed, NULL);

XtRealizeWinget(window);

XtAppMainLoop(app);

}

Hello world (2)

Kompilace

gcc -o hello_world -I/usr/X11R6/include

-L/usr/X11R6/lib -lXm -lXt -lX11 hello_world.c

#include <Xm/Xm.h>	/* obsahuje taky X11/Intrinsics.h */

#include <Xm/PushB.h>	/* každý widget má vlastní hlavičkový soubor */

window = XtVaAppInitialize(&app, “Application”, NULL, 0, &argc, argv, NULL, NULL);

/* 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) */

Hello world (3)

button = XmCreatePushButton(window, “Button”, NULL, 0);

/* rodičovský widget, název, argumenty (ArgList), počet argumentů */

XtManageChild(button);

/* předání řízení widgetu rodičovskému widgetu, zobrazení */

XtAddCallback(button, XmNactivateCallback, (XtCallbackProc) button_pushed, NULL);

/* nastavení volání callback funkce button_pushed při události XmNactivate, bez doplňkových uživatelských dat */

XtRealizeWinget(window);	/* zobrazení widgetu (zde top-level okna) */

XtAppMainLoop(app);	/* zavolání hlavní smyčky událostí */

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)

Programátorský model (3)

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)

Programátorský model (4)

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

Programátorský model (5)

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

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

2004-05-02T17:18:17