Path: utzoo!attcan!uunet!husc6!bloom-beacon!VLSI.JPL.NASA.GOV!donnelly%asd.span
From: donnelly%asd.span@VLSI.JPL.NASA.GOV
Newsgroups: comp.windows.x
Subject: Popup menus and X ... again
Message-ID: <880818061450.616@VLSI.JPL.NASA.GOV>
Date: 18 Aug 88 13:14:50 GMT
Sender: daemon@bloom-beacon.MIT.EDU
Organization: The Internet
Lines: 190
I have been investigating the use of popup menus
in X, and have a question about changing the resource list
for a single Command button in the application program which follows.
(The program is a slightly modified version of one posted to
the network earlier). I have been reading the documentation I have,
but don't yet understand its discussion of resource management well
enough. Here's the situation:
[1] I can change, say, the bckground of ALL Command buttons in
the following application to new_color by starting the application
(named progr) with the line
progr -xrm 'progr*Command.background:new_color'
[2] In a similar way, I can change the background of ALL Command
buttons to red, and the overall background to blue by entering the
following lines in .Xdefaults:
progr*Command.background:red
progr.*.background:blue
[3] HOW DO I CHANGE THE BACKGROUND COLOR (from the command line
or the .Xdefaults file) of the SINGLE button "yb" in the program
listed below? 'yb' is delimited by the
/* ************************************************ */
/* ************************************************ */
banners to make it easy to find.
[4] While we're at it, can you show me how to change the color of
this button with XSetArgs. When trying to follow the documentation
I am getting erroprs.
Sorry for the size of the letter, but I'm a monkey-see/monkey-do
learner, and felt you should have the entire facts laid at your
doorstep!!
R. Donnelly
NASA/Lockheed
P.S. Here's the procedure in question:
#include
#include
#include
#include
#include
#include
#include
#include
/* Command line options table. Only resources are entered here...there is a
pass over the remaining options after XtParseCommand is let loose. */
static XrmOptionDescRec options[] = {
{"-label", "*label", XrmoptionSepArg, NULL}
};
/* this is one callback routine, which prints
the name of the button which was pressed */
void my_callback(w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{
printf("%s \n", client_data);
fflush(stdout);
}
/* this is a second callback routine, which
causes the program to exit when the "quit" button is pressed */
void done(w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{
exit(0);
}
/* this is a routine to set the menu position,
relative to its parent widget */
void set_menu_position(shell_widget, enable_widget, dummy)
Widget enable_widget, shell_widget;
int dummy;
{
Position x, y;
Arg args[2];
XtTranslateCoords(enable_widget, (Position)5, (Position)5, &x, &y);
XtSetArg(args[0], XtNx, x);
XtSetArg(args[1], XtNy, y);
XtSetValues(shell_widget, args, TWO);
}
void main(argc, argv)
unsigned int argc;
char **argv;
{
/* Note the widget hierarchy for this program */
Widget toplevel,
menu_box, popupshell,
yb, nb, popupbutton, menu_box2,
c1, c2, c3, qu;
XtPopdownIDRec popdown_pair;
XtTranslations button_actions, popup_actions;
Arg arg;
/* initialize toolkit and establish the toplevel widget */
toplevel = XtInitialize( "popup_test", "POpupTest",
options, 0, &argc, argv );
/*XtNumber(options), &argc, argv );*/
/* create a box widget to hold the menu of buttons */
menu_box = XtCreateManagedWidget( "menu_box", boxWidgetClass, toplevel,
(Arg *)0, ZERO);
/* Here are the items in the menu box.
We have "yes" and "no" buttons, and a "Show Choices" button.
All widgets are commandWidgetClass, all are siblings, all have
the same parent, namely menu_box.
We register my_callback with each widget, so it can report
which button was pressed.
*/
/* ************************************************ */
/* ************************************************ */
yb = XtCreateManagedWidget("Yes", commandWidgetClass, menu_box,
(Arg *)0, ZERO );
/* ************************************************ */
/* ************************************************ */
XtAddCallback(yb, XtNcallback, my_callback, (caddr_t)"yes");
nb = XtCreateManagedWidget("No", commandWidgetClass, menu_box,
(Arg *)0, ZERO );
XtAddCallback(nb, XtNcallback, my_callback, (caddr_t)"no");
popupbutton =
XtCreateManagedWidget("Show Choices", commandWidgetClass, menu_box,
(Arg *)0, ZERO );
/* compile the new translation table */
popup_actions = XtParseTranslationTable(
": set() MenuPopup(menu)\n");
XtOverrideTranslations(popupbutton, popup_actions);
/* Create the popup menu */
popupshell = XtCreatePopupShell("menu", overrideShellWidgetClass, toplevel,
(Arg *)0, ZERO);
/* The menu items are contained in a second box widget
We have buttons for Choices 1,2,3 and a quit button which terminates
the main procedure
*/
menu_box2 = XtCreateManagedWidget( "PopupMenu", boxWidgetClass, popupshell,
(Arg *)0, ZERO);
XtAddCallback(popupshell,
XtNpopupCallback, set_menu_position, (caddr_t)popupbutton);
/* compute actions for later use in the
translation table for this menu
*/
button_actions = XtParseTranslationTable(
": highlight() set()\n");
/* these are needed by popup and popdown procs */
popdown_pair.enable_widget = popupbutton;
popdown_pair.shell_widget = popupshell;
/* menu items */
c1 = XtCreateManagedWidget( "choice1", commandWidgetClass, menu_box2,
(Arg *)0, ZERO );
XtAddCallback(c1, XtNcallback, my_callback, (caddr_t)"Made Choice 1");
XtAddCallback(c1, XtNcallback,
XtCallbackPopdown, (caddr_t)&popdown_pair);
XtOverrideTranslations(c1, button_actions);
c2 = XtCreateManagedWidget( "choice2", commandWidgetClass, menu_box2,
(Arg *)0, ZERO );
XtAddCallback(c2, XtNcallback, my_callback, (caddr_t)"Made Choice 2");
XtAddCallback(c2, XtNcallback,
XtCallbackPopdown, (caddr_t)&popdown_pair);
XtOverrideTranslations(c2, button_actions);
c3 = XtCreateManagedWidget( "choice3", commandWidgetClass, menu_box2,
(Arg *)0, ZERO );
XtAddCallback(c3, XtNcallback, my_callback, (caddr_t)"Made Choice 3");
XtAddCallback(c3, XtNcallback,
XtCallbackPopdown, (caddr_t)&popdown_pair);
XtOverrideTranslations(c3, button_actions);
qu = XtCreateManagedWidget("quit", commandWidgetClass, menu_box2,
(Arg *)0, ZERO );
XtAddCallback(qu, XtNcallback, done, (caddr_t)"done");
XtOverrideTranslations(qu, button_actions);
/* this starts the process by which the widget hierarchy is
traversed, creating and managing each window */
XtRealizeWidget(toplevel);
/* now we sit in a loop, waiting for, and processing events */
XtMainLoop();
}