Hello world

Okno aplikace hello_world
hello_world.c

Základní jednoduchá aplikace, která zobrazí okno a v něm jedno tlačítko, které reaguje na své stisknutí. Tlačítko vyplňuje celou uživatelskou část okna aplikace a přizpůsobuje svou velikost rozměrům okna.

Funkce main()

Hlavní funkce aplikace vytvoří potřebné widgety a předá řízení hlavní smyčce událostí Motifu.

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

XtVaAppInitialize() inicializuje knihovnu Xt Intrinsics a nutně předchází dalšímu použití Motifu. Dojde tak k navázání spojení k X serveru, vyhodnocení standardních parametrů příkazové řádky a zdrojů X klienta a je vytvořeno top-level okno (uložena v návratové struktuře window).

Argumenty funkce jsou následující:

XtAppContext *
Kontext aplikace, struktura se stavovými údaji o celé aplikaci.
String
Název třídy, v tomto případě celé aplikace, ke které se vztahují zdroje aplikace.
XrmOptionDesscRec *, Cardinal
X11 argumenty aplikace v podobě seznamu a počtu položek.
int *, String *
Parametry aplikace z příkazové řádky v podobě standardního počtu argumentů a pole ukazatelů na znaky.
String *
Výchozí nastavení X zdrojů pro případ, že hodnoty zdrojů nejsou definovány jinak.
...
Rozšiřující parametry v podobě seznamu ukončeného NULL. Obvykle se nepoužívá.
	button = XmCreatePushButton(window, "Button", NULL, 0);
	XtManageChild(button);
	XtAddCallback(button, XmNactivateCallback, (XtCallbackProc) button_pushed, NULL);

V dalším kroku dojde k vytvoření tlačítka a nastavení některých jeho důležitých vlastností. Funkce XmCreatePushButton() (definovaná v hlavičkovém souboru Xm/PushB.h — obvykle každý widget má vlastní hlavičkový soubor) vytvoří widget tlačítka jako potomka widgetu hlavního okna, nastaví mu nápis (String) a výchozí nastavení zdrojů (seznam typu ArgList a počet položek typu Cardinal).

Volání funkce XtManageChild() způsobí, že o autonomní vlastnosti widgetu (velikost apod.) se bude nadále starat jeho rodičovský widget (v našem případě hlavní okno). To způsobí, že při zobrazení hlavního okna dojde také k zobrazení tlačítka a změně jeho velikosti v případě změny velikosti okna.

XtAddCallback() přiřadí tlačítku callback funkci, která se vykoná v případě, že na tlačítku dojde k události stisknutí. Druhý parametr (v našem případě má hodnotu XmNactivateCallback) je typu String a udává typ události (a současně prototyp callback funkce). Poslední parametr má typ XtPointer a umožnuje callback funkci předat libovolná uživatelská data.

	XtRealizeWidget(window);
	XtAppMainLoop(app);

Na závěr dojde k zobrazení hlavního okna a předání řízení do hlavní smyčky události Motifu. Funkce XtAppMainLoop() tedy skončí až s událostí uzavření hlavního okna aplikace a uživatelský kód se provádí jen v podobě volání callback funkcí tehdy, když nastanou příslušné události.

Funkce button_pushed

Callback funkce, která byla dříve zaregistrována na událost XmNactivateCallback tlačítka a je tedy provedena v případě stisknutí tlačítka. Kromě identifikace widgetu, na kterém k události došlo, a uživatelských dat (předaných při registraci) také dostává funkce jako svůj argument strukturu specifickou typu widgetu a události, přesněji popisující nastalou událost a její případné parametry.