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 / xmenu5.c < prev    next >
C/C++ Source or Header  |  1992-08-18  |  7KB  |  259 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.  *  xmenu5.c - cascading spring-loaded menu
  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 <X11/Intrinsic.h>
  20. #include <X11/StringDefs.h>
  21.  
  22. #include <X11/Shell.h>
  23.  
  24. /*
  25.  * Public include files for widgets used in this file.
  26.  */
  27. #include <X11/Xaw/Command.h>
  28. #include <X11/Xaw/Box.h>
  29. #include <X11/Xaw/Label.h>
  30.  
  31. /*
  32.  * The popup shell ID is global because both dialog and pshell
  33.  * are needed in the dialogDone callback, and both can't be
  34.  * passed in without creating a structure.
  35.  */
  36. Widget pshell, menubox, subshell, subbox;
  37.  
  38.  
  39. /*ARGSUSED*/
  40. void PlaceMenu(w, event, params, num_params)
  41. Widget w;
  42. XEvent *event;
  43. String *params;
  44. Cardinal *num_params;
  45. {
  46.     XButtonEvent *bevent = (XButtonEvent *) event;
  47.  
  48.     /* should make sure coordinates allow menu to fit on screen */
  49.  
  50.     /* move submenu shell to slightly left and above button
  51.      * press position */
  52.     XtVaSetValues(pshell, 
  53.             XtNx, bevent->x_root - 10,
  54.             XtNy, bevent->y_root - 10,
  55.             NULL);
  56. }
  57.  
  58. /*ARGSUSED*/
  59. void CheckRightAndPopupSubmenu(w, event, params, num_params)
  60. Widget w;
  61. XEvent *event;
  62. String *params;
  63. Cardinal *num_params;
  64. {
  65.     XLeaveWindowEvent *leave_event = (XLeaveWindowEvent *) event;
  66.     Dimension height, width;
  67.  
  68.     XtVaGetValues(w, 
  69.         XtNheight, &height,
  70.         XtNwidth, &width,
  71.         NULL);
  72.  
  73.     if ((leave_event->x > width) && (leave_event->y > 0) && (leave_event->y < height)) {
  74.         /* move submenu shell to start just right of pane,
  75.          * using an arbitrary offset to place pointer in 
  76.          * first item. */
  77.         XtVaSetValues(subshell, 
  78.             XtNx, leave_event->x_root,
  79.             XtNy, leave_event->y_root - 12,
  80.             NULL);
  81.         XtPopup(subshell, XtGrabNonexclusive);
  82.     }
  83. }
  84.  
  85. /*ARGSUSED*/
  86. void PopdownSubmenu(w, event, params, num_params)
  87. Widget w;
  88. XEvent *event;
  89. String *params;
  90. Cardinal *num_params;
  91. {
  92.     XtPopdown(subshell);
  93. }
  94.  
  95. /*
  96.  * quit button callback function
  97.  */
  98. /*ARGSUSED*/
  99. void Quit(w, client_data, call_data)
  100. Widget w;
  101. XtPointer client_data, call_data;
  102.     exit(0); 
  103. }
  104.  
  105. /*
  106.  * menu pane button callback function
  107.  */
  108. /*ARGSUSED*/
  109. void SubPaneChosen(w, client_data, call_data)
  110. Widget w;
  111. XtPointer client_data;  /* cast to pane_number */
  112. XtPointer call_data;
  113.     int pane_number = (int) client_data;
  114.     printf("SubPane %d chosen.\n", pane_number);
  115.     XtPopdown(subshell);
  116.     XtPopdown(pshell);
  117. }
  118.  
  119. /*
  120.  * menu pane button callback function
  121.  */
  122. /*ARGSUSED*/
  123. void MainPaneChosen(w, client_data, call_data)
  124. Widget w;
  125. XtPointer client_data;
  126. XtPointer call_data;
  127.     int pane_number = (int) client_data;
  128.     printf("Pane %d chosen.\n", pane_number);
  129.  
  130.     XtPopdown(pshell);
  131.     XtPopdown(subshell);
  132. }
  133.  
  134. main(argc, argv)
  135. int argc;
  136. char **argv;
  137. {
  138.     XtAppContext app_context;
  139.     Widget box, topLevel, quit, label, menulabel, menupane[10];
  140.     Widget sublabel, subpane[10];
  141.     int i;
  142.     String buf[50];
  143.  
  144.     static XtActionsRec trial_actions[] = {
  145.         {"checkRightAndPopupSubmenu", CheckRightAndPopupSubmenu},
  146.         {"popdownSubmenu", PopdownSubmenu},
  147.         {"placeMenu", PlaceMenu},
  148.     };
  149.  
  150.     topLevel = XtVaAppInitialize(
  151.         &app_context,       /* Application context */
  152.         "XMenu5",           /* application class name */
  153.         NULL, 0,            /* command line option list */
  154.         &argc, argv,        /* command line args */
  155.         NULL,               /* for missing app-defaults file */
  156.         NULL);              /* terminate varargs list */
  157.  
  158.     box = XtCreateManagedWidget(
  159.         "box",      /* widget name */
  160.         boxWidgetClass, /* widget class */
  161.         topLevel,       /* parent widget*/
  162.         NULL,       /* argument list*/
  163.         0           /* arglist size */
  164.         );
  165.  
  166.     quit = XtCreateManagedWidget(
  167.         "quit",         /* widget name */
  168.         commandWidgetClass,     /* widget class */
  169.         box,            /* parent widget*/
  170.         NULL,           /* argument list*/
  171.         0               /* arglist size */
  172.         );
  173.  
  174.     label = XtCreateManagedWidget(
  175.         "label",            /* widget name   */
  176.         labelWidgetClass,       /* widget class */
  177.         box,            /* parent widget*/
  178.         NULL,           /* argument list*/
  179.         0               /* arglist size */
  180.         );
  181.  
  182.     pshell = XtCreatePopupShell(
  183.         "pshell",        /* widget name */
  184.         transientShellWidgetClass, /* widget class */
  185.         topLevel,        /* parent widget */
  186.         NULL,            /* argument list */
  187.         0            /* arglist size */
  188.         );
  189.  
  190.     menubox = XtCreateManagedWidget(
  191.         "menubox",              /* widget name   */
  192.         boxWidgetClass,         /* widget class */
  193.         pshell,                 /* parent widget*/
  194.         NULL,                   /* argument list*/
  195.         0                   /* arglist size */
  196.         );
  197.     
  198.     menulabel = XtCreateManagedWidget(
  199.         "menulabel",            /* widget name   */
  200.         labelWidgetClass,       /* widget class */
  201.         menubox,                /* parent widget*/
  202.         NULL,                   /* argument list*/
  203.         0                   /* arglist size */
  204.         );
  205.  
  206.     XtAppAddActions(app_context, trial_actions, XtNumber(trial_actions));
  207.  
  208.     for (i = 0; i < 10; i++) {
  209.       sprintf(buf, "menupane%d", i);
  210.       menupane[i] = XtCreateManagedWidget(buf,   /* widget name   */
  211.                     commandWidgetClass, menubox, NULL, 0);
  212.  
  213.       XtAddCallback(menupane[i], XtNcallback, MainPaneChosen, i);
  214.     }
  215.  
  216.     subshell = XtCreatePopupShell(
  217.         "subshell",        /* widget name */
  218.         transientShellWidgetClass, /* widget class */
  219.     topLevel,        /* parent widget */
  220.         NULL,            /* argument list */
  221.         0            /* arglist size */
  222.         );
  223.  
  224.     subbox = XtCreateManagedWidget(
  225.         "subbox",               /* widget name   */
  226.         boxWidgetClass,         /* widget class */
  227.         subshell,               /* parent widget*/
  228.         NULL,                   /* argument list*/
  229.         0                   /* arglist size */
  230.         );
  231.  
  232.     sublabel = XtCreateManagedWidget(
  233.         "sublabel",              /* widget name   */
  234.         labelWidgetClass,        /* widget class */
  235.         subbox,                  /* parent widget*/
  236.         NULL,                    /* argument list*/
  237.         0                    /* arglist size */
  238.         );
  239.     
  240.     for (i = 0; i < 10; i++) {
  241.         sprintf(buf, "subpane%d", i);
  242.             subpane[i] = XtCreateManagedWidget(buf,   /* widget name   */
  243.                     commandWidgetClass, subbox, NULL, 0);
  244.  
  245.         XtAddCallback(subpane[i], XtNcallback, SubPaneChosen, i);
  246.     }
  247.  
  248.     XtAddCallback(quit, XtNcallback, Quit, NULL);
  249.  
  250.     XtAppAddActions(app_context, trial_actions, XtNumber(trial_actions));
  251.  
  252.     XtRealizeWidget(topLevel);
  253.  
  254.     XtAppMainLoop(app_context);
  255. }
  256.