home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume13 / engarde / part02 / menus.c < prev    next >
C/C++ Source or Header  |  1992-02-11  |  2KB  |  66 lines

  1. /*********************************************************************
  2.                                 Engarde
  3.                              File: menus.c
  4.  
  5.   This file contains a convenience function to create menus from 
  6.   a structure tree.
  7.  
  8.   Version 1:  1/9/92  (Bill James)
  9. *********************************************************************/
  10. #include <X11/Intrinsic.h>
  11. #include <X11/StringDefs.h>
  12. #include <Xm/Xm.h>
  13. #include <Xm/Separator.h>
  14. #include <Xm/PushB.h>
  15. #include <Xm/CascadeB.h>
  16. #include <Xm/RowColumn.h>
  17. #include <Xm/Label.h>
  18. #include "menus.h"
  19.  
  20. void xs_create_menu_buttons(title, menu, menulist, nitems) 
  21. char *title;
  22. Widget menu;
  23. xs_menu_struct *menulist;
  24. int nitems;
  25. {
  26. Arg wargs[1];
  27. int i;
  28. WidgetList buttons;
  29. int separators = 0;
  30.    buttons = (WidgetList) XtMalloc (nitems * sizeof(Widget));
  31.    if (title) {
  32.       XtCreateManagedWidget(title, xmLabelWidgetClass, menu, NULL, 0);
  33.       XtCreateManagedWidget("separator", xmSeparatorWidgetClass, menu, NULL,0);
  34.    }
  35.    for (i = 0; i < nitems; i++) {
  36.       if (menulist[i].name == NULL) {
  37.          XtCreateManagedWidget("separator", xmSeparatorWidgetClass, 
  38.                 menu, NULL, 0);
  39.          separators++;
  40.       }
  41.       else if (menulist[i].func) {
  42.          buttons[i-separators] = XtCreateWidget(menulist[i].name,
  43.                         xmPushButtonWidgetClass,
  44.                         menu, NULL, 0);
  45.          XtAddCallback(buttons[i-separators], XmNactivateCallback, 
  46.             menulist[i].func, menulist[i].data);
  47.       }
  48.       else if (!menulist[i].sub_menu) 
  49.          buttons[i-separators] = XtCreateWidget(menulist[i].name,
  50.                         xmLabelWidgetClass,
  51.                         menu, NULL, 0);
  52.       else {
  53.          Widget sub_menu;
  54.          sub_menu = XmCreatePulldownMenu(menu, menulist[i].sub_menu_title,
  55.                         NULL, 0);
  56.          XtSetArg(wargs[0], XmNsubMenuId, sub_menu);
  57.          buttons[i-separators] = XtCreateWidget(menulist[i].name,
  58.                         xmCascadeButtonWidgetClass,
  59.                         menu, wargs, 1);
  60.          xs_create_menu_buttons(menulist[i].sub_menu_title, sub_menu,
  61.                 menulist[i].sub_menu, menulist[i].n_sub_items);
  62.       }
  63.    }
  64.    XtManageChildren(buttons, nitems - separators);
  65. }
  66.