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