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 / xmenu4.c < prev    next >
C/C++ Source or Header  |  1992-08-18  |  7KB  |  268 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.  *  xmenu4.c - a pulldown menu with a 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 <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, subshell, subbox, pressme;
  37.  
  38.  
  39. /*ARGSUSED*/
  40. void PlaceMenu(w, client_data, call_data)
  41. Widget w;
  42. XtPointer client_data;
  43. XtPointer call_data;
  44. {
  45.     Position x, y;
  46.  
  47.     /*
  48.      * translate coordinates in application top-level window
  49.      * into coordinates from root window origin.
  50.      */
  51.     XtTranslateCoords(pressme,                /* Widget */
  52.         (Position) 0,        /* x */
  53.         (Position) 0,       /* y */
  54.         &x, &y);          /* coords on root window */
  55.  
  56.     /* move popup shell one pixel above and left of this position 
  57.      * (it's not visible yet) */
  58.     XtVaSetValues(pshell, 
  59.             XtNx, x - 1,
  60.             XtNy, y - 1,
  61.             NULL);
  62. }
  63.  
  64. /*ARGSUSED*/
  65. void CheckRightAndPopupSubmenu(w, event, params, num_params)
  66. Widget w;
  67. XEvent *event;
  68. String *params;
  69. Cardinal *num_params;
  70. {
  71.     XLeaveWindowEvent *leave_event = (XLeaveWindowEvent *) event;
  72.     Dimension height;
  73.  
  74.     XtVaGetValues(w, 
  75.             XtNheight, &height,
  76.             NULL);
  77.  
  78.     if ((leave_event->x > 0) && (leave_event->y > 0) 
  79.                 && (leave_event->y < height)) {
  80.         /* move submenu shell to start just right of pane,
  81.          * using an arbitrary offset to place pointer in 
  82.          * first item. */
  83.         XtVaSetValues(subshell, 
  84.                 XtNx, leave_event->x_root,
  85.                 XtNy, leave_event->y_root - 12,
  86.                 NULL);
  87.         XtPopup(subshell, XtGrabExclusive);
  88.     }
  89. }
  90.  
  91. /*ARGSUSED*/
  92. void PopdownSubmenu(w, event, params, num_params)
  93. Widget w;
  94. XEvent *event;
  95. String *params;
  96. Cardinal *num_params;
  97. {
  98.     XtPopdown(subshell);
  99. }
  100.  
  101. /*
  102.  * quit button callback function
  103.  */
  104. /*ARGSUSED*/
  105. void Quit(w, client_data, call_data)
  106. Widget w;
  107. XtPointer client_data, call_data;
  108.     exit(0); 
  109. }
  110.  
  111. /*
  112.  * menu pane button callback function
  113.  */
  114. /*ARGSUSED*/
  115. void SubPaneChosen(w, client_data, call_data)
  116. Widget w;
  117. XtPointer client_data;  /* cast to pane_number */
  118. XtPointer call_data;  /* unused */
  119.     int pane_number = (int) client_data;
  120.     printf("SubPane %d chosen.\n", pane_number);
  121.     XtPopdown(subshell);
  122.     XtPopdown(pshell);
  123. }
  124.  
  125. /*
  126.  * menu pane button callback function
  127.  */
  128. /*ARGSUSED*/
  129. void MainPaneChosen(w, client_data, call_data)
  130. Widget w;
  131. XtPointer client_data;
  132. XtPointer call_data;
  133.     int pane_number = (int) client_data;
  134.     printf("Pane %d chosen.\n", pane_number);
  135.  
  136.     XtPopdown(pshell);
  137.     XtPopdown(subshell);
  138. }
  139.  
  140. main(argc, argv)
  141. int argc;
  142. char **argv;
  143. {
  144.     XtAppContext app_context;
  145.     Widget box, topLevel, quit, menubox, menulabel, menupane[10];
  146.     Widget sublabel, subpane[10];
  147.     int i;
  148.     String buf[50];
  149.  
  150.     static XtActionsRec trial_actions[] = {
  151.         {"checkRightAndPopupSubmenu", CheckRightAndPopupSubmenu},
  152.         {"popdownSubmenu", PopdownSubmenu},
  153.     };
  154.  
  155.     XtSetLanguageProc(NULL, (XtLanguageProc)NULL, NULL);
  156.  
  157.     topLevel = XtVaAppInitialize(
  158.         &app_context,       /* Application context */
  159.         "XMenu4",           /* application class name */
  160.         NULL, 0,            /* command line option list */
  161.         &argc, argv,        /* command line args */
  162.         NULL,               /* for missing app-defaults file */
  163.         NULL);              /* terminate varargs list */
  164.  
  165.     box = XtCreateManagedWidget(
  166.         "box",      /* widget name */
  167.         boxWidgetClass, /* widget class */
  168.         topLevel,       /* parent widget*/
  169.         NULL,       /* argument list*/
  170.         0           /* arglist size */
  171.         );
  172.  
  173.     quit = XtCreateManagedWidget(
  174.         "quit",         /* widget name */
  175.         commandWidgetClass,     /* widget class */
  176.         box,            /* parent widget*/
  177.         NULL,           /* argument list*/
  178.         0               /* arglist size */
  179.         );
  180.  
  181.     pressme = XtCreateManagedWidget(
  182.         "pressme",          /* widget name   */
  183.         commandWidgetClass,     /* widget class */
  184.         box,            /* parent widget*/
  185.         NULL,           /* argument list*/
  186.         0               /* arglist size */
  187.         );
  188.  
  189.     pshell = XtCreatePopupShell(
  190.     "pshell",        /* widget name */
  191.         transientShellWidgetClass, /* widget class */
  192.         pressme,        /* parent widget */
  193.         NULL,            /* argument list */
  194.         0            /* arglist size */
  195.         );
  196.  
  197.     menubox = XtCreateManagedWidget(
  198.         "menubox",              /* widget name   */
  199.         boxWidgetClass,         /* widget class */
  200.         pshell,                 /* parent widget*/
  201.         NULL,                   /* argument list*/
  202.         0                   /* arglist size */
  203.         );
  204.  
  205.     menulabel = XtCreateManagedWidget(
  206.         "menulabel",            /* widget name   */
  207.         labelWidgetClass,       /* widget class */
  208.         menubox,                /* parent widget*/
  209.         NULL,                   /* argument list*/
  210.         0                   /* arglist size */
  211.         );
  212.  
  213.     XtAppAddActions(app_context, trial_actions, XtNumber(trial_actions));
  214.  
  215.     for (i = 0; i < 10; i++) {
  216.       sprintf(buf, "menupane%d", i);
  217.       menupane[i] = XtCreateManagedWidget(buf,   /* widget name   */
  218.                     commandWidgetClass, menubox, NULL, 0);
  219.  
  220.       XtAddCallback(menupane[i], XtNcallback, MainPaneChosen, i);
  221.     }
  222.  
  223.     subshell = XtCreatePopupShell(
  224.         "subshell",        /* widget name */
  225.         transientShellWidgetClass, /* widget class */
  226.     pressme,        /* parent widget */
  227.         NULL,            /* argument list */
  228.         0            /* arglist size */
  229.         );
  230.  
  231.     subbox = XtCreateManagedWidget(
  232.         "subbox",               /* widget name   */
  233.         boxWidgetClass,         /* widget class */
  234.         subshell,               /* parent widget*/
  235.         NULL,                   /* argument list*/
  236.         0                   /* arglist size */
  237.         );
  238.  
  239.     sublabel = XtCreateManagedWidget(
  240.         "sublabel",             /* widget name   */
  241.         labelWidgetClass,       /* widget class */
  242.         subbox,                 /* parent widget*/
  243.         NULL,                   /* argument list*/
  244.         0                   /* arglist size */
  245.         );
  246.     
  247.     for (i = 0; i < 10; i++) {
  248.       sprintf(buf, "subpane%d", i);
  249.       subpane[i] = XtCreateManagedWidget(buf,   /* widget name   */
  250.                     commandWidgetClass, subbox, NULL, 0);
  251.  
  252.       XtAddCallback(subpane[i], XtNcallback, SubPaneChosen, i);
  253.     }
  254.  
  255.     XtAddCallback(quit, XtNcallback, Quit, NULL);
  256.  
  257.     XtAppAddActions(app_context, trial_actions, XtNumber(trial_actions));
  258.  
  259.     XtAddCallback(pshell, XtNpopupCallback, PlaceMenu, NULL);
  260.  
  261.     XtRealizeWidget(topLevel);
  262.  
  263.     XtAppMainLoop(app_context);
  264. }
  265.