|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T x
Length: 6908 (0x1afc) Types: TextFile Names: »xmenu4.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5 └─⟦2ca9b63e1⟧ »./contrib-1/contrib-1.00« └─⟦a8392fb20⟧ └─⟦this⟧ »contrib/examples/OReilly/Vol4/ch12/xmenu4.c«
/* * Copyright 1989 O'Reilly and Associates, Inc. * See ../Copyright for complete rights and liability information. */ /* * xmenu4.c - cascaded pulldown menu (using leave) */ /* * So that we can use fprintf: */ #include <stdio.h> /* * Standard Toolkit include files: */ #include <X11/Intrinsic.h> #include <X11/StringDefs.h> #include <X11/Shell.h> /* * Public include files for widgets used in this file. */ #include <X11/Xaw/Command.h> #include <X11/Xaw/Box.h> #include <X11/Xaw/Label.h> /* * The popup shell ID is global because both dialog and pshell * are needed in the dialogDone callback, and both can't be * passed in without creating a structure. */ Widget pshell, subshell, subbox, pressme; /*ARGSUSED*/ void PlaceMenu(w, client_data, call_data) Widget w; XtPointer client_data; XtPointer call_data; { Position x, y; /* * translate coordinates in application top-level window * into coordinates from root window origin. */ XtTranslateCoords(pressme, /* Widget */ (Position) 0, /* x */ (Position) 0, /* y */ &x, &y); /* coords on root window */ /* move popup shell one pixel above and left of this position * (it's not visible yet) */ XtVaSetValues(pshell, XtNx, x - 1, XtNy, y - 1, NULL); } /*ARGSUSED*/ void CheckRightAndPopupSubmenu(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { XLeaveWindowEvent *leave_event = (XLeaveWindowEvent *) event; Dimension height; XtVaGetValues(w, XtNheight, &height, NULL); if ((leave_event->x > 0) && (leave_event->y > 0) && (leave_event->y < height)) { /* move submenu shell to start just right of pane, * using an arbitrary offset to place pointer in * first item. */ XtVaSetValues(subshell, XtNx, leave_event->x_root, XtNy, leave_event->y_root - 12, NULL); XtPopup(subshell, XtGrabExclusive); } } /*ARGSUSED*/ void PopdownSubmenu(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { XtPopdown(subshell); } /* * quit button callback function */ /*ARGSUSED*/ void Quit(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { exit(0); } /* * menu pane button callback function */ /*ARGSUSED*/ void SubPaneChosen(w, client_data, call_data) Widget w; XtPointer client_data; /* cast to pane_number */ XtPointer call_data; /* unused */ { int pane_number = (int) client_data; printf("SubPane %d chosen.\n", pane_number); XtPopdown(subshell); XtPopdown(pshell); } /* * menu pane button callback function */ /*ARGSUSED*/ void MainPaneChosen(w, client_data, call_data) Widget w; XtPointer client_data; XtPointer call_data; { int pane_number = (int) client_data; printf("Pane %d chosen.\n", pane_number); XtPopdown(pshell); XtPopdown(subshell); } main(argc, argv) int argc; char **argv; { XtAppContext app_context; Widget box, topLevel, quit, menubox, menulabel, menupane[10], sublabel, subpane[10]; int i; String buf[50]; static XtActionsRec trial_actions[] = { {"checkRightAndPopupSubmenu", CheckRightAndPopupSubmenu}, {"popdownSubmenu", PopdownSubmenu}, }; topLevel = XtVaAppInitialize( &app_context, /* Application context */ "XMenu4", /* application class name */ NULL, 0, /* command line option list */ &argc, argv, /* command line args */ NULL, /* for missing app-defaults file */ NULL); /* terminate varargs list */ box = XtCreateManagedWidget( "box", /* widget name */ boxWidgetClass, /* widget class */ topLevel, /* parent widget*/ NULL, /* argument list*/ 0 /* arglist size */ ); quit = XtCreateManagedWidget( "quit", /* widget name */ commandWidgetClass, /* widget class */ box, /* parent widget*/ NULL, /* argument list*/ 0 /* arglist size */ ); pressme = XtCreateManagedWidget( "pressme", /* widget name */ commandWidgetClass, /* widget class */ box, /* parent widget*/ NULL, /* argument list*/ 0 /* arglist size */ ); pshell = XtCreatePopupShell( "pshell", transientShellWidgetClass, pressme, NULL, 0 ); menubox = XtCreateManagedWidget( "menubox", /* widget name */ boxWidgetClass, /* widget class */ pshell, /* parent widget*/ NULL, /* argument list*/ 0 /* arglist size */ ); menulabel = XtCreateManagedWidget( "menulabel", /* widget name */ labelWidgetClass, /* widget class */ menubox, /* parent widget*/ NULL, /* argument list*/ 0 /* arglist size */ ); XtAppAddActions(app_context, trial_actions, XtNumber(trial_actions)); for (i = 0; i < 10; i++) { sprintf(buf, "menupane%d", i); menupane[i] = XtCreateManagedWidget(buf, /* widget name */ commandWidgetClass, menubox, NULL, 0); XtAddCallback(menupane[i], XtNcallback, MainPaneChosen, i); } subshell = XtCreatePopupShell( "subshell", transientShellWidgetClass, pressme, NULL, 0 ); subbox = XtCreateManagedWidget( "subbox", /* widget name */ boxWidgetClass, /* widget class */ subshell, /* parent widget*/ NULL, /* argument list*/ 0 /* arglist size */ ); sublabel = XtCreateManagedWidget( "sublabel", /* widget name */ labelWidgetClass, /* widget class */ subbox, /* parent widget*/ NULL, /* argument list*/ 0 /* arglist size */ ); for (i = 0; i < 10; i++) { sprintf(buf, "subpane%d", i); subpane[i] = XtCreateManagedWidget(buf, /* widget name */ commandWidgetClass, subbox, NULL, 0); XtAddCallback(subpane[i], XtNcallback, SubPaneChosen, i); } XtAddCallback(quit, XtNcallback, Quit, 0); XtAppAddActions(app_context, trial_actions, XtNumber(trial_actions)); XtAddCallback(pshell, XtNpopupCallback, PlaceMenu, 0); XtRealizeWidget(topLevel); XtAppMainLoop(app_context); }