Okno s menu

Okno aplikace menu
menu.c

Vytvoření okna aplikace s menu je celkem jednoduché (viz ukázkový zdrojový soubor). Demonstrujeme si na něm několik zajímavých vlastností.

Hlavní okno

Samotné okno aplikace není přímo tím oknem, do kterého se kreslí menu a další prvky uživatelského rozhranní. Nejprve se vytvoří kontejner MainWindow

	main_window = XtVaCreateManagedWidget("Main", xmMainWindowWidgetClass, window,
					XmNwidth, 300,
					XmNheight, 300,
					NULL);

kterému později (až je vytvoříme) přiřadíme pomocí zdrojů jeho speciální prvky (tedy především menu a pracovní plochu okna).

Řetězce

Typ XmString slouží interně pro potřeby Motifu ke snadnému uchovávání znakových řetězců. Má některé lepší vlastnosti něž běžný céčkový char *. Pro převod do tohoto typu lze použít celou řadu funkcí, například základní XmStringCreateSimple() (z char *) nebo XmStringCreateLocalized() s možností využít systémovou lokalizaci.

Řetězce se mezi funkcemi Motifu předávají hodnotou, takže pokud již daný řetězec v uživatelském kódu potřebovat nebudeme, můžeme jej dealokovat pomocí XmStringFree().

Menu

Menu hlavního okna (a podobně i jiná menu) se konstruují po "hladinách", tedy nejprve se vytvoří tlačítka menu viditelná přímo v okně, např.:

	menubar = XmVaCreateSimpleMenuBar(main_window, "Menu",
				XmVaCASCADEBUTTON, file_str, 'F',
				XmVaCASCADEBUTTON, help_str, 'H',
				NULL);

Typ položky menu XmVaCASCADEBUTTON představuje tlačítko s dalším rozbalovacím menu. Jiné typy položek jsou například XmVaRADIOBUTTON (tlačítko s exkluzivním výběrem), XmVaSEPARATOR (oddělovací čára) nebo v ukázce další úrovně menu použitý XmVaPUSHBUTTON (běžná příkazová položka menu):

	file_menu = XmVaCreateSimplePulldownMenu(menubar, "FileMenu", 0, (XtCallbackProc) file_menu_select,
					XmVaPUSHBUTTON, new_str, 'N', NULL, NULL,
					XmVaPUSHBUTTON, open_str, 'N', NULL, NULL,
					XmVaPUSHBUTTON, save_str, 'N', NULL, NULL,
					XmVaPUSHBUTTON, quit_str, 'Q', NULL, NULL,
					NULL);

Kostrukce a přístup do menu se provádí pomocí indexování prvků hladin. Třetí parametr výše uvedené funkce XmVaCreateSimplePulldownMenu() tedy definuje rozbalovací menu pod první položkou menu menubar.

Podobně callback funkce rozbalovacího (pulldown menu) vypadá typicky takto:

void help_menu_select(Widget widget, int item) {
	switch (item) {
		case 0:
			printf("'About' selected\n");
			break;
		default:
			printf("Assertion failed: unknown menu item selected\n");
	}
}

Druhý parametr callback funkce určuje tedy položku menu, která byla vybrána.

Změna zdrojů

Při různých přílezitostech, kdy je potřeba měnit zdroje jednotlivých widgetů, můžeme použít funkce XtSetValues() a XtVaSetValues(). V naší ukázce po úspěšném vytvoření menu a pracovní plochy okna chceme tyto widgety nastavit jako příslušné zdroje hlavního okna. Použijeme tedy jednu z těchto funkcí:

	XtVaSetValues(main_window,
					XmNmenuBar, menubar,
					XmNworkWindow, area,
					NULL);