Pozice a uspořádání widgetů

Okno aplikace arrange
arrange.c

Aby aplikace v Motifu byly pokud možno maximálně nezávislé na písmu, barvách, skinech a dalších uživatelsky definovaných vlastnostech grafického prostředí, které může ovlivnit přímo koncový uživatel bez nutnosti zásahu do programu, jsou důležitou součástí knihovny kontejnery, které slouží k uhnízdění dalších widgetů a dynamickou změnu jejich pozice a velikosti.

Widget RowColumn

Tento základní widget slouží pro uspořádání ostatních widgetů do pravidelné pravoúhlé mřížky. Vytvořme nejprve tento widget:

	rowcol = XtVaCreateManagedWidget("Container", xmRowColumnWidgetClass, window, NULL);

Funkce XtVaCreateManagedWidget() v tomto případě odpovídá volání XmCreateRowColumn() s příslušnými parametry a následně volání funkce XtManageChild(). Je to tedy univerzální varianta a vytváří widgety typu, který je určen druhým parametrem.

Standardní chování RowColumn je takové, že uspořádává své potomky do sloupců a řádků podle potřeby (viz obrázek), přičemž preferuje sloupcové uspořádání. Jiné chování (včetně nestejnoměrné velikosti buněk nebo velikost mezery mezi potomky) si můžeme vynutin nastavením příslušných zdrojů. Například pro jinou preferovanou orientaci můžeme při vytváření nastavit zdroj XmNorientation:

	rowcol = XtVaCreateManagedWidget("Container", xmRowColumnWidgetClass, window,
				XmNorientation, XmHORIZONTAL,
				NULL);

Snadné získání hodnoty zdroje

Pro některé speciální typy zdrojů lze kromě obecných funkcí XtGetValues() a XtVaGetValues() použít také snadnější jednoúčelové funkce. V ukázce je v callback funkci pro událost stisku tlačítka demonstrována funkce XtName(), která vrací hodnotu zdroje XmNlabelString (u widgetu Label a jeho potomků) jako char *.

void button_pushed(Widget widget, XtPointer data, XmPushButtonCallbackStruct * cbs) {
	printf("Pushed %s\n", XtName(widget));
}