2
* @OPENGROUP_COPYRIGHT@
4
* Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc.
5
* Copyright (c) 1996, 1997, 1998, 1999, 2000 The Open Group
6
* ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for
7
* the full copyright text.
9
* This software is subject to an open license. It may only be
10
* used on, with or for operating systems which are themselves open
11
* source systems. You must contact The Open Group for a license
12
* allowing distribution and sublicensing of this software on, with,
13
* or for operating systems which are not Open Source programs.
15
* See http://www.opengroup.org/openmotif/license for full
16
* details of the license agreement. Any use, reproduction, or
17
* distribution of the program constitutes recipient's acceptance of
20
* EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
21
* PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
22
* KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
23
* WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
24
* OR FITNESS FOR A PARTICULAR PURPOSE
26
* EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
27
* NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT,
28
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29
* DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED
30
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32
* ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
33
* EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
34
* POSSIBILITY OF SUCH DAMAGES.
41
static char rcsid[] = "$XConsortium: Simple.c /main/11 1995/09/19 23:08:54 cde-sun $"
45
* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
53
#include <X11/StringDefs.h>
54
#include <Xm/RowColumnP.h>
55
#include <Xm/PushBG.h>
56
#include <Xm/ToggleBG.h>
57
#include <Xm/CascadeBG.h>
58
#include <Xm/LabelG.h>
59
#include <Xm/SeparatoG.h>
62
/******** Static Function Declarations ********/
64
static void EvaluateConvenienceStructure(
68
/******** End Static Function Declarations ********/
70
static XtResource SimpleMenuResources[] =
72
{ XmNbuttonCount, XmCButtonCount, XmRInt, sizeof(int),
73
XtOffsetOf( struct _XmSimpleMenuRec, count),
74
XmRImmediate, (XtPointer) 0
76
{ XmNpostFromButton, XmCPostFromButton, XmRInt, sizeof(int),
77
XtOffsetOf( struct _XmSimpleMenuRec, post_from_button),
78
XmRImmediate, (XtPointer) -1
80
{ XmNsimpleCallback, XmCCallback, XmRCallbackProc,
81
sizeof(XtCallbackProc), XtOffsetOf( struct _XmSimpleMenuRec, callback),
82
XmRImmediate, (XtPointer) NULL
84
{ XmNbuttons, XmCButtons, XmRXmStringTable,
85
sizeof(XmStringTable), XtOffsetOf( struct _XmSimpleMenuRec, label_string),
86
XmRImmediate, (XtPointer) NULL
88
{ XmNbuttonAccelerators, XmCButtonAccelerators, XmRStringTable,
89
sizeof(String *), XtOffsetOf( struct _XmSimpleMenuRec, accelerator),
90
XmRImmediate, (XtPointer) NULL
92
{ XmNbuttonAcceleratorText, XmCButtonAcceleratorText,
93
XmRXmStringTable, sizeof(XmStringTable),
94
XtOffsetOf( struct _XmSimpleMenuRec, accelerator_text),
95
XmRImmediate, (XtPointer) NULL
97
{ XmNbuttonMnemonics, XmCButtonMnemonics, XmRKeySymTable,
98
sizeof(XmKeySymTable), XtOffsetOf( struct _XmSimpleMenuRec, mnemonic),
99
XmRImmediate, (XtPointer) NULL
101
{ XmNbuttonMnemonicCharSets, XmCButtonMnemonicCharSets,
102
XmRCharSetTable, sizeof(XmStringCharSetTable),
103
XtOffsetOf( struct _XmSimpleMenuRec, mnemonic_charset),
104
XmRImmediate, (XtPointer) NULL
106
{ XmNbuttonType, XmCButtonType, XmRButtonType,
107
sizeof(XmButtonTypeTable), XtOffsetOf( struct _XmSimpleMenuRec, button_type),
108
XmRImmediate, (XtPointer) NULL
110
{ XmNbuttonSet, XmCButtonSet, XmRInt,
111
sizeof(int), XtOffsetOf( struct _XmSimpleMenuRec, button_set),
112
XmRImmediate, (XtPointer) -1
114
{ XmNoptionLabel, XmCOptionLabel, XmRXmString,
115
sizeof(XmString), XtOffsetOf( struct _XmSimpleMenuRec, option_label),
116
XmRImmediate, (XtPointer) NULL
118
{ XmNoptionMnemonic, XmCOptionMnemonic, XmRKeySym,
119
sizeof (KeySym), XtOffsetOf( struct _XmSimpleMenuRec, option_mnemonic),
120
XmRImmediate, (XtPointer) NULL
125
EvaluateConvenienceStructure(
129
XmRowColumnWidget rc = (XmRowColumnWidget) wid ;
132
int button_count = 0;
133
int separator_count = 0;
139
for (i = 0; i < sm->count; i++)
142
if (sm->label_string && sm->label_string[i])
144
XtSetArg(args[n], XmNlabelString, sm->label_string[i]);
147
if (sm->accelerator && sm->accelerator[i])
149
XtSetArg(args[n], XmNaccelerator, sm->accelerator[i]);
152
if (sm->accelerator_text && sm->accelerator_text[i])
154
XtSetArg(args[n], XmNacceleratorText,
155
sm->accelerator_text[i]);
158
if (sm->mnemonic && sm->mnemonic[i])
160
XtSetArg(args[n], XmNmnemonic, sm->mnemonic[i]);
163
if (sm->mnemonic_charset && sm->mnemonic_charset[i])
165
XtSetArg(args[n], XmNmnemonicCharSet,
166
sm->mnemonic_charset[i]);
170
/* Dynamic Defaulting of button type */
172
if (sm->button_type && sm->button_type[i])
173
btype = sm->button_type[i];
179
if (rc->row_column.type == XmMENU_BAR)
180
btype = XmCASCADEBUTTON;
182
btype = XmPUSHBUTTON;
188
sprintf(name_buf,"label_%d", label_count++);
189
child = XtCreateManagedWidget( name_buf,
190
xmLabelGadgetClass, (Widget) rc, args, n);
192
case XmDOUBLE_SEPARATOR:
193
XtSetArg(args[n], XmNseparatorType, XmDOUBLE_LINE); n++;
195
sprintf(name_buf,"separator_%d", separator_count++);
196
child = XtCreateManagedWidget(name_buf,
197
xmSeparatorGadgetClass, (Widget) rc, args, n);
200
sprintf(name_buf,"button_%d", button_count++);
201
child = XtCreateManagedWidget(name_buf,
202
xmPushButtonGadgetClass,
203
(Widget) rc, args, n);
206
XmNactivateCallback, sm->callback,
207
(XtPointer)(unsigned long)(button_count - 1));
210
XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); n++;
212
sprintf(name_buf,"button_%d", button_count++);
213
XtSetArg(args[n], XmNindicatorOn, TRUE); n++;
214
child = XtCreateManagedWidget(name_buf,
215
xmToggleButtonGadgetClass,
216
(Widget) rc, args, n);
219
XmNvalueChangedCallback, sm->callback,
220
(XtPointer)(unsigned long)(button_count - 1));
222
case XmCASCADEBUTTON:
223
sprintf(name_buf,"button_%d", button_count++);
224
child = XtCreateManagedWidget(name_buf,
225
xmCascadeButtonGadgetClass,
226
(Widget) rc, args, n);
229
XmNactivateCallback, sm->callback,
230
(XtPointer)(unsigned long)(button_count - 1));
233
/* this is an error condition */
241
XmCreateSimpleMenuBar(
249
_XmWidgetToAppContext(parent);
253
XtGetSubresources(parent, &mr, name, XmCSimpleMenuBar,
254
SimpleMenuResources, XtNumber(SimpleMenuResources),
257
rc = XmCreateMenuBar(parent, name, args, arg_count);
259
EvaluateConvenienceStructure( rc, &mr);
266
XmCreateSimplePopupMenu(
274
_XmWidgetToAppContext(parent);
278
XtGetSubresources(parent, &mr, name, XmCSimplePopupMenu,
279
SimpleMenuResources, XtNumber(SimpleMenuResources),
282
rc = XmCreatePopupMenu(parent, name, args, arg_count);
284
EvaluateConvenienceStructure( rc, &mr);
291
XmCreateSimplePulldownMenu(
302
Cardinal num_buttons;
304
_XmWidgetToAppContext(parent);
307
XtGetSubresources(parent, &mr, name, XmCSimplePulldownMenu,
308
SimpleMenuResources, XtNumber(SimpleMenuResources),
311
rc = XmCreatePulldownMenu(parent, name, args, arg_count);
313
EvaluateConvenienceStructure(rc, &mr);
315
if (mr.post_from_button >= 0)
318
XtSetArg(local_args[n], XtNchildren, &buttons); n++;
319
XtSetArg(local_args[n], XtNnumChildren, &num_buttons); n++;
320
XtGetValues(parent, local_args, n);
324
/* error condition */
330
for (i = 0; i < num_buttons; i++)
332
if (((XmIsCascadeButtonGadget(buttons[i])) ||
333
(XmIsCascadeButton(buttons[i])))
335
(i == mr.post_from_button))
339
if ( i < num_buttons)
342
XtSetArg(local_args[n], XmNsubMenuId, rc); n++;
343
XtSetValues(buttons[i], local_args, n);
352
XmCreateSimpleOptionMenu(
360
int n, i, button_count;
363
Cardinal num_buttons;
364
_XmWidgetToAppContext(parent);
368
XtGetSubresources(parent, &mr, name, XmCSimpleOptionMenu,
369
SimpleMenuResources, XtNumber(SimpleMenuResources),
372
rc = XmCreateOptionMenu(parent, name, args, arg_count);
374
sub_rc = XmCreatePulldownMenu(parent, name, args, arg_count);
376
EvaluateConvenienceStructure(sub_rc, &mr);
381
XtSetArg(local_args[n], XmNlabelString, mr.option_label); n++;
383
if (mr.option_mnemonic)
385
XtSetArg(local_args[n], XmNmnemonic, mr.option_mnemonic); n++;
388
XtSetArg(local_args[n], XmNsubMenuId, sub_rc); n++;
389
XtSetValues(rc, local_args, n);
391
if (mr.button_set >= 0)
394
XtSetArg(local_args[n], XtNchildren, &buttons); n++;
395
XtSetArg(local_args[n], XtNnumChildren, &num_buttons); n++;
396
XtGetValues(sub_rc, local_args, n);
400
/* error condition */
407
for (i = 0; i < num_buttons; i++)
408
{ /* count only PushB */
409
if ((XmIsPushButtonGadget(buttons[i])) ||
410
(XmIsPushButton(buttons[i])))
412
if (button_count == mr.button_set)
418
if ( i < num_buttons)
421
XtSetArg(local_args[n], XmNmenuHistory, buttons[i]); n++;
422
XtSetValues(rc, local_args, n);
432
XmCreateSimpleRadioBox(
444
rc = XmCreateRadioBox(parent, name, args, arg_count);
446
XtGetSubresources(parent, &mr, name, XmCSimpleRadioBox,
447
SimpleMenuResources, XtNumber(SimpleMenuResources),
450
for(i=0; i < mr.count; i++)
452
sprintf(name_buf,"button_%d", i);
455
if (mr.label_string && mr.label_string[i])
457
XtSetArg(local_args[n],
458
XmNlabelString, mr.label_string[i]); n++;
460
if (mr.button_set == i)
462
XtSetArg(local_args[n], XmNset, TRUE); n++;
464
child = XtCreateManagedWidget(name_buf,
465
xmToggleButtonGadgetClass, (Widget) rc, local_args, n);
467
XtAddCallback(child, XmNvalueChangedCallback,
468
mr.callback, (XtPointer)(unsigned long)i);
475
XmCreateSimpleCheckBox(
488
rc = XmCreateRadioBox(parent, name, args, arg_count);
491
XtSetArg(local_args[n], XmNradioBehavior, FALSE); n++;
493
XtSetValues(rc, local_args, n);
496
XtGetSubresources(parent, &mr, name, XmCSimpleCheckBox,
497
SimpleMenuResources, XtNumber(SimpleMenuResources),
500
for(i=0; i < mr.count; i++)
502
sprintf(name_buf,"button_%d", i);
505
if (mr.label_string && mr.label_string[i])
507
XtSetArg(local_args[n],
508
XmNlabelString, mr.label_string[i]); n++;
510
child = XtCreateManagedWidget(name_buf,
511
xmToggleButtonGadgetClass, (Widget) rc, local_args, n);
513
XtAddCallback(child, XmNvalueChangedCallback,
514
mr.callback, (XtPointer)(unsigned long)i);