|
|
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);
}