Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / programs / dtstyle / Startup.c
1 /************************************<+>*************************************
2  ****************************************************************************
3  **
4  **   File:        Startup.c
5  **
6  **   Project:     DT 3.0
7  **
8  **   Description: Controls the Dtstyle Startup dialog
9  **
10  **
11  **  (c) Copyright Hewlett-Packard Company, 1990.  
12  **
13  **
14  **
15  ****************************************************************************
16  ************************************<+>*************************************/
17 /*$XConsortium: Startup.c /main/6 1995/12/22 15:23:38 barstow $*/
18 /* +++++++++++++++++++++++++++++++++++++++*/
19 /*  include files                         */
20 /* +++++++++++++++++++++++++++++++++++++++*/
21
22 #include <X11/Xlib.h>
23 #include <Xm/MwmUtil.h>
24
25 #include <Xm/Xm.h>
26 #include <Xm/XmP.h>
27 #include <Xm/DialogS.h>
28 #include <Xm/Form.h>
29 #include <Xm/MessageB.h>
30 #include <Xm/PushBG.h>
31 #include <Xm/RowColumn.h>
32 #include <Xm/Scale.h>
33 #include <Xm/LabelG.h>
34 #include <Xm/ToggleBG.h>
35 #include <Xm/VendorSEP.h>
36
37 #include <Dt/DialogBox.h>
38 #include <Dt/Icon.h>
39 #include <Dt/TitleBox.h>
40
41 #include <Dt/Message.h>
42 #include <Dt/HourGlass.h>
43
44 #include "Help.h"
45 #include "Main.h"
46 #include "SaveRestore.h"
47 #include "Protocol.h"
48
49 /*+++++++++++++++++++++++++++++++++++++++*/
50 /* Internal Functions                    */
51 /*+++++++++++++++++++++++++++++++++++++++*/
52
53
54 static void GetStartupValues( void ) ;
55 static Widget BuildStartup( Widget shell) ;
56 static void MapStartup( 
57                         Widget w,
58                         XtPointer client_data,
59                         XtPointer call_data) ;
60 static void LayoutCB( 
61                         Widget w,
62                         XtPointer client_data,
63                         XtPointer call_data) ;
64 static void SetCurrentCB( 
65                         Widget w,
66                         XtPointer client_data,
67                         XmToggleButtonCallbackStruct *call_data) ;
68 static void SetHomeCB( 
69                         Widget w,
70                         XtPointer client_data,
71                         XmToggleButtonCallbackStruct *call_data) ;
72 static void SetConfirmCB( 
73                         Widget w,
74                         XtPointer client_data,
75                         XmToggleButtonCallbackStruct *call_data) ;
76 static void SetHomeSession( 
77                         Widget w,
78                         XtPointer client_data,
79                         XtPointer call_data) ;
80 static void SaveHomeOk( 
81                         Widget w,
82                         XtPointer client_data,
83                         XtPointer call_data) ;
84 static void ButtonCB( 
85                         Widget w,
86                         XtPointer client_data,
87                         XtPointer call_data) ;
88
89
90 /*+++++++++++++++++++++++++++++++++++++++*/
91 /* Internal Variables                    */
92 /*+++++++++++++++++++++++++++++++++++++++*/
93 typedef struct {
94   Widget      startupForm;
95   Widget      resumeTgl;
96   Widget      homeTgl;
97   Widget      modeYesTgl;
98   Widget      modeNoTgl;
99   Widget      setHome;
100   Widget      dlg;
101   int         origStartState;
102   int         origConfirmMode;
103 } Startup;
104 static Startup startup;
105
106
107 static saveRestore save = {FALSE, 0, };
108
109
110 /*+++++++++++++++++++++++++++++++++++++++*/
111 /* popup_startupBB                       */
112 /*+++++++++++++++++++++++++++++++++++++++*/
113 void 
114 popup_startupBB(
115         Widget shell )
116 {
117
118     if (style.startupDialog == NULL) 
119     {
120       if (smWindow != NULL)
121       {
122           if (style.smState.smCompatMode) 
123           {
124                InfoDialog(((char *)GETMESSAGE(7, 13, 
125                "This session was started from an X Window System\n\
126 startup script.  Startup settings are not valid,\n\
127 since the session cannot be restored.")), 
128                 style.startupDialog ? style.startupDialog : style.shell, False);
129
130                return;
131           }
132
133           _DtTurnOnHourGlass(shell);  
134           GetStartupValues();
135           BuildStartup(shell);
136           XtManageChild(style.startupDialog);
137           _DtTurnOffHourGlass(shell);  
138       }
139
140       else /* SM not running - post error dialog */
141       {
142        InfoDialog(((char *)GETMESSAGE(7, 15, 
143        "The Session Manager is not running.\n\
144 Startup settings are not valid.")),
145         style.startupDialog ? style.startupDialog : style.shell, False);
146
147        return;
148       }
149     }
150     else 
151     {
152       XtManageChild(style.startupDialog);
153       raiseWindow(XtWindow(XtParent(style.startupDialog)));
154     }
155 }
156
157 /*++++++++++++++++++++++++++++++++++++++++*/
158 /* Get startup values ... used for cancel */
159 /*++++++++++++++++++++++++++++++++++++++++*/
160 static void
161 GetStartupValues( void )
162 {
163     startup.origStartState = style.smState.smStartState;
164     startup.origConfirmMode = style.smState.smConfirmMode;
165 }
166
167
168 /*++++++++++++++++++++++++++++++++++++++++*/
169 /* build__startupBB                       */
170 /*++++++++++++++++++++++++++++++++++++++++*/
171 static Widget 
172 BuildStartup(
173         Widget shell )
174 {
175   register int     n;
176   Arg              args[MAX_ARGS];
177   XmString         button_string[NUM_LABELS]; 
178   XmString         string;
179   int              count = 0;
180   int              count2 = 0;
181   Widget           widget_list[5], 
182                    widget_list2[3], 
183                    modeForm,
184                    shutdownRC;
185
186   startup.dlg = NULL;
187
188   /* Set up DialogBoxDialog button labels */
189   button_string[0] = CMPSTR(_DtOkString);
190   button_string[1] = CMPSTR(_DtCancelString);
191   button_string[2] = CMPSTR(_DtHelpString);
192   
193   /* Create toplevel DialogBox */
194   /* saveRestore
195    * Note that save.poscnt has been initialized elsewhere.  
196    * save.posArgs may contain information from restoreStartup().*/
197   
198   XtSetArg(save.posArgs[save.poscnt], XmNbuttonCount, NUM_LABELS);  
199   save.poscnt++;
200   XtSetArg(save.posArgs[save.poscnt], XmNbuttonLabelStrings, button_string); 
201   save.poscnt++;
202   XtSetArg(save.posArgs[save.poscnt], XmNdefaultPosition, False); 
203   save.poscnt++;
204   style.startupDialog = 
205     __DtCreateDialogBoxDialog(shell, "startupDlg", save.posArgs, save.poscnt);
206   XtAddCallback(style.startupDialog, XmNcallback, ButtonCB, NULL);
207   XtAddCallback(style.startupDialog, XmNhelpCallback,
208                 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_STARTUP_DIALOG);
209   
210   XmStringFree(button_string[0]);
211   XmStringFree(button_string[1]);
212   XmStringFree(button_string[2]);
213   
214   widget_list[0] = _DtDialogBoxGetButton(style.startupDialog,2);
215   n=0;
216   XtSetArg(args[n], XmNautoUnmanage, False); n++;
217   XtSetArg(args[n], XmNcancelButton, widget_list[0]); n++;
218   XtSetValues (style.startupDialog, args, n);
219   
220   n=0;
221   XtSetArg(args[n], XmNtitle, ((char *)GETMESSAGE(7, 14, "Style Manager - Startup"))); n++;
222   XtSetArg(args[n], XmNuseAsyncGeometry, True); n++;
223   XtSetArg(args[n], XmNmwmFunctions, DIALOG_MWM_FUNC  ); n++;
224   XtSetValues (XtParent(style.startupDialog), args, n);
225   
226   n = 0;
227   XtSetArg(args[n], XmNhorizontalSpacing, style.horizontalSpacing); n++;
228   XtSetArg(args[n], XmNverticalSpacing, style.verticalSpacing); n++;
229   XtSetArg(args[n], XmNallowOverlap, False); n++;
230   XtSetArg(args[n], XmNchildType, XmWORK_AREA);  n++;
231   startup.startupForm = XmCreateForm(style.startupDialog, "startupForm", args, n);
232   
233   n = 0;
234   XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);  n++;
235   XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);  n++;
236   XtSetArg(args[n], XmNfillMode, XmFILL_SELF); n++;
237   XtSetArg(args[n], XmNbehavior, XmICON_LABEL); n++;
238   XtSetArg(args[n], XmNpixmapForeground, style.secBSCol); n++;
239   XtSetArg(args[n], XmNpixmapBackground, style.secTSCol); n++;
240   XtSetArg(args[n], XmNstring, NULL); n++;  
241   XtSetArg(args[n], XmNshadowThickness, 0); n++;  
242   XtSetArg(args[n], XmNimageName, STARTUP_ICON); n++;  
243   XtSetArg(args[n], XmNtraversalOn, False); n++;  
244   widget_list[count++] = 
245     _DtCreateIcon(startup.startupForm, "startupPict", args, n);
246
247   if (style.smState.smDisplaySpecific)
248     {
249       char      *pch1;
250       char      *pch2;
251
252       pch1 = (char *)GETMESSAGE(7, 16, "Display-specific session:");
253       pch2 = XtMalloc(strlen (pch1) + 
254                       strlen (XDisplayName (getenv("DISPLAY"))) + 3);
255
256       (void) sprintf(pch2, "%s\n%s", pch1, XDisplayName (getenv("DISPLAY")));
257
258       n = 0;
259       string = CMPSTR(pch2);
260       XtSetArg(args[n], XmNleftWidget, widget_list[count-1]);  n++;
261       XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);  n++;
262       XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);  n++;
263       XtSetArg(args[n], XmNmarginLeft, 80);  n++; 
264       XtSetArg(args[n], XmNlabelString, string);  n++;
265       widget_list[count++] = 
266         XmCreateLabelGadget(startup.startupForm, "sessionLabel", args, n);
267       XmStringFree(string);
268       XtFree(pch2);
269     }
270   
271   n = 0;
272   XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);  n++;
273   XtSetArg(args[n], XmNtopWidget, widget_list[count-1]);  n++;
274   XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);  n++;
275   XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);  n++;
276   XtSetArg(args[n], XmNmarginHeight, style.verticalSpacing);  n++; 
277   XtSetArg(args[n], XmNmarginWidth, style.horizontalSpacing);  n++; 
278   string = CMPSTR(((char *)GETMESSAGE(7, 3, "At Login:")));
279   XtSetArg(args[n], XmNtitleString, string);  n++;
280   widget_list[count++] = 
281     _DtCreateTitleBox(startup.startupForm,"shutdownBox", args, n);
282   XmStringFree(string);
283   
284   n = 0;
285   XtSetArg(args[n], XmNmarginHeight, 0);  n++; 
286   XtSetArg(args[n], XmNmarginWidth, 0);  n++; 
287   shutdownRC= XmCreateRadioBox(widget_list[count-1],"shutdownRC", args, n);
288   
289   /*
290    * For early versions of dtstyle, style.smState.smStartState could
291    * be set to a value that is no longer supported.  If this occurs,
292    * no button will be selected, so initialize style.smState.smStartState
293    * to a state that is supported.
294    */
295   if (style.smState.smStartState != DtSM_CURRENT_STATE &&
296       style.smState.smStartState != DtSM_HOME_STATE)
297     style.smState.smStartState = DtSM_CURRENT_STATE;
298
299   n = 0;
300   XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
301   string = CMPSTR(((char *)GETMESSAGE(7, 4, "Resume current session")));
302   XtSetArg(args[n], XmNlabelString, string); n++;
303   if (style.smState.smStartState == DtSM_CURRENT_STATE)
304     {
305       XtSetArg(args[n], XmNset, True); n++;
306     }
307   widget_list2[count2++] = startup.resumeTgl
308     = XmCreateToggleButtonGadget(shutdownRC,"resumeTgl", args, n);
309   XmStringFree(string);
310   
311   n = 0;
312   XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
313   string = CMPSTR(((char *)GETMESSAGE(7, 5, "Return to Home session")));
314   XtSetArg(args[n], XmNlabelString, string); n++;
315   if (style.smState.smStartState == DtSM_HOME_STATE)
316     {
317       XtSetArg(args[n], XmNset, True); n++;
318     }
319   widget_list2[count2++] = startup.homeTgl
320     = XmCreateToggleButtonGadget(shutdownRC,"homeTgl", args, n);
321   XmStringFree(string);
322
323   n = 0;
324   XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);  n++;
325   XtSetArg(args[n], XmNtopWidget,  widget_list[count-1]);  n++;
326   XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);  n++;
327   XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);  n++;
328   XtSetArg(args[n], XmNmarginHeight, style.verticalSpacing);  n++; 
329   XtSetArg(args[n], XmNmarginWidth, style.horizontalSpacing);  n++; 
330   string = CMPSTR(((char *)GETMESSAGE(7, 7, "Logout Confirmation Dialog:")));
331   XtSetArg(args[n], XmNtitleString, string);  n++;
332   widget_list[count++] = _DtCreateTitleBox(startup.startupForm,"modeBox", args, n);
333     XmStringFree(string);
334   
335   n = 0;
336   XtSetArg(args[n], XmNmarginHeight, 0);  n++; 
337   XtSetArg(args[n], XmNmarginWidth, 0);  n++; 
338   XtSetArg(args[n], XmNorientation, XmHORIZONTAL);  n++; 
339   modeForm = XmCreateRadioBox(widget_list[count-1], "modeForm", args, n);
340   
341   n = 0;
342   XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
343   string = CMPSTR(((char *)GETMESSAGE(7, 8, "On"))); 
344   XtSetArg(args[n], XmNlabelString, string ); n++;
345   if (style.smState.smConfirmMode == DtSM_VERBOSE_MODE)
346     {
347       XtSetArg(args[n], XmNset, True); n++;
348     }
349   else {
350       XtSetArg(args[n], XmNset, False); n++;
351     }
352   startup.modeYesTgl= XmCreateToggleButtonGadget(modeForm,"modeYesTgl", args, n);
353   XmStringFree(string);
354   
355   n = 0;
356   XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
357   string = CMPSTR(((char *)GETMESSAGE(7, 9, "Off"))); 
358   XtSetArg(args[n], XmNlabelString, string ); n++;
359   if (style.smState.smConfirmMode != DtSM_VERBOSE_MODE)
360     {
361       XtSetArg(args[n], XmNset, True); n++;
362     }
363   else {
364     XtSetArg(args[n], XmNset, False); n++;
365   }
366   startup.modeNoTgl= XmCreateToggleButtonGadget(modeForm,"modeNoTgl", args, n);
367   XmStringFree(string);
368   
369   n = 0;
370   XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);  n++;
371   XtSetArg(args[n], XmNtopWidget,  widget_list[count-1]);  n++;
372   XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);  n++;
373   XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);  n++;
374   XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);  n++;
375   XtSetArg(args[n], XmNmarginHeight, LB_MARGIN_HEIGHT);  n++;
376   XtSetArg(args[n], XmNmarginWidth, LB_MARGIN_WIDTH);  n++;
377   XtSetArg(args[n], XmNnavigationType, XmTAB_GROUP); n++;  
378   string = CMPSTR(((char *)GETMESSAGE(7, 10, "Set Home Session ...")));
379   XtSetArg(args[n], XmNlabelString, string); n++;
380   widget_list[count++] = startup.setHome = 
381     XmCreatePushButtonGadget(startup.startupForm,"setPB", args, n);
382   XmStringFree(string);
383   
384   XtAddCallback(style.startupDialog, XmNmapCallback, MapStartup, shell);
385   XtAddCallback(style.startupDialog, XmNmapCallback, LayoutCB, shell);
386   XtAddCallback(startup.resumeTgl, XmNvalueChangedCallback, 
387                 (XtCallbackProc)SetCurrentCB, NULL);
388   XtAddCallback(startup.homeTgl, XmNvalueChangedCallback, 
389                 (XtCallbackProc)SetHomeCB, NULL);
390   XtAddCallback(startup.modeYesTgl, XmNvalueChangedCallback, 
391                 (XtCallbackProc)SetConfirmCB, NULL);
392   XtAddCallback( widget_list[count-1], XmNactivateCallback, 
393                 SetHomeSession, style.startupDialog);
394   
395   XtManageChild(modeForm);
396   XtManageChild(startup.startupForm);
397   XtManageChild(shutdownRC);
398   XtManageChildren(widget_list2,count2); 
399   XtManageChild(startup.modeYesTgl);
400   XtManageChild(startup.modeNoTgl);
401   XtManageChildren(widget_list,count); 
402   
403   return(style.startupDialog);
404 }
405
406
407 /*+++++++++++++++++++++++++++++++++++++++*/
408 /* MapStartup                            */
409 /*+++++++++++++++++++++++++++++++++++++++*/
410 static void 
411 MapStartup(
412         Widget w,
413         XtPointer client_data,
414         XtPointer call_data )
415 {
416
417     DtWsmRemoveWorkspaceFunctions (style.display, XtWindow(XtParent(w)));
418
419     if (!save.restoreFlag)
420         putDialog ((Widget)client_data, w);
421
422     XtRemoveCallback(style.startupDialog, XmNmapCallback, MapStartup, NULL);
423 }
424
425
426 /*+++++++++++++++++++++++++++++++++++++++*/
427 /* LayoutCB                              */
428 /*+++++++++++++++++++++++++++++++++++++++*/
429 static void 
430 LayoutCB(
431         Widget w,
432         XtPointer client_data,
433         XtPointer call_data )
434 {
435     int n=0;
436     Arg args[4];
437
438     if (XtWidth(startup.startupForm) < (Dimension) (XtWidth(startup.setHome) +
439                                                (2*style.horizontalSpacing)))
440     {
441         n=0;
442         XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM);  n++;
443         XtSetValues(startup.setHome, args, n);
444     }
445     XtRemoveCallback(style.startupDialog, XmNmapCallback, LayoutCB, NULL);
446 }
447
448
449 /*+++++++++++++++++++++++++++++++++++++++*/
450 /* SetCurrentCB                          */
451 /* tell SM to resume current session     */
452 /*+++++++++++++++++++++++++++++++++++++++*/
453 static void 
454 SetCurrentCB(
455         Widget w,
456         XtPointer client_data,
457         XmToggleButtonCallbackStruct *call_data )
458 {
459     if (call_data->set)
460         style.smState.smStartState = DtSM_CURRENT_STATE;
461 }
462
463
464 /*+++++++++++++++++++++++++++++++++++++++*/
465 /* SetHomeCB                             */
466 /* tell SM to use home session           */
467 /*+++++++++++++++++++++++++++++++++++++++*/
468 static void 
469 SetHomeCB(
470         Widget w,
471         XtPointer client_data,
472         XmToggleButtonCallbackStruct *call_data )
473 {
474     if (call_data->set)
475         style.smState.smStartState = DtSM_HOME_STATE;
476 }
477
478
479 /*+++++++++++++++++++++++++++++++++++++++*/
480 /* SetConfirmCB                          */
481 /* tell SM to be verbose or not          */
482 /*+++++++++++++++++++++++++++++++++++++++*/
483 static void 
484 SetConfirmCB(
485         Widget w,
486         XtPointer client_data,
487         XmToggleButtonCallbackStruct *call_data )
488 {
489    int n;
490    Arg   args[2];
491    Boolean mode;
492
493     if (call_data->set)
494         style.smState.smConfirmMode = DtSM_VERBOSE_MODE;
495     else
496     { 
497         style.smState.smConfirmMode = DtSM_QUIET_MODE;
498     }
499
500
501
502 /*+++++++++++++++++++++++++++++++++++++++*/
503 /* SaveHomeOk                            */
504 /*+++++++++++++++++++++++++++++++++++++++*/
505 static void 
506 SaveHomeOk(
507         Widget w,
508         XtPointer client_data,
509         XtPointer call_data )
510 {
511     SmSaveHomeSession(startup.origStartState, startup.origConfirmMode);    
512 }
513
514
515 /*+++++++++++++++++++++++++++++++++++++++*/
516 /* SetHomeSession                        */
517 /* allow user to cancel out              */
518 /*+++++++++++++++++++++++++++++++++++++++*/
519 static void 
520 SetHomeSession(
521         Widget w,
522         XtPointer client_data,
523         XtPointer call_data )
524 {
525   int         n=0;
526   Arg         args[6];
527   Widget      shell = (Widget) client_data;
528   XmString    string;
529   XmString    okstr, cancelstr;
530
531   if (startup.dlg == NULL)
532     {
533       string = CMPSTR(((char *)GETMESSAGE(7, 11, "This will replace your home session with\nthe current session.\n\n                   Continue?")));
534       XtSetArg(args[n], XmNmessageString, string); n++;
535       okstr = CMPSTR(_DtOkString);
536       cancelstr = CMPSTR(_DtCancelString);
537       XtSetArg(args[n], XmNokLabelString, okstr); n++;
538       XtSetArg(args[n], XmNcancelLabelString, cancelstr); n++;
539       XtSetArg(args[n], XmNmwmFunctions, DIALOG_MWM_FUNC ); n++;
540       startup.dlg = XmCreateWarningDialog(shell, "QNotice", args, n);
541       XtUnmanageChild (XmMessageBoxGetChild(startup.dlg, XmDIALOG_HELP_BUTTON));
542       XtAddCallback(startup.dlg, XmNokCallback, SaveHomeOk, NULL);
543       XmStringFree(string);
544       XmStringFree(okstr);
545       XmStringFree(cancelstr);
546       
547       n=0;
548       XtSetArg (args[n], XmNmwmInputMode,
549                 MWM_INPUT_PRIMARY_APPLICATION_MODAL); n++;
550       XtSetArg(args[n], XmNtitle, ((char *)GETMESSAGE(7, 12, "Warning"))); n++;
551       XtSetValues (XtParent(startup.dlg), args, n);
552     }
553   XtManageChild(startup.dlg);
554 }
555
556
557 /*+++++++++++++++++++++++++++++++++++++++*/
558 /* ButtonCB                              */
559 /* CB for OK, Cancel, Help in DialogBox  */
560 /*+++++++++++++++++++++++++++++++++++++++*/
561 static void 
562 ButtonCB(
563         Widget w,
564         XtPointer client_data,
565         XtPointer call_data )
566 {
567     Arg         set[1], unset[1];
568     DtDialogBoxCallbackStruct *cb = (DtDialogBoxCallbackStruct *) call_data;
569
570     switch (cb->button_position)
571     {
572       case OK_BUTTON:
573
574           XtUnmanageChild (w);
575           if (XmToggleButtonGadgetGetState(startup.modeYesTgl))
576             startup.origConfirmMode = DtSM_VERBOSE_MODE;
577           else
578             startup.origConfirmMode = DtSM_QUIET_MODE;
579
580           SmNewStartupSettings();
581           break;
582
583       case CANCEL_BUTTON:
584
585          XmToggleButtonGadgetSetState(startup.resumeTgl, True, True);
586          XmToggleButtonGadgetSetState(startup.resumeTgl, False, True);
587
588          XtSetArg(set[0], XmNset, True); 
589          XtSetArg(unset[0], XmNset, False); 
590
591          if (startup.origStartState == DtSM_CURRENT_STATE)
592             XmToggleButtonGadgetSetState(startup.resumeTgl, True, True);
593
594          else if (startup.origStartState == DtSM_HOME_STATE)
595             XmToggleButtonGadgetSetState(startup.homeTgl, True, True);
596
597          else
598             /*
599              * Reasonable default?
600              */
601             XmToggleButtonGadgetSetState(startup.resumeTgl, True, True);
602
603          if (startup.origConfirmMode == DtSM_VERBOSE_MODE)
604            XmToggleButtonGadgetSetState(startup.modeYesTgl, True, True);
605          else 
606            XmToggleButtonGadgetSetState(startup.modeNoTgl, True, True);
607
608          style.smState.smStartState = startup.origStartState;
609          style.smState.smConfirmMode = startup.origConfirmMode;
610
611          XtUnmanageChild (w);
612          break;
613
614       case HELP_BUTTON:
615           XtCallCallbacks(style.startupDialog, XmNhelpCallback, (XtPointer)NULL);
616           break;
617
618       default:
619           break;
620     }
621 }
622
623
624 /************************************************************************
625  * restoreStartup()
626  *
627  * restore any state information saved with saveStartup.
628  * This is called from restoreSession with the application
629  * shell and the special xrm database retrieved for restore.
630  ************************************************************************/
631 void 
632 restoreStartup(
633         Widget shell,
634         XrmDatabase db )
635 {
636   XrmName xrm_name[5];
637   XrmRepresentation rep_type;
638   XrmValue value;
639
640     xrm_name [0] = XrmStringToQuark ("startupDlg");
641     xrm_name [2] = NULL;
642
643     /* get x position */
644     xrm_name [1] = XrmStringToQuark ("x");
645     if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value)){
646       XtSetArg (save.posArgs[save.poscnt], XmNx, atoi((char *)value.addr)); 
647       save.poscnt++;
648       save.restoreFlag = True;
649     }
650
651     /* get y position */
652     xrm_name [1] = XrmStringToQuark ("y");
653     if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value)){
654       XtSetArg (save.posArgs[save.poscnt], XmNy, atoi((char *)value.addr)); 
655       save.poscnt++;
656     }
657
658     xrm_name [1] = XrmStringToQuark ("ismapped");
659     XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
660     /* Are we supposed to be mapped? */
661     if (strcmp(value.addr, "True") == 0)
662       popup_startupBB(shell);
663 }
664
665 /************************************************************************
666  * saveStartup()
667  *
668  * This routine will write out to the passed file descriptor any state
669  * information this dialog needs.  It is called from saveSessionCB with the
670  * file already opened.
671  * All information is saved in xrm format.  There is no restriction
672  * on what can be saved.  It doesn't have to be defined or be part of any
673  * widget or Xt definition.  Just name and save it here and recover it in
674  * restoreStartup.  The suggested minimum is whether you are mapped, and 
675  * your location.
676  ************************************************************************/
677 void 
678 saveStartup(
679         int fd )
680 {
681     Position   x,y;
682     char *bufr = style.tmpBigStr;     /* size=[1024], make bigger if needed */
683     XmVendorShellExtObject  vendorExt;
684     XmWidgetExtData         extData;
685
686     if (style.startupDialog != NULL) {
687         if (XtIsManaged(style.startupDialog))
688           sprintf(bufr, "*startupDlg.ismapped: True\n");
689         else
690           sprintf(bufr, "*startupDlg.ismapped: False\n");
691
692         /* Get and write out the geometry info for our Window */
693         x = XtX(XtParent(style.startupDialog));
694         y = XtY(XtParent(style.startupDialog));
695
696         /* Modify x & y to take into account window mgr frames
697          * This is pretty bogus, but I don't know a better way to do it.
698          */
699         extData = _XmGetWidgetExtData(style.shell, XmSHELL_EXTENSION);
700         vendorExt = (XmVendorShellExtObject)extData->widget;
701         x -= vendorExt->vendor.xOffset;
702         y -= vendorExt->vendor.yOffset;
703
704         sprintf(bufr, "%s*startupDlg.x: %d\n", bufr, x);
705         sprintf(bufr, "%s*startupDlg.y: %d\n", bufr, y);
706
707         write (fd, bufr, strlen(bufr));
708     }
709 }
710