[comp.windows.x] Young's menu example

jstravis@athena.mit.edu (John S. Travis) (08/02/89)

Below is Douglas Youngs menu package from his book and it seems flawed?
Has anyone got it working? The problem appears to be in create_pane where he
declares "menu_struct  *menulist" then later he accesses menulist[i].name
and .func & .data. When compiling i get:invalid type argumenmt 'array indexing'


What's up? It's not an array as declared. What you send in is
a staic array of menu struct ( n items). Is this in other's books? How should
i declare it   menu_struct  *menulist[]....seems wrong?

thanks,
john travis



/**********************************
* menu.c simple menu package
********************************/

#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <Xw/Xw.h>
#include <Xw/MenuBtn.h>
#include <Xw/Cascade.h>
#include <Xw/PopupMgr.h>


typedef struct {
	char* name;
	void (*func)()
	caddr_t  data;
} menu_struct;

Widget create_menu_manger(parent,mgrname)
     Widget    parent;
     char   *mgrname;
{
  Widget shell = XtCreatePopupShell(mgrname,shellWidgetClass,parent,NULL,0);
  Widget menu_mgr = XtCreateManagedWidget(mgrname,XwpopupmgrWidgetClass,
                                         shell,NULL,0);
  return(menu_mgr);
}

create_pane(mgr,mgrname,name,menulist,nitems)
     Widget    mgr;
     char *name, *mgrname;
     menu_struct *menulist;
     int     nitems;
{
  Arg    wargs[1];
  Widget    menupane, pane_shell;
  int     i;
  WidgetList     buttons;
  /*
   * allocate a widgetlist to hold all the button widgets
   */
  buttons = (WidgetList) XtMalloc(nitems * sizeof(Widget));
  /*
   * create a popus shell to this pane
   */
  pane_shell = XtCreatePopupShell("pane_shell",shellWidgetClass,mgr,NULL,0);
  /*
   * create a cascade menu pan and attach it to the given menu manager
   */
  XtSetArg(wargs[0],XtNattachTo,(XtArgVal) mgrname);
  menupane = XtCreateManagedWidget(name,XwcascadeWidgetClass,
				   pane_shell,wargs,1);
  /*
   * create a menu button for each item in the menu
   */
  for (i=0; i < nitems; i++){
    buttons[i] = XtCreateWidget(menulist[i].name,XwmenubuttonWidgetClass,
                                menupane,NULL,0);
    XtAddCallback(buttons[i],XtNselect,menulist[i].func, menulist[i].data);
  }
  /*
   * manage all button widgets
   */
  XtManageChildren(buttons,nitems);
}