00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <stdio.h>
00042
00043 #include <X11/IntrinsicP.h>
00044 #include <X11/StringDefs.h>
00045 #include <X11/Xaw3d/XawInit.h>
00046 #include <X11/Xmu/Converters.h>
00047 #include <X11/Xmu/Misc.h>
00048 #include <X11/Xaw3d/ToggleP.h>
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 static char defaultTranslations[] =
00064 "<EnterWindow>: highlight(Always) \n\
00065 <LeaveWindow>: unhighlight() \n\
00066 <Btn1Down>,<Btn1Up>: toggle() notify()";
00067
00068 #define offset(field) XtOffsetOf(ToggleRec, field)
00069
00070 static XtResource resources[] = {
00071 {XtNstate, XtCState, XtRBoolean, sizeof(Boolean),
00072 offset(command.set), XtRString, "off"},
00073 {XtNradioGroup, XtCWidget, XtRWidget, sizeof(Widget),
00074 offset(toggle.widget), XtRWidget, (XtPointer) NULL },
00075 {XtNradioData, XtCRadioData, XtRPointer, sizeof(XtPointer),
00076 offset(toggle.radio_data), XtRPointer, (XtPointer) NULL },
00077 };
00078
00079 #undef offset
00080
00081
00082 static void Toggle(), Initialize(), Notify(), ToggleSet();
00083 static void ToggleDestroy(), ClassInit();
00084 static Boolean SetValues();
00085
00086
00087
00088 static RadioGroup * GetRadioGroup();
00089 static void CreateRadioGroup(), AddToRadioGroup(), TurnOffRadioSiblings();
00090 static void RemoveFromRadioGroup();
00091
00092 static XtActionsRec actionsList[] =
00093 {
00094 {"toggle", Toggle},
00095 {"notify", Notify},
00096 {"set", ToggleSet},
00097 };
00098
00099 #define SuperClass ((CommandWidgetClass)&commandClassRec)
00100
00101 ToggleClassRec toggleClassRec = {
00102 {
00103 (WidgetClass) SuperClass,
00104 "Toggle",
00105 sizeof(ToggleRec),
00106 ClassInit,
00107 NULL,
00108 FALSE,
00109 Initialize,
00110 NULL,
00111 XtInheritRealize,
00112 actionsList,
00113 XtNumber(actionsList),
00114 resources,
00115 XtNumber(resources),
00116 NULLQUARK,
00117 FALSE,
00118 TRUE,
00119 TRUE,
00120 FALSE,
00121 NULL,
00122 XtInheritResize,
00123 XtInheritExpose,
00124 SetValues,
00125 NULL,
00126 XtInheritSetValuesAlmost,
00127 NULL,
00128 NULL,
00129 XtVersion,
00130 NULL,
00131 defaultTranslations,
00132 XtInheritQueryGeometry,
00133 XtInheritDisplayAccelerator,
00134 NULL
00135 },
00136 {
00137 XtInheritChangeSensitive
00138 },
00139 {
00140 XtInheritXaw3dShadowDraw
00141 },
00142 {
00143 0
00144 },
00145 {
00146 0
00147 },
00148 {
00149 NULL,
00150 NULL,
00151 NULL
00152 }
00153 };
00154
00155
00156 WidgetClass toggleWidgetClass = (WidgetClass) &toggleClassRec;
00157
00158
00159
00160
00161
00162
00163
00164 static void
00165 ClassInit()
00166 {
00167 XtActionList actions;
00168 Cardinal num_actions;
00169 Cardinal i;
00170 ToggleWidgetClass class = (ToggleWidgetClass) toggleWidgetClass;
00171 static XtConvertArgRec parentCvtArgs[] = {
00172 {XtBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.parent),
00173 sizeof(Widget)}
00174 };
00175
00176 XawInitializeWidgetSet();
00177 XtSetTypeConverter(XtRString, XtRWidget, XmuNewCvtStringToWidget,
00178 parentCvtArgs, XtNumber(parentCvtArgs), XtCacheNone,
00179 (XtDestructor)NULL);
00180
00181
00182
00183
00184 XtGetActionList(commandWidgetClass, &actions, &num_actions);
00185
00186 for (i = 0 ; i < num_actions ; i++) {
00187 if (streq(actions[i].string, "set"))
00188 class->toggle_class.Set = actions[i].proc;
00189 if (streq(actions[i].string, "unset"))
00190 class->toggle_class.Unset = actions[i].proc;
00191
00192 if ( (class->toggle_class.Set != NULL) &&
00193 (class->toggle_class.Unset != NULL) ) {
00194 XtFree((char *) actions);
00195 return;
00196 }
00197 }
00198
00199
00200 XtError("Aborting, due to errors resolving bindings in the Toggle widget.");
00201 }
00202
00203
00204 static void Initialize(request, new, args, num_args)
00205 Widget request, new;
00206 ArgList args;
00207 Cardinal *num_args;
00208 {
00209 ToggleWidget tw = (ToggleWidget) new;
00210 ToggleWidget tw_req = (ToggleWidget) request;
00211
00212 tw->toggle.radio_group = NULL;
00213
00214 if (tw->toggle.radio_data == NULL)
00215 tw->toggle.radio_data = (XtPointer) new->core.name;
00216
00217 if (tw->toggle.widget != NULL) {
00218 if ( GetRadioGroup(tw->toggle.widget) == NULL)
00219 CreateRadioGroup(new, tw->toggle.widget);
00220 else
00221 AddToRadioGroup( GetRadioGroup(tw->toggle.widget), new);
00222 }
00223 XtAddCallback(new, XtNdestroyCallback, ToggleDestroy, (XtPointer)NULL);
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236 if (tw_req->command.set)
00237 ToggleSet(new, (XEvent *)NULL, (String *)NULL, (Cardinal *)0);
00238 }
00239
00240
00241
00242
00243
00244
00245
00246
00247 static void
00248 ToggleSet(w,event,params,num_params)
00249 Widget w;
00250 XEvent *event;
00251 String *params;
00252 Cardinal *num_params;
00253 {
00254 ToggleWidgetClass class = (ToggleWidgetClass) w->core.widget_class;
00255
00256 TurnOffRadioSiblings(w);
00257 class->toggle_class.Set(w, event, NULL, 0);
00258 }
00259
00260
00261 static void
00262 Toggle(w,event,params,num_params)
00263 Widget w;
00264 XEvent *event;
00265 String *params;
00266 Cardinal *num_params;
00267 {
00268 ToggleWidget tw = (ToggleWidget)w;
00269 ToggleWidgetClass class = (ToggleWidgetClass) w->core.widget_class;
00270
00271 if (tw->command.set)
00272 class->toggle_class.Unset(w, event, NULL, 0);
00273 else
00274 ToggleSet(w, event, params, num_params);
00275 }
00276
00277
00278 static void Notify(w,event,params,num_params)
00279 Widget w;
00280 XEvent *event;
00281 String *params;
00282 Cardinal *num_params;
00283 {
00284 ToggleWidget tw = (ToggleWidget) w;
00285 long antilint = tw->command.set;
00286
00287 XtCallCallbacks( w, XtNcallback, (XtPointer) antilint );
00288 }
00289
00290
00291
00292
00293
00294
00295
00296
00297 static Boolean
00298 SetValues (current, request, new, args, num_args)
00299 Widget current, request, new;
00300 ArgList args;
00301 Cardinal *num_args;
00302 {
00303 ToggleWidget oldtw = (ToggleWidget) current;
00304 ToggleWidget tw = (ToggleWidget) new;
00305 ToggleWidget rtw = (ToggleWidget) request;
00306
00307 if (oldtw->toggle.widget != tw->toggle.widget)
00308 XawToggleChangeRadioGroup(new, tw->toggle.widget);
00309
00310 if (!tw->core.sensitive && oldtw->core.sensitive && rtw->command.set)
00311 tw->command.set = True;
00312
00313 if (oldtw->command.set != tw->command.set) {
00314 tw->command.set = oldtw->command.set;
00315 Toggle(new, (XEvent *)NULL, (String *)NULL, (Cardinal *)0);
00316 }
00317 return(FALSE);
00318 }
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328 static void
00329 ToggleDestroy(w, junk, garbage)
00330 Widget w;
00331 XtPointer junk, garbage;
00332 {
00333 RemoveFromRadioGroup(w);
00334 }
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350 static RadioGroup *
00351 GetRadioGroup(w)
00352 Widget w;
00353 {
00354 ToggleWidget tw = (ToggleWidget) w;
00355
00356 if (tw == NULL) return(NULL);
00357 return( tw->toggle.radio_group );
00358 }
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369 static void
00370 CreateRadioGroup(w1, w2)
00371 Widget w1, w2;
00372 {
00373 char error_buf[BUFSIZ];
00374 ToggleWidget tw1 = (ToggleWidget) w1;
00375 ToggleWidget tw2 = (ToggleWidget) w2;
00376
00377 if ( (tw1->toggle.radio_group != NULL) || (tw2->toggle.radio_group != NULL) ) {
00378 (void) sprintf(error_buf, "%s %s", "Toggle Widget Error - Attempting",
00379 "to create a new toggle group, when one already exists.");
00380 XtWarning(error_buf);
00381 }
00382
00383 AddToRadioGroup( (RadioGroup *)NULL, w1 );
00384 AddToRadioGroup( GetRadioGroup(w1), w2 );
00385 }
00386
00387
00388
00389
00390
00391
00392
00393
00394 static void
00395 AddToRadioGroup(group, w)
00396 RadioGroup * group;
00397 Widget w;
00398 {
00399 ToggleWidget tw = (ToggleWidget) w;
00400 RadioGroup * local;
00401
00402 local = (RadioGroup *) XtMalloc( sizeof(RadioGroup) );
00403 local->widget = w;
00404 tw->toggle.radio_group = local;
00405
00406 if (group == NULL) {
00407 group = local;
00408 group->next = NULL;
00409 group->prev = NULL;
00410 return;
00411 }
00412 local->prev = group;
00413 if ((local->next = group->next) != NULL)
00414 local->next->prev = local;
00415 group->next = local;
00416 }
00417
00418
00419
00420
00421
00422
00423
00424 static void
00425 TurnOffRadioSiblings(w)
00426 Widget w;
00427 {
00428 RadioGroup * group;
00429 ToggleWidgetClass class = (ToggleWidgetClass) w->core.widget_class;
00430
00431 if ( (group = GetRadioGroup(w)) == NULL)
00432 return;
00433
00434
00435
00436 for ( ; group->prev != NULL ; group = group->prev );
00437
00438 while ( group != NULL ) {
00439 ToggleWidget local_tog = (ToggleWidget) group->widget;
00440 if ( local_tog->command.set ) {
00441 class->toggle_class.Unset(group->widget, NULL, NULL, 0);
00442 Notify( group->widget, (XEvent *)NULL, (String *)NULL, (Cardinal *)0);
00443 }
00444 group = group->next;
00445 }
00446 }
00447
00448
00449
00450
00451
00452
00453
00454 static void
00455 RemoveFromRadioGroup(w)
00456 Widget w;
00457 {
00458 RadioGroup * group = GetRadioGroup(w);
00459 if (group != NULL) {
00460 if (group->prev != NULL)
00461 (group->prev)->next = group->next;
00462 if (group->next != NULL)
00463 (group->next)->prev = group->prev;
00464 XtFree((char *) group);
00465 }
00466 }
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481 void
00482 #if NeedFunctionPrototypes
00483 XawToggleChangeRadioGroup(Widget w, Widget radio_group)
00484 #else
00485 XawToggleChangeRadioGroup(w, radio_group)
00486 Widget w, radio_group;
00487 #endif
00488 {
00489 ToggleWidget tw = (ToggleWidget) w;
00490 RadioGroup * group;
00491
00492 RemoveFromRadioGroup(w);
00493
00494
00495
00496
00497
00498
00499 if ( tw->command.set && radio_group != NULL )
00500 XawToggleUnsetCurrent(radio_group);
00501
00502 if (radio_group != NULL)
00503 if ((group = GetRadioGroup(radio_group)) == NULL)
00504 CreateRadioGroup(w, radio_group);
00505 else AddToRadioGroup(group, w);
00506 }
00507
00508
00509
00510
00511
00512
00513
00514
00515 XtPointer
00516 #if NeedFunctionPrototypes
00517 XawToggleGetCurrent(Widget w)
00518 #else
00519 XawToggleGetCurrent(w)
00520 Widget w;
00521 #endif
00522 {
00523 RadioGroup * group;
00524
00525 if ( (group = GetRadioGroup(w)) == NULL) return(NULL);
00526 for ( ; group->prev != NULL ; group = group->prev);
00527
00528 while ( group != NULL ) {
00529 ToggleWidget local_tog = (ToggleWidget) group->widget;
00530 if ( local_tog->command.set )
00531 return( local_tog->toggle.radio_data );
00532 group = group->next;
00533 }
00534 return(NULL);
00535 }
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545 void
00546 #if NeedFunctionPrototypes
00547 XawToggleSetCurrent(Widget radio_group, XtPointer radio_data)
00548 #else
00549 XawToggleSetCurrent(radio_group, radio_data)
00550 Widget radio_group;
00551 XtPointer radio_data;
00552 #endif
00553 {
00554 RadioGroup * group;
00555 ToggleWidget local_tog;
00556
00557
00558
00559 if ( (group = GetRadioGroup(radio_group)) == NULL) {
00560 local_tog = (ToggleWidget) radio_group;
00561 if ( (local_tog->toggle.radio_data == radio_data) )
00562 if (!local_tog->command.set) {
00563 ToggleSet((Widget) local_tog, (XEvent *)NULL, (String *)NULL, (Cardinal *)0);
00564 Notify((Widget) local_tog, (XEvent *)NULL, (String *)NULL, (Cardinal *)0);
00565 }
00566 return;
00567 }
00568
00569
00570
00571
00572
00573 for ( ; group->prev != NULL ; group = group->prev);
00574
00575
00576
00577
00578
00579 while ( group != NULL ) {
00580 local_tog = (ToggleWidget) group->widget;
00581 if ( (local_tog->toggle.radio_data == radio_data) ) {
00582 if (!local_tog->command.set) {
00583 ToggleSet((Widget) local_tog, (XEvent *)NULL, (String *)NULL, (Cardinal *)0);
00584 Notify((Widget) local_tog, (XEvent *)NULL, (String *)NULL, (Cardinal *)0);
00585 }
00586 return;
00587 }
00588 group = group->next;
00589 }
00590 }
00591
00592
00593
00594
00595
00596
00597
00598 void
00599 #if NeedFunctionPrototypes
00600 XawToggleUnsetCurrent(Widget radio_group)
00601 #else
00602 XawToggleUnsetCurrent(radio_group)
00603 Widget radio_group;
00604 #endif
00605 {
00606 ToggleWidgetClass class;
00607 ToggleWidget local_tog = (ToggleWidget) radio_group;
00608
00609
00610
00611 if (local_tog->command.set) {
00612 class = (ToggleWidgetClass) local_tog->core.widget_class;
00613 class->toggle_class.Unset(radio_group, NULL, NULL, 0);
00614 Notify(radio_group, (XEvent *)NULL, (String *)NULL, (Cardinal *)0);
00615 }
00616 if ( GetRadioGroup(radio_group) == NULL) return;
00617 TurnOffRadioSiblings(radio_group);
00618 }
00619