/* * CDE - Common Desktop Environment * * Copyright (c) 1993-2012, The Open Group. All rights reserved. * * These libraries and programs are free software; you can * redistribute them and/or modify them under the terms of the GNU * Lesser General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * These libraries and programs are distributed in the hope that * they will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public * License along with these libraries and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* $XConsortium: controls.c /main/4 1995/10/27 10:41:00 rswiston $ */ /* * (c) Copyright 1993, 1994 Hewlett-Packard Company * (c) Copyright 1993, 1994 International Business Machines Corp. * (c) Copyright 1993, 1994 Sun Microsystems, Inc. * (c) Copyright 1993, 1994 Novell, Inc. */ /* * controls.c * * Example code for libDtWidget controls * (ComboBox, SpinBox, MenuButton) */ #include #include #include
#include
#define ApplicationClass "Controls" static void CreateSpinBoxes(Widget); static void CreateComboBoxes(Widget); static void CreateMenuButtons(Widget); main(int argc, char **argv) { XtAppContext appContext; Arg args[20]; int n; Widget toplevel, mainWindow, spinContainer, comboContainer, menuContainer; toplevel = XtAppInitialize(&appContext, ApplicationClass, NULL, 0, &argc, argv, NULL, NULL, 0); n = 0; XtSetArg(args[n], XmNorientation, XmHORIZONTAL); n++; XtSetArg(args[n], XmNspacing, 40); n++; mainWindow = XmCreateWorkArea(toplevel, "mainWindow", args, n); XtManageChild(mainWindow); n = 0; XtSetArg(args[n], XmNspacing, 20); n++; spinContainer = XmCreateWorkArea(mainWindow, "spinContainer", args, n); XtManageChild(spinContainer); CreateSpinBoxes(spinContainer); n = 0; XtSetArg(args[n], XmNspacing, 20); n++; comboContainer = XmCreateWorkArea(mainWindow, "comboContainer", args, n); XtManageChild(comboContainer); CreateComboBoxes(comboContainer); n = 0; XtSetArg(args[n], XmNspacing, 20); n++; menuContainer = XmCreateWorkArea(mainWindow, "menuContainer", args, n); XtManageChild(menuContainer); CreateMenuButtons(menuContainer); XtRealizeWidget(toplevel); XtAppMainLoop(appContext); } /* * Example code for XmSimpleSpinBox */ static char *spinValueStrings[] = { "alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", "mu", "nu", "xi", "omicron", "pi", "rho", "sigma", "tau", "upsilon", "phi", "chi", "psi", "omega" }; static void ModifyVerifyCb(Widget, XtPointer, XtPointer); static void CreateSpinBoxes(Widget parent) { Widget titleLabel, spinBox; XmString *valueXmstrings; int numValueStrings; XmString labelString; Arg args[20]; int i, n; /* Create value compound strings */ numValueStrings = XtNumber(spinValueStrings); valueXmstrings = (XmString *)XtMalloc(numValueStrings * sizeof(XmString*)); for (i = 0; i < numValueStrings; i++) { valueXmstrings[i] = XmStringCreateLocalized(spinValueStrings[i]); } /* Create title label */ labelString = XmStringCreateLocalized("SpinBox Widget"); n = 0; XtSetArg(args[n], XmNlabelString, labelString); n++; titleLabel = XmCreateLabel(parent, "title", args, n); XtManageChild(titleLabel); XmStringFree(labelString); /* * Create a SimpleSpinBox containing string values. */ n = 0; XtSetArg(args[n], XmNvalues, valueXmstrings); n++; XtSetArg(args[n], XmNnumValues, numValueStrings); n++; XtSetArg(args[n], XmNcolumns, 10); n++; spinBox = XmCreateSimpleSpinBox(parent, "spinBox1", args, n); XtManageChild(spinBox); /* * Create a SpinBox containing numeric values to 3 decimal places. * Position the arrows on either side of the displayed value. */ n = 0; XtSetArg(args[n], XmNspinBoxChildType, XmNUMERIC); n++; XtSetArg(args[n], XmNminimumValue, 1000); n++; XtSetArg(args[n], XmNmaximumValue, 100000); n++; XtSetArg(args[n], XmNincrementValue,1000); n++; XtSetArg(args[n], XmNdecimalPoints,3); n++; XtSetArg(args[n], XmNposition,1000); n++; XtSetArg(args[n], XmNarrowLayout, XmARROWS_SPLIT); n++; XtSetArg(args[n], XmNcolumns, 10); n++; spinBox = XmCreateSimpleSpinBox(parent, "spinBox2", args, n); XtManageChild(spinBox); /* * Create a SpinBox containing numeric values to 2 decimal places. * Position the arrows on the left of the displayed value. * Disallow alternate user changes by adding a modify/verify callback. */ n = 0; XtSetArg(args[n], XmNspinBoxChildType, XmNUMERIC); n++; XtSetArg(args[n], XmNminimumValue, 1500); n++; XtSetArg(args[n], XmNmaximumValue, 60500); n++; XtSetArg(args[n], XmNincrementValue,1500); n++; XtSetArg(args[n], XmNdecimalPoints,2); n++; XtSetArg(args[n], XmNposition,7500); n++; XtSetArg(args[n], XmNarrowLayout, XmARROWS_FLAT_BEGINNING); n++; XtSetArg(args[n], XmNcolumns, 10); n++; spinBox = XmCreateSimpleSpinBox(parent, "spinBox3", args, n); XtManageChild(spinBox); XtAddCallback(spinBox, XmNmodifyVerifyCallback, ModifyVerifyCb, NULL); /* * Create a SpinBox containing string values. * Position the arrows on the left of the display value */ n = 0; XtSetArg(args[n], XmNvalues, valueXmstrings); n++; XtSetArg(args[n], XmNnumValues, numValueStrings); n++; XtSetArg(args[n], XmNarrowLayout, XmARROWS_BEGINNING); n++; XtSetArg(args[n], XmNcolumns, 10); n++; spinBox = XmCreateSimpleSpinBox(parent, "spinBox4", args, n); XtManageChild(spinBox); /* * Create a SpinBox containing numeric values to 3 decimal places. * Position the arrows on the right of the displayed value. */ n = 0; XtSetArg(args[n], XmNspinBoxChildType, XmNUMERIC); n++; XtSetArg(args[n], XmNminimumValue, 1000); n++; XtSetArg(args[n], XmNmaximumValue, 100000); n++; XtSetArg(args[n], XmNincrementValue,1000); n++; XtSetArg(args[n], XmNdecimalPoints,3); n++; XtSetArg(args[n], XmNposition,1000); n++; XtSetArg(args[n], XmNarrowLayout, XmARROWS_FLAT_END); n++; XtSetArg(args[n], XmNcolumns, 10); n++; spinBox = XmCreateSimpleSpinBox(parent, "spinBox5", args, n); XtManageChild(spinBox); /* * Free value strings, SpinBox has taken a copy. */ for (i = 0; i < numValueStrings; i++) { XmStringFree(valueXmstrings[i]); } XtFree((char*)valueXmstrings); } /* * modify/verify callback. * * Allow/disallow alternate user changes */ static void ModifyVerifyCb(Widget w, XtPointer cd, XtPointer cb) { XmSpinBoxCallbackStruct *scb= (XmSpinBoxCallbackStruct*)cb; static Boolean allowChange = True; scb->doit = allowChange; if (allowChange == False) { printf("XmSpinBox: XmNmodifyVerifyCallback. Change disallowed.\n"); XBell(XtDisplay(w), 0); } allowChange = (allowChange == True) ? False : True; } /* * Example code for DtComboBox */ static char *comboValueStrings[] = { "alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", "mu", "nu", "xi", "omicron", "pi", "rho", "sigma", "tau", "upsilon", "phi", "chi", "psi", "omega" }; static char *colorStrings[] = { "Red", "Yellow", "Green", "Brown", "Blue" }; static void CreateComboBoxes(Widget parent) { Widget titleLabel, comboBox, list; XmString *valueXmstrings, *colorXmstrings; int numValueStrings, numColorStrings; XmString labelString, xmString; Arg args[20]; int i, n; /* Create value compound strings */ numValueStrings = XtNumber(comboValueStrings); valueXmstrings = (XmString *)XtMalloc(numValueStrings * sizeof(XmString*)); for (i = 0; i < numValueStrings; i++) { valueXmstrings[i] = XmStringCreateLocalized(comboValueStrings[i]); } /* Create color compound strings */ numColorStrings = XtNumber(colorStrings); colorXmstrings = (XmString *)XtMalloc(numColorStrings * sizeof(XmString*)); for (i = 0; i < numColorStrings; i++) { colorXmstrings[i] = XmStringCreateLocalized(colorStrings[i]); } /* Create title label */ labelString = XmStringCreateLocalized("ComboBox Widget"); n = 0; XtSetArg(args[n], XmNlabelString, labelString); n++; titleLabel = XmCreateLabel(parent, "title", args, n); XtManageChild(titleLabel); XmStringFree(labelString); /* * Create an editable ComboBox containing the color strings. * Get the widget id of the drop down list, add some greek * letter names to it, and make more items visible. */ n = 0; XtSetArg(args[n], DtNcomboBoxType, DtDROP_DOWN_COMBO_BOX); n++; XtSetArg(args[n], DtNitems, colorXmstrings); n++; XtSetArg(args[n], DtNitemCount, numColorStrings); n++; XtSetArg(args[n], DtNvisibleItemCount, 5); n++; XtSetArg(args[n], DtNcolumns, 10); n++; comboBox = DtCreateComboBox(parent, "comboBox1", args, n); XtManageChild(comboBox); list = XtNameToWidget(comboBox, "*List"); XmListAddItems(list, valueXmstrings, 10, 0); XtVaSetValues(list, XmNvisibleItemCount, 10, NULL); /* * Create an editable ComboBox with no entries. * Get the widget id of the drop down list, add some greek * letter names to it and select the third item in the list. */ n = 0; XtSetArg(args[n], DtNcomboBoxType, DtDROP_DOWN_COMBO_BOX); n++; XtSetArg(args[n], DtNorientation, DtLEFT); n++; XtSetArg(args[n], DtNcolumns, 10); n++; comboBox = DtCreateComboBox(parent, "comboBox2", args, n); XtManageChild(comboBox); list = XtNameToWidget(comboBox, "*List"); XmListAddItems(list, valueXmstrings, 7, 0); XtVaSetValues(list, XmNvisibleItemCount, 7, NULL); XtVaSetValues(comboBox, DtNselectedPosition, 3, NULL); /* * Create a non-editable ComboBox containing some greek letter names. * Position the arrow on the left. * Select the 'gamma' item in the list. */ n = 0; XtSetArg(args[n], DtNorientation, DtLEFT); n++; XtSetArg(args[n], DtNitems, valueXmstrings); n++; XtSetArg(args[n], DtNitemCount, numValueStrings); n++; XtSetArg(args[n], DtNvisibleItemCount, 8); n++; comboBox = DtCreateComboBox(parent, "comboBox3", args, n); XtManageChild(comboBox); xmString = XmStringCreateLocalized("gamma"); XtVaSetValues(comboBox, DtNselectedItem, xmString, NULL); XmStringFree(xmString); /* * Create a non-editable ComboBox with no entries. * Position the arrow on the right. * Add the greek letter names to the list and select the fourth item. */ n = 0; XtSetArg(args[n], DtNorientation, DtRIGHT); n++; XtSetArg(args[n], DtNvisibleItemCount, 8); n++; comboBox = DtCreateComboBox(parent, "comboBox4", args, n); XtManageChild(comboBox); for (i = 0; i < numValueStrings; i++) { DtComboBoxAddItem(comboBox, valueXmstrings[i], 0, True); } XtVaSetValues(comboBox, DtNselectedPosition, 4, NULL); /* * Free value and color strings, ComboBox has taken a copy. */ for (i = 0; i < numValueStrings; i++) { XmStringFree(valueXmstrings[i]); } XtFree((char*)valueXmstrings); for (i = 0; i < numColorStrings; i++) { XmStringFree(colorXmstrings[i]); } XtFree((char*)colorXmstrings); } /* * Example code for DtMenuButton */ /* MenuButton custom glyph */ #define menu_glyph_width 16 #define menu_glyph_height 16 static unsigned char menu_glyph_bits[] = { 0xe0, 0x03, 0x98, 0x0f, 0x84, 0x1f, 0x82, 0x3f, 0x82, 0x3f, 0x81, 0x7f, 0x81, 0x7f, 0xff, 0x7f, 0xff, 0x40, 0xff, 0x40, 0xfe, 0x20, 0xfe, 0x20, 0xfc, 0x10, 0xf8, 0x0c, 0xe0, 0x03, 0x00, 0x00}; static void CreateMenuButtons(Widget parent) { Widget menuButton, submenu, titleLabel, button; Pixmap cascadePixmap; Pixel fg, bg; Cardinal depth; XmString labelString; Arg args[20]; int i, n; /* Create title label */ labelString = XmStringCreateLocalized("MenuButton Widget"); n = 0; XtSetArg(args[n], XmNlabelString, labelString); n++; titleLabel = XmCreateLabel(parent, "title", args, n); XtManageChild(titleLabel); XmStringFree(labelString); /* * Create a MenuButton. * Add push buttons to the built-in popup menu. */ labelString = XmStringCreateLocalized("Action"); n = 0; XtSetArg(args[n], XmNlabelString, labelString); n++; menuButton = DtCreateMenuButton(parent, "menuButton1", args, n); XtManageChild(menuButton); XmStringFree(labelString); XtVaGetValues(menuButton, DtNsubMenuId, &submenu, NULL); button = XmCreatePushButton(submenu, "Push", NULL, 0); XtManageChild(button); button = XmCreatePushButton(submenu, "Pull", NULL, 0); XtManageChild(button); button = XmCreatePushButton(submenu, "Turn", NULL, 0); XtManageChild(button); /* * Create a MenuButton. * Replace the built-in popup menu with a tear-off menu. * Add a custom pixmap in the colors of the MenuButton. */ labelString = XmStringCreateLocalized("Movement"); n = 0; XtSetArg(args[n], XmNlabelString, labelString); n++; menuButton = DtCreateMenuButton(parent, "menuButton1", args, n); XtManageChild(menuButton); XmStringFree(labelString); /* Create a tear-off menu */ n = 0; XtSetArg(args[0], XmNtearOffModel, XmTEAR_OFF_ENABLED); n++; submenu = XmCreatePopupMenu(menuButton, "submenu", args, n); button = XmCreatePushButton(submenu, "Run", NULL, 0); XtManageChild(button); button = XmCreatePushButton(submenu, "Jump", NULL, 0); XtManageChild(button); button = XmCreatePushButton(submenu, "Stop", NULL, 0); XtManageChild(button); XtVaSetValues(menuButton, DtNsubMenuId, submenu, NULL); /* Create a pixmap using the menu button's colors and depth */ XtVaGetValues(menuButton, XmNforeground, &fg, XmNbackground, &bg, XmNdepth, &depth, NULL); cascadePixmap = XCreatePixmapFromBitmapData(XtDisplay(menuButton), DefaultRootWindow(XtDisplay(menuButton)), (char*)menu_glyph_bits, menu_glyph_width, menu_glyph_height, fg, bg, depth); XtVaSetValues(menuButton, DtNcascadePixmap, cascadePixmap, NULL); }