home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / m / motifpg2.zip / ch13 / xpopupcasc.c < prev   
C/C++ Source or Header  |  1992-08-18  |  3KB  |  135 lines

  1. /*
  2.  * Copyright 1989, 1992 O'Reilly and Associates, Inc.
  3.  * See ../Copyright for complete rights and liability information.
  4.  */
  5.  
  6.  
  7. /* 
  8.  *  xpopupcasc.c - Motif popup menu with cascading submenu
  9.  */
  10.  
  11. /*
  12.  *  So that we can use fprintf:
  13.  */
  14. #include <stdio.h>
  15.  
  16. /* 
  17.  * Standard Toolkit include files:
  18.  */
  19. #include <Xm/Xm.h>
  20.  
  21. /*
  22.  * Public include files for widgets used in this file.
  23.  */
  24. #include <Xm/RowColumn.h>
  25. #include <Xm/PushB.h>
  26. #include <Xm/Label.h>
  27. #include <Xm/CascadeB.h>
  28.  
  29. /*
  30.  * quit button callback function
  31.  */
  32. /*ARGSUSED*/
  33. void Quit(w, client_data, call_data)
  34. Widget w;
  35. XtPointer client_data, call_data;
  36.     exit(0); 
  37. }
  38.  
  39. /*
  40.  * menu pane button callback function
  41.  */
  42. /*ARGSUSED*/
  43. void PaneChosen(w, client_data, call_data)
  44. Widget w;
  45. XtPointer client_data;   /* cast to pane_number */
  46. XtPointer call_data;
  47.     int pane_number = (int) client_data;
  48.     printf("Pane %d chosen.\n", pane_number);
  49. }
  50.  
  51. static void  
  52. PostMenu (w, client_data, event)
  53. Widget         w;
  54. XtPointer      client_data;
  55. XEvent  *event;
  56. {
  57.     Widget popup = (Widget) client_data;
  58.  
  59.     XmMenuPosition(popup, event);
  60.     XtManageChild (popup);
  61. }
  62.  
  63. main(argc, argv)
  64. int argc;
  65. char **argv;
  66. {
  67.     XtAppContext app_context;
  68.     Widget topLevel, box, quit, label, menupane[10];
  69.     Widget menu, cascade, submenu, subentry[10];
  70.     int i;
  71.     String buf[50];
  72.  
  73.     XtSetLanguageProc(NULL, (XtLanguageProc)NULL, NULL);
  74.  
  75.     topLevel = XtVaAppInitialize(
  76.         &app_context,       /* Application context */
  77.         "XPopup",           /* application class name */
  78.         NULL, 0,            /* command line option list */
  79.         &argc, argv,        /* command line args */
  80.         NULL,               /* for missing app-defaults file */
  81.         NULL);              /* terminate varargs list */
  82.  
  83.     box = XtVaCreateManagedWidget(
  84.         "box",          /* widget name */
  85.         xmRowColumnWidgetClass, /* widget class */
  86.         topLevel,           /* parent widget*/
  87.         NULL);           /* argument list*/
  88.  
  89.     label = XtVaCreateManagedWidget(
  90.         "label",            /* widget name */
  91.         xmLabelWidgetClass,       /* widget class */
  92.         box,            /* parent widget*/
  93.         NULL);           /* argument list*/
  94.  
  95.     quit = XtVaCreateManagedWidget(
  96.         "quit",         /* widget name */
  97.         xmPushButtonWidgetClass,/* widget class */
  98.         box,            /* parent widget*/
  99.         NULL);           /* argument list*/
  100.  
  101.     XtAddCallback(quit, XmNactivateCallback, Quit, NULL);
  102.  
  103.     menu = XmCreatePopupMenu(label, "menu", NULL, 0);
  104.  
  105.     XtAddEventHandler(label, ButtonPressMask, False, PostMenu, menu);
  106.  
  107.     for (i = 0; i < 10; i++) {
  108.       sprintf(buf, "entry%d", i);
  109.       menupane[i] = XtVaCreateManagedWidget(buf,   /* widget name   */
  110.                     xmPushButtonWidgetClass, menu, NULL, 0);
  111.  
  112.       XtAddCallback(menupane[i], XmNactivateCallback, PaneChosen, i);
  113.     }
  114.  
  115.     submenu = XmCreatePulldownMenu(menu, "submenu", NULL, 0);
  116.  
  117.     cascade = XtVaCreateManagedWidget("cascade", 
  118.                       xmCascadeButtonWidgetClass, menu, 
  119.                       XmNsubMenuId, submenu,
  120.                       NULL);
  121.  
  122.     for (i = 0; i < 10; i++) {
  123.       sprintf(buf, "subentry%d", i);
  124.       subentry[i] = XtVaCreateManagedWidget(buf,   /* widget name   */
  125.                     xmPushButtonWidgetClass, submenu, NULL);
  126.       XtAddCallback(subentry[i], XmNactivateCallback, PaneChosen, i);
  127.     }
  128.  
  129.     XtRealizeWidget(topLevel);
  130.  
  131.     XtAppMainLoop(app_context);
  132. }
  133.