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