2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
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)
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
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
23 /* $TOG: SmUI.c /main/32 1998/07/23 18:08:17 mgreess $ */
25 * (c) Copyright 1993, 1994 Hewlett-Packard Company *
26 * (c) Copyright 1993, 1994 International Business Machines Corp. *
27 * (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
28 * (c) Copyright 1993, 1994 Novell, Inc. *
31 /*************************************<+>*************************************
32 *****************************************************************************
36 ** Project: DT Session Manager (dtsession)
40 ** This file handles all UI components of the session manager. This
41 ** includes all dialog boxes. The session manager does not handle its
42 ** representations in the front panel and customizer. That is handled
47 *******************************************************************
48 ** (c) Copyright Hewlett-Packard Company, 1990. All rights are
49 ** reserved. Copying or other reproduction of this program
50 ** except for archival purposes is prohibited without prior
51 ** written consent of Hewlett-Packard Company.
52 ********************************************************************
56 *****************************************************************************
57 *************************************<+>*************************************/
61 #include <sys/param.h>
62 #include <X11/Intrinsic.h>
63 #include <Xm/MwmUtil.h>
68 #include <Xm/LabelG.h>
69 #include <Xm/DrawingA.h>
71 #include <Xm/Separator.h>
72 #include <Xm/MessageB.h>
73 #include <Xm/DialogS.h>
76 #include <Dt/SessionM.h>
78 #include <Dt/MsgLog.h>
84 #include "SmGlobals.h"
93 ConfirmState confirmState;
98 #define PASSWORD_INDICATOR " "
100 typedef struct _ExitRecord {
103 Widget exitCancelledDialog;
104 int queryExitConfirmedMode;
116 * Local Function Declarations
119 static int CompatModeExit( void ) ;
120 static void ExitConfirmed( Widget, XtPointer, XtPointer ) ;
121 static void ExitCancelled( Widget, XtPointer, XtPointer ) ;
122 static void LockDialogUp( Widget, XtPointer, XtPointer ) ;
123 static void SimpleOK( Widget, XtPointer, XtPointer ) ;
124 static void ConfirmOKCB ( Widget, XtPointer, XtPointer ) ;
125 static void ConfirmCancelCB ( Widget, XtPointer, XtPointer ) ;
126 static void ConfirmHelpCB ( Widget, XtPointer, XtPointer ) ;
127 static void XSMPFailureOKCB( Widget w, XtPointer client_data, XtPointer call_data );
128 static void SaveTimeout( XtPointer , XtIntervalId *) ;
134 static Boolean session_confirmed = False;
135 static Boolean reasonsDialogOK;
136 static Boolean saveTimeout;
140 /*************************************<->*************************************
142 * CreateLockDialog ()
147 * Create the lock dialog when it exists NOT as a part of a cover
162 *************************************<->***********************************/
164 CreateLockDialog( void )
167 Widget loginLabel, instructLabel, tmpLock, indFrame;
168 Widget passwdLabel, passwdForm, picFrame, loginPic, loginFrame;
169 Dimension width; /* width, height of login label */
170 XmString lockString, passwordString;
173 Pixel fg, bg, focus_color; /* foreground, background colors */
176 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
177 XtSetArg(uiArgs[i], XmNmarginWidth, 0); i++;
178 XtSetArg(uiArgs[i], XmNmarginHeight, 0); i++;
179 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
180 XtSetArg(uiArgs[i], XmNshadowThickness,5); i++;
181 XtSetArg(uiArgs[i], XmNunitType, XmPIXELS); i++;
182 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
183 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
184 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
185 XtSetArg(uiArgs[i], XmNmappedWhenManaged, True); i++;
186 tmpLock = XmCreateFormDialog(smGD.topLevelWid, "lockDialog", uiArgs, i);
187 XtAddCallback (XtParent(tmpLock), XmNpopupCallback,
189 smDD.matte[0] = tmpLock;
192 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
193 XtSetArg(uiArgs[i], XmNmwmDecorations, 0);i++;
194 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
195 XtSetValues(XtParent(tmpLock), uiArgs, i);
198 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
199 XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
200 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
201 XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
202 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
203 XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
204 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
205 XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
206 picFrame = XmCreateFrame(tmpLock, "picFrame", uiArgs, i);
209 XtSetArg(uiArgs[i], XmNforeground, &fg); i++;
210 XtSetArg(uiArgs[i], XmNbackground, &bg); i++;
211 XtGetValues(tmpLock, uiArgs, i);
214 XtSetArg(uiArgs[i], XmNfillMode, XmFILL_SELF); i++;
215 XtSetArg(uiArgs[i], XmNbehavior, XmICON_LABEL); i++;
216 XtSetArg(uiArgs[i], XmNpixmapForeground, fg); i++;
217 XtSetArg(uiArgs[i], XmNpixmapBackground, bg); i++;
218 XtSetArg(uiArgs[i], XmNstring, NULL); i++;
219 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
220 XtSetArg(uiArgs[i], XmNtraversalOn, False); i++;
221 loginPic = _DtCreateIcon(picFrame, "lockLabelPixmap", uiArgs, i);
224 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
225 XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
226 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
227 XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
228 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
229 XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
230 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
231 XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
232 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
233 XtSetArg(uiArgs[i], XmNrightOffset, 0); i++;
234 XtSetArg(uiArgs[i], XmNrightWidget, loginPic); i++;
235 loginFrame = XmCreateFrame(tmpLock, "loginFrame", uiArgs, i);
239 * create the login matte...
242 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
243 smDD.loginMatte[0] = XmCreateForm(loginFrame, "loginMatte", uiArgs, i);
246 * create the login/password forms
249 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
250 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
251 XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
252 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
253 XtSetArg(uiArgs[i], XmNbottomPosition, 50); i++;
254 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
255 XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
256 smDD.loginForm[0] = XmCreateForm(smDD.loginMatte[0], "loginForm", uiArgs, i);
259 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
260 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
261 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
262 XtSetArg(uiArgs[i], XmNtopPosition, 50); i++;
263 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
264 XtSetArg(uiArgs[i], XmNleftWidget, smDD.loginForm[0]); i++;
265 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
266 XtSetArg(uiArgs[i], XmNrightWidget, smDD.loginForm[0]); i++;
267 passwdForm = XmCreateForm(smDD.loginMatte[0], "passwdForm", uiArgs, i);
271 * create the login/password labels...
274 envLog = getenv("LOGNAME");
275 lockMessage = XtMalloc(100 + strlen(envLog));
278 (char*) GETMESSAGE(18, 1, "Display locked by user %s."), envLog);
279 lockString = XmStringCreateLocalized(lockMessage);
280 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
281 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
282 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
283 XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
284 loginLabel = XmCreateLabelGadget(smDD.loginForm[0],
285 "loginLabel", uiArgs, i);
286 XtManageChild(loginLabel);
287 XmStringFree(lockString);
291 lockString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 2, "Enter password to unlock.")));
292 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
293 XtSetArg(uiArgs[i], XmNtopWidget, loginLabel); i++;
294 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
295 XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
296 instructLabel = XmCreateLabelGadget(smDD.loginForm[0], "instructLabel",
298 XtManageChild(instructLabel);
299 XmStringFree(lockString);
302 passwordString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 3, "Password: ")));
303 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
304 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
305 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
306 XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
307 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
308 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
309 XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
310 passwdLabel = XmCreateLabelGadget(passwdForm,
311 "passwdLabel", uiArgs, i);
312 XtManageChild(passwdLabel);
313 XmStringFree(passwordString);
316 * Give the password label an offset
319 XtSetArg(uiArgs[i], XmNwidth, &width);i++;
320 XtGetValues(passwdLabel, uiArgs, i);
324 XtSetArg(uiArgs[i], XmNwidth, width);i++;
325 XtSetArg(uiArgs[i], XmNrecomputeSize, False);i++;
326 XtSetValues(passwdLabel, uiArgs, i);
330 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_IN); i++;
331 XtSetArg(uiArgs[i], XmNshadowThickness, 1); i++;
332 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
333 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
334 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
335 XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
336 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
337 XtSetArg(uiArgs[i], XmNleftWidget, passwdLabel); i++;
338 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
339 XtSetArg(uiArgs[i], XmNrightOffset, 10); i++;
340 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
341 indFrame = XmCreateFrame(passwdForm, "indFrame", uiArgs, i);
344 passwordString = XmStringCreateLocalized("|");
345 XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
346 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_BEGINNING); i++;
347 smDD.indLabel[0] = XmCreateLabel(indFrame, "indLabel",
349 XtManageChild(smDD.indLabel[0]);
350 XmStringFree(passwordString);
353 XtSetArg(uiArgs[i], XmNhighlightColor, &focus_color); i++;
354 XtGetValues(indFrame, uiArgs, i);
355 XtVaSetValues ( smDD.indLabel[0],
357 XmNborderColor, focus_color,
361 * Manage forms AFTER all children have been managed
363 XtManageChild(indFrame);
364 XtManageChild(passwdForm);
365 XtManageChild(smDD.loginForm[0]);
366 XtManageChild(smDD.loginMatte[0]);
367 XtManageChild(loginPic);
368 XtManageChild(picFrame);
369 XtManageChild(loginFrame);
376 /*************************************<->*************************************
383 * Determines which exit routines get called when an exit request is made
384 * of the session manager.
385 * If smGD.bmsDead == false, we just exit.
386 * If ASK_STATE is turned on, the query dialog is
387 * put up, if VERBOSE is on, confirm exit in current mode (restart or reset)
388 * if confirmation is turned off - exit immediately.
393 * msg -- if non-zero, Session_Exit request to reply/fail && destroy
404 *************************************<->***********************************/
409 if (smGD.bmsDead == True)
411 ImmediateExit(-1, msg, True);
413 if(smGD.compatMode == True)
416 tt_message_reply( msg );
417 tt_message_destroy( msg );
423 if(smSettings.confirmMode == DtSM_VERBOSE_MODE ||
424 smSettings.startState == DtSM_ASK_STATE)
426 ConfirmExit( msg, True );
430 ImmediateExit(smSettings.startState, msg, True);
437 /*************************************<->*************************************
444 * Create the exit confirmation dialog box (if it hasn't been) and confirm
445 * that the user wants to exit the session. This routine only gets called
446 * when the user hasn't turned of exit confirmation and is not in ASK mode
451 * msg -- if non-zero, Session_Exit request to reply/fail && destroy
462 *************************************<->***********************************/
472 static XmString homeToHome; /* started Home, restore to Home */
473 static XmString returnToCurrent; /* started Home or Current but
475 static XmString currentToHome; /* started Current, return to Home */
477 if(smDD.confExit == NULL)
480 * Create all compound strings for confirmation dialogs
482 returnToCurrent = XmStringCreateLocalized(((char *)GETMESSAGE(18, 4,
483 "Exiting the desktop session...\n\n\
484 Your Current session will be restored upon login.\n\n\
485 Application updates you have not saved will be lost.\n\n\
486 Continue Logout?")));
488 homeToHome = XmStringCreateLocalized(((char *)GETMESSAGE(18, 5,
489 "Exiting the desktop session...\n\n\
490 Your Home session will be restored upon login.\n\
491 Your Current session will not be saved.\n\n\
492 Application updates you have not saved will be lost.\n\n\
493 Continue Logout?")));
495 currentToHome = XmStringCreateLocalized(((char *)GETMESSAGE(18, 75,
496 "Exiting the desktop session...\n\n\
497 Your Current session will be saved but your Home\n\
498 session will be restored upon login.\n\n\
499 Application updates you have not saved will be lost.\n\n\
500 Continue Logout?")));
503 * Build up the correct string for this dialog
506 if (smGD.sessionType == HOME_SESSION &&
507 smSettings.startState == DtSM_HOME_STATE)
509 XtSetArg(uiArgs[i], XmNmessageString, homeToHome); i++;
511 else if (smGD.sessionType == CURRENT_SESSION &&
512 smSettings.startState == DtSM_HOME_STATE)
514 XtSetArg(uiArgs[i], XmNmessageString, currentToHome); i++;
518 XtSetArg(uiArgs[i], XmNmessageString, returnToCurrent); i++;
522 * Now create the dialog box
524 tmpString = GETMESSAGE(18, 6, "Logout Confirmation");
525 XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
526 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
527 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_CENTER); i++;
528 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
529 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okLogoutString); i++;
530 XtSetArg(uiArgs[i], XmNcancelLabelString, smDD.cancelLogoutString); i++;
531 XtSetArg(uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
532 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
534 pmsg = (Tt_message *)XtMalloc(sizeof(Tt_message));
535 XtSetArg(uiArgs[i], XmNuserData, pmsg); i++;
537 smDD.confExit = XmCreateWarningDialog(smGD.topLevelWid, "exitDialog",
541 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
542 XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
543 XtSetArg(uiArgs[i], XmNmwmDecorations,
544 (MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
545 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
546 XtSetValues(XtParent(smDD.confExit), uiArgs, i);
548 exitRec = (ExitRecord *)XtMalloc( sizeof(ExitRecord) );
549 exitRec->pmsg = pmsg;
550 exitRec->doSave = doSave;
551 XtAddCallback (smDD.confExit, XmNokCallback, ExitConfirmed, exitRec);
553 XtAddCallback (smDD.confExit, XmNhelpCallback,
554 TopicHelpRequested, HELP_LOGOUT_STR);
556 exitRec = (ExitRecord *)XtMalloc( sizeof(ExitRecord) );
557 exitRec->pmsg = pmsg;
558 exitRec->doSave = doSave;
559 exitRec->u.exitCancelledDialog = smDD.confExit;
560 XtAddCallback (smDD.confExit, XmNcancelCallback,
561 ExitCancelled, exitRec);
566 * The user may have changed the type of session to be
567 * restored so must update the dialog's message.
570 if (smGD.sessionType == HOME_SESSION &&
571 smSettings.startState == DtSM_HOME_STATE)
573 XtSetArg(uiArgs[i], XmNmessageString, homeToHome); i++;
575 else if (smGD.sessionType == CURRENT_SESSION &&
576 smSettings.startState == DtSM_HOME_STATE)
578 XtSetArg(uiArgs[i], XmNmessageString, currentToHome); i++;
582 XtSetArg(uiArgs[i], XmNmessageString, returnToCurrent); i++;
585 XtSetValues(smDD.confExit, uiArgs, i);
589 * Refresh buffer containing pointer to Tt_message.
592 XtSetArg(uiArgs[i], XmNuserData, &pmsg); i++;
593 XtGetValues(smDD.confExit, uiArgs, i);
597 XtAddCallback (XtParent(smDD.confExit), XmNpopupCallback, DialogUp, NULL);
599 XtManageChild(smDD.confExit);
604 /*************************************<->*************************************
611 * Let the user know that the bms has died and that the current session
627 *************************************<->***********************************/
629 WarnMsgFailure( void )
632 XmString bmsDeadString;
635 if(smDD.deadWid == NULL)
637 bmsDeadString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 38,
638 "Messaging System Inoperative\n\n\
639 To restart:\n\n1) Save all open data files.\n\
641 3) Log in again.\n\nNote: The current session will not be saved.\n\n\
642 When you are ready to begin the restart process, click [OK] and\n\
643 proceed to save your files.")));
646 * Now create the dialog box
649 tmpString = GETMESSAGE(18, 12, "Message Failure");
650 XtSetArg(uiArgs[i], XmNmessageString, bmsDeadString);i++;
651 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
652 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
653 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
654 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
655 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
656 XtSetArg(uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
657 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
658 smDD.deadWid = XmCreateWarningDialog(smGD.topLevelWid, "deadDialog",
662 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
663 XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
664 XtSetArg(uiArgs[i], XmNmwmDecorations,
665 (MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
666 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
667 XtSetValues(XtParent(smDD.deadWid), uiArgs, i);
669 XtAddCallback (XtParent(smDD.deadWid),
670 XmNpopupCallback, DialogUp, NULL);
671 XtUnmanageChild(XmMessageBoxGetChild(smDD.deadWid,
672 XmDIALOG_CANCEL_BUTTON));
675 * Now add in the callback and get out of here
677 XtAddCallback (smDD.deadWid, XmNokCallback,
678 SimpleOK, (XtPointer) smDD.deadWid);
680 XtAddCallback (smDD.deadWid, XmNhelpCallback,
681 TopicHelpRequested, HELP_BMS_DEAD_STR);
683 XtAddCallback (smDD.deadWid, XmNcancelCallback,
685 XmStringFree(bmsDeadString);
688 XtManageChild(smDD.deadWid);
693 /*************************************<->*************************************
700 * Let the user know that the logout button can not be used to exit in
701 * compatibility mode.
716 *************************************<->***********************************/
718 CompatModeExit( void )
721 XmString compatModeString;
724 if(smDD.compatExit == NULL)
726 compatModeString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 34,
727 "This session was started from an X Window System startup script.\n\n\
728 No session information will be saved.\n\nUse the reset key sequence to log out.")));
731 * Now create the dialog box
734 tmpString = GETMESSAGE(18, 35, "Logout Message");
735 XtSetArg(uiArgs[i], XmNmessageString, compatModeString);i++;
736 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
737 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
738 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_CENTER); i++;
739 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
740 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
741 XtSetArg(uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
742 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
743 smDD.compatExit = XmCreateInformationDialog(smGD.topLevelWid,
748 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
749 XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
750 XtSetArg(uiArgs[i], XmNmwmDecorations,
751 (MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
752 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
753 XtSetValues(XtParent(smDD.compatExit), uiArgs, i);
755 XtAddCallback (XtParent(smDD.compatExit),
756 XmNpopupCallback, DialogUp, NULL);
757 XtUnmanageChild(XmMessageBoxGetChild(smDD.compatExit,
758 XmDIALOG_CANCEL_BUTTON));
761 * Now add in the callback and get out of here
763 XtAddCallback (smDD.compatExit, XmNokCallback,
764 SimpleOK, smDD.compatExit);
766 XtAddCallback (smDD.compatExit, XmNhelpCallback,
767 TopicHelpRequested, HELP_LOGOUT_COMPAT_MODE_STR);
769 XmStringFree(compatModeString);
772 XtManageChild(smDD.compatExit);
778 /*************************************<->*************************************
780 * CreateLockDialogWithCover()
785 * Create the lock dialog when it exists as a part of a cover
800 *************************************<->***********************************/
802 CreateLockDialogWithCover(
806 Widget loginLabel, instructLabel, tmpLock;
807 Widget indFrame, loginPic, picFrame, loginFrame;
808 Widget passwdLabel, passwdForm;
809 Dimension width; /* width, height of drop shadow */
810 XmString lockString, passwordString;
813 Pixel fg, bg, focus_color; /* foreground, background colors */
816 XtSetArg(uiArgs[i], XmNmarginWidth, 0); i++;
817 XtSetArg(uiArgs[i], XmNmarginHeight, 0); i++;
818 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
819 XtSetArg(uiArgs[i], XmNshadowThickness,5); i++;
820 XtSetArg(uiArgs[i], XmNunitType, XmPIXELS); i++;
821 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
822 XtSetArg(uiArgs[i], XmNmappedWhenManaged, False); i++;
823 tmpLock = XmCreateForm(parent, "lockDialog", uiArgs, i);
824 smDD.matte[1] = tmpLock;
827 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
828 XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
829 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
830 XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
831 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
832 XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
833 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
834 XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
835 picFrame = XmCreateFrame(tmpLock, "picFrame", uiArgs, i);
838 XtSetArg(uiArgs[i], XmNforeground, &fg); i++;
839 XtSetArg(uiArgs[i], XmNbackground, &bg); i++;
840 XtGetValues(tmpLock, uiArgs, i);
843 XtSetArg(uiArgs[i], XmNfillMode, XmFILL_SELF); i++;
844 XtSetArg(uiArgs[i], XmNbehavior, XmICON_LABEL); i++;
845 XtSetArg(uiArgs[i], XmNpixmapForeground, fg); i++;
846 XtSetArg(uiArgs[i], XmNpixmapBackground, bg); i++;
847 XtSetArg(uiArgs[i], XmNstring, NULL); i++;
848 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
849 XtSetArg(uiArgs[i], XmNtraversalOn, False); i++;
850 loginPic = _DtCreateIcon(picFrame, "lockLabelPixmap", uiArgs, i);
853 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
854 XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
855 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
856 XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
857 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
858 XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
859 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
860 XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
861 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
862 XtSetArg(uiArgs[i], XmNrightWidget, picFrame); i++;
863 XtSetArg(uiArgs[i], XmNrightOffset, 0); i++;
864 loginFrame = XmCreateFrame(tmpLock, "loginFrame", uiArgs, i);
867 * create the login matte...
870 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
871 smDD.loginMatte[1] = XmCreateForm(loginFrame, "loginMatte", uiArgs, i);
874 * create the login/password forms
877 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
878 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
879 XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
880 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
881 XtSetArg(uiArgs[i], XmNbottomPosition, 50); i++;
882 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
883 XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
884 smDD.loginForm[1] = XmCreateForm(smDD.loginMatte[1], "loginForm", uiArgs, i);
887 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
888 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
889 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
890 XtSetArg(uiArgs[i], XmNtopPosition, 50); i++;
891 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
892 XtSetArg(uiArgs[i], XmNleftWidget, smDD.loginForm[1]); i++;
893 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
894 XtSetArg(uiArgs[i], XmNrightWidget, smDD.loginForm[1]); i++;
895 passwdForm = XmCreateForm(smDD.loginMatte[1], "passwdForm", uiArgs, i);
899 * create the login/password labels...
902 envLog = getenv("LOGNAME");
903 lockMessage = XtMalloc(100 + strlen(envLog));
906 ((char *)GETMESSAGE(18, 1, "Display locked by user %s.")), envLog);
907 lockString = XmStringCreateLocalized(lockMessage);
908 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
909 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
910 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
911 XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
912 loginLabel = XmCreateLabelGadget(smDD.loginForm[1],
913 "loginLabel", uiArgs, i);
914 XtManageChild(loginLabel);
915 XmStringFree(lockString);
919 lockString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 2, "Enter password to unlock.")));
920 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
921 XtSetArg(uiArgs[i], XmNtopWidget, loginLabel); i++;
922 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
923 XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
924 instructLabel = XmCreateLabelGadget(smDD.loginForm[1], "instructLabel",
926 XtManageChild(instructLabel);
927 XmStringFree(lockString);
930 passwordString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 3, "Password: ")));
931 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
932 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
933 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
934 XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
935 XtSetArg(uiArgs[i], XmNleftOffset, 0); i++;
936 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
937 XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
938 passwdLabel = XmCreateLabelGadget(passwdForm,
939 "passwdLabel", uiArgs, i);
940 XtManageChild(passwdLabel);
941 XmStringFree(passwordString);
944 * Give the password label an offset
947 XtSetArg(uiArgs[i], XmNwidth, &width);i++;
948 XtGetValues(passwdLabel, uiArgs, i);
952 XtSetArg(uiArgs[i], XmNwidth, width);i++;
953 XtSetArg(uiArgs[i], XmNrecomputeSize, False);i++;
954 XtSetValues(passwdLabel, uiArgs, i);
958 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_IN); i++;
959 XtSetArg(uiArgs[i], XmNshadowThickness, 1); i++;
960 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
961 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
962 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
963 XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
964 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
965 XtSetArg(uiArgs[i], XmNleftWidget, passwdLabel); i++;
966 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
967 XtSetArg(uiArgs[i], XmNrightOffset, 10); i++;
968 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
969 indFrame = XmCreateFrame(passwdForm, "indFrame", uiArgs, i);
972 passwordString = XmStringCreateLocalized("|");
973 XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
974 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_BEGINNING); i++;
975 smDD.indLabel[1] = XmCreateLabel(indFrame, "indLabel",
977 XtManageChild(smDD.indLabel[1]);
978 XmStringFree(passwordString);
981 XtSetArg(uiArgs[i], XmNhighlightColor, &focus_color); i++;
982 XtGetValues(indFrame, uiArgs, i);
983 XtVaSetValues ( smDD.indLabel[1],
985 XmNborderColor, focus_color,
988 * Manage forms AFTER all children have been managed
990 XtManageChild(indFrame);
991 XtManageChild(passwdForm);
992 XtManageChild(smDD.loginForm[1]);
993 XtManageChild(smDD.loginMatte[1]);
994 XtManageChild(loginPic);
995 XtManageChild(picFrame);
996 XtManageChild(loginFrame);
1003 /*************************************<->*************************************
1005 * CreateCoverDialog ()
1010 * Create the cover dialogs for all the screens
1025 *************************************<->***********************************/
1032 Widget tmpCover, table;
1033 char geomString[50];
1035 sprintf(geomString, "%dx%d+0+0",
1036 DisplayWidth(smGD.display, screenNum),
1037 DisplayHeight(smGD.display, screenNum));
1040 XtSetArg(uiArgs[i], XmNmwmDecorations, 0);i++;
1041 XtSetArg(uiArgs[i], XmNgeometry, (String) geomString);i++;
1042 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
1043 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
1044 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
1045 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
1046 XtSetArg(uiArgs[i], XmNdepth, DefaultDepth(smGD.display, screenNum));i++;
1047 XtSetArg(uiArgs[i], XmNscreen,
1048 ScreenOfDisplay(smGD.display, screenNum));i++;
1049 XtSetArg(uiArgs[i], XmNcolormap,
1050 DefaultColormap(smGD.display, screenNum));i++;
1051 tmpCover = XtCreatePopupShell("coverDialog", topLevelShellWidgetClass,
1052 smGD.topLevelWid, uiArgs, i);
1055 XtSetArg(uiArgs[i], XmNmarginWidth, 0); i++;
1056 XtSetArg(uiArgs[i], XmNmarginHeight, 0); i++;
1057 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
1058 XtSetArg(uiArgs[i], XmNheight,
1059 (Dimension) DisplayHeight(smGD.display, smGD.screen)); i++;
1060 XtSetArg(uiArgs[i], XmNwidth,
1061 (Dimension) DisplayWidth(smGD.display, smGD.screen)); i++;
1062 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
1063 table = XmCreateDrawingArea(tmpCover, "drawArea", uiArgs, i);
1064 XtManageChild(table);
1065 smDD.coverDrawing[screenNum] = table;
1067 if(withLock == True)
1069 XtAddCallback (tmpCover, XmNpopupCallback,
1070 LockDialogUp, NULL);
1073 XtRealizeWidget(tmpCover);
1079 /*************************************<->*************************************
1086 * Callback that is called when user confirms the exit of a session by
1087 * pressing the OK button on the confirmation dialog. This routine just
1088 * facilitates the exit process.
1103 *************************************<->***********************************/
1107 XtPointer client_data,
1108 XtPointer call_data )
1110 ExitRecord *exitRec = (ExitRecord *)client_data;
1112 XtUnmanageChild(smDD.confExit);
1114 ImmediateExit(smSettings.startState, *exitRec->pmsg, exitRec->doSave);
1119 /*************************************<->*************************************
1126 * This process puts in motion the exit procedure, and then exits.
1131 * mode = Whether this session should be reset or restarted
1132 * msg -- if non-zero, Session_Exit request to reply/fail && destroy
1133 * doSave - if True, the session will be saved.
1144 *************************************<->***********************************/
1155 * Turn off SIGTERM so we don't catch one in the middle of shutting
1158 #if !defined(SVR4) && !defined(sco)
1159 old = sigblock(sigmask(SIGTERM));
1161 old = sighold(SIGTERM);
1166 if(smGD.bmsDead == False)
1168 notice = (Tt_message) tttk_message_create( 0, TT_NOTICE, TT_SESSION, 0,
1169 "XSession_Ending", 0);
1170 tt_message_send( notice );
1171 tt_message_destroy( notice );
1174 tt_message_reply( msg );
1175 tt_message_destroy( msg );
1182 int sessionType = smGD.sessionType;
1183 XtIntervalId timerId;
1185 msg = (Tt_message) tttk_message_create( 0, TT_NOTICE, TT_SESSION, 0,
1186 "DtActivity_Beginning", 0 );
1187 tt_message_send( msg );
1188 tt_message_destroy( msg );
1190 if (smGD.sessionType == CURRENT_SESSION ||
1191 smGD.sessionType == DEFAULT_SESSION)
1192 SaveState (False, DtSM_CURRENT_STATE, SmSaveLocal, True,
1193 DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
1194 else if (smGD.sessionType == HOME_SESSION &&
1195 smSettings.startState == DtSM_CURRENT_STATE)
1196 SaveState (False, DtSM_HOME_STATE, SmSaveLocal, True,
1197 DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
1199 SaveState (False, DtSM_HOME_STATE, SmSaveGlobal, True,
1200 DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
1203 * Restore sessionType - it may have been changed in SaveState
1205 smGD.sessionType = sessionType;
1207 XSync(smGD.display, 0);
1209 smGD.loggingOut = True;
1211 saveTimeout = False;
1212 timerId = XtAppAddTimeOut (smGD.appCon, smRes.saveYourselfTimeout,
1215 while (smXSMP.saveState.saveComplete == False &&
1216 smXSMP.saveState.shutdownCanceled == False) {
1219 XtAppNextEvent(smGD.appCon, &next);
1221 XtDispatchEvent(&next);
1225 if (smXSMP.saveState.shutdownCanceled == False) {
1227 * Run the user's exit script if there is one
1229 if (smGD.compatMode == False)
1231 StartEtc(True); /* run sessionexit */
1234 _DtReleaseLock(smGD.display, SM_RUNNING_LOCK);
1241 /*************************************<->*************************************
1248 * Called when the user bails out from a logout at the confirmation dialog
1253 * client_data - tells which dialog to unmange (the query or confirm exit)
1254 * msg -- if non-zero, Session_Exit request to reply/fail && destroy
1265 *************************************<->***********************************/
1269 XtPointer client_data,
1270 XtPointer call_data )
1272 ExitRecord *exitRec = (ExitRecord *)client_data;
1274 if(XtIsManaged(exitRec->u.exitCancelledDialog))
1276 XtUnmanageChild(exitRec->u.exitCancelledDialog);
1279 if(smDD.smHelpDialog && XtIsManaged(smDD.smHelpDialog))
1281 XtUnmanageChild(smDD.smHelpDialog);
1284 if (*exitRec->pmsg != 0) {
1285 tttk_message_fail(*exitRec->pmsg, TT_DESKTOP_ECANCELED, 0, 1 );
1292 /*************************************<->*************************************
1299 * Once the dialog is managed, but not popped up - reposition it so that
1300 * it appears in the middle of the screen then remove the popup callback
1314 * This routine can be used for any generic SYSTEM_MODAL dialog
1316 *************************************<->***********************************/
1320 XtPointer client_data,
1321 XtPointer call_data )
1324 Dimension width, height;
1328 * Get the size of the dialog box - then compute its position
1331 XtSetArg(uiArgs[i], XmNwidth, &width);i++;
1332 XtSetArg(uiArgs[i], XmNheight, &height);i++;
1333 XtGetValues(w, uiArgs, i);
1335 x = (DisplayWidth(smGD.display, smGD.screen) / 2) - (width / 2);
1336 y = (DisplayHeight(smGD.display, smGD.screen) / 2) - (height / 2);
1339 XtSetArg(uiArgs[i], XmNx, x);i++;
1340 XtSetArg(uiArgs[i], XmNy, y);i++;
1341 XtSetValues(w, uiArgs, i);
1343 XtRemoveCallback(w, XmNpopupCallback, DialogUp, NULL);
1349 /*************************************<->*************************************
1351 * ShowWaitState (flag)
1356 * Enter/Leave the wait state.
1361 * flag = TRUE for Enter, FALSE for Leave.
1371 * Stolen from the window manager code.
1373 *************************************<->***********************************/
1381 XGrabPointer (smGD.display, DefaultRootWindow(smGD.display), FALSE,
1382 0, GrabModeAsync, GrabModeAsync, None,
1383 smGD.waitCursor, CurrentTime);
1384 XGrabKeyboard (smGD.display, DefaultRootWindow(smGD.display), FALSE,
1385 GrabModeAsync, GrabModeAsync, CurrentTime);
1389 XUngrabPointer (smGD.display, CurrentTime);
1390 XUngrabKeyboard (smGD.display, CurrentTime);
1392 XSync(smGD.display, 0);
1396 /*************************************<->*************************************
1403 * This function determines whether a server supports large cursors. It it
1404 * does large feedback cursors are used in some cases (wait state and
1405 * system modal state); otherwise smaller (16x16) standard cursors are used.
1409 * Returns true if large cursors are supported, false otherwise
1413 * This code was stolen from the window manager
1415 *************************************<->***********************************/
1417 InitCursorInfo( void )
1419 unsigned int cWidth;
1420 unsigned int cHeight;
1422 if (XQueryBestCursor (smGD.display, DefaultRootWindow(smGD.display),
1423 32, 32, &cWidth, &cHeight))
1425 if ((cWidth >= 32) && (cHeight >= 32))
1436 /*************************************<->*************************************
1443 * Once the lock dialog is managed, but not popped up - reposition it so that
1444 * it appears in the middle of the screen then remove the popup callback
1459 *************************************<->***********************************/
1463 XtPointer client_data,
1464 XtPointer call_data )
1468 Dimension width, height; /* size values returned by XtGetValues */
1469 Dimension shadowThickness;/* size values returned by XtGetValues */
1472 { /* position, size of widgets (pixels) */
1477 } mw; /* matte, logo, drop shadow & login matte */
1479 int width1, width2; /* general width variable */
1480 int x1, y1; /* general position variables */
1484 * The partial cover has widgets of index 0 - the cover has
1487 if(smGD.coverScreen == True)
1497 * - center the main matte horizontally and vertically...
1500 XtSetArg(uiArgs[i], XmNwidth, &width); i++;
1501 XtSetArg(uiArgs[i], XmNheight, &height); i++;
1502 XtSetArg(uiArgs[i], XmNshadowThickness, &shadowThickness); i++;
1503 XtGetValues(smDD.matte[index], uiArgs, i);
1505 mw.shadow = shadowThickness;
1508 mw.x = (DisplayWidth(smGD.display, smGD.screen) - mw.width)/2;
1509 mw.y = (DisplayHeight(smGD.display, smGD.screen) - mw.height)/2;
1511 if ( mw.x < 0 ) mw.x = 0;
1512 if ( mw.y < 0 ) mw.y = 0;
1519 XtSetArg(uiArgs[i], XmNx, x1); i++;
1520 XtSetArg(uiArgs[i], XmNy, y1); i++;
1522 XtSetValues(smDD.matte[index], uiArgs, i);
1525 * - center the login/password frames horizontally in the login_matte...
1527 XtSetArg(uiArgs[0], XmNwidth, &width);
1528 XtGetValues(smDD.loginMatte[index], uiArgs, 1);
1529 width1 = (int)width;
1531 XtSetArg(uiArgs[0], XmNwidth, &width);
1532 XtGetValues(smDD.loginForm[index], uiArgs, 1);
1533 width2 = (int)width;
1536 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
1537 XtSetArg(uiArgs[i], XmNleftOffset, (width1 - width2) / 2); i++;
1538 XtSetValues(smDD.loginForm[index], uiArgs, i);
1543 /*************************************<->*************************************
1550 * Simply dismiss a dialog. Does special process for a compatibility mode
1551 * logout dialog and when the bms won't start.
1556 * client_data - sends in the dialog to be dismissed.
1567 *************************************<->***********************************/
1571 XtPointer client_data,
1572 XtPointer call_data )
1574 Widget dismissDialog = (Widget) client_data;
1576 if(XtIsManaged(dismissDialog))
1578 XtUnmanageChild(dismissDialog);
1581 if(dismissDialog == smDD.compatExit)
1586 if(dismissDialog == smDD.noStart)
1590 if(dismissDialog == smDD.clientReasons)
1592 reasonsDialogOK == True;
1598 /*************************************<->*************************************
1600 * UpdatePasswdField ()
1605 * Give the visual feedback neccessary when the user is entering a password
1610 * numChars = number of characters entered into the field
1621 *************************************<->***********************************/
1627 char passwdMessage[25];
1633 strcpy(passwdMessage, "|");
1634 for(i = 1;i < numChars;i++)
1637 strcpy(passwdMessage, "|");
1639 strcat(passwdMessage, " ");
1641 strcat(passwdMessage, PASSWORD_INDICATOR);
1645 strcpy(passwdMessage, "|");
1648 tmpString = XmStringCreateLocalized (passwdMessage);
1651 * Set the index for the indLabel widget
1653 if(smGD.coverScreen == True)
1663 XtSetArg(uiArgs[i], XmNlabelString, tmpString); i++;
1664 XtSetValues(smDD.indLabel[index], uiArgs, i);
1666 XmStringFree(tmpString);
1671 /*************************************<->*************************************
1678 * When the BMS refuses to be started, warn the user about why dt is
1679 * crashing and then exit.
1694 *************************************<->***********************************/
1696 WarnNoStartup( void )
1699 XmString bmsNoStartString;
1704 bmsNoStartString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 76,
1705 "The DT messaging system could not be started.\n\n\
1706 To correct the problem:\n\n\
1707 1. Choose [OK] to return to the login screen.\n\n\
1708 2. Select Failsafe Session from the login screen's option\n\
1709 menu and log in.\n\n\
1710 3. Check to see that your hostname exists correctly in /etc/hosts if your\n\
1711 network has already been configured.\n\
1712 4. If your network has not yet been configured, make sure that /etc/hosts\n\
1713 has the following entry in it:\n\
1714 127.0.0.1 localhost \n\n\
1715 For additional information, see the CDE User's Guide.")));
1718 bmsNoStartString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 36,
1719 "The desktop messaging system could not be started.\n\n\
1720 To correct the problem:\n\n\
1721 1. Choose [OK] to return to the login screen.\n\n\
1722 2. Select Failsafe Session from the login screen's option\n\
1723 menu and log in.\n\n\
1724 3. Check to see that the desktop is properly installed,\n\
1725 the hostname is correct (/etc/hosts) and that the\n\
1726 network is properly configured.\n\n\
1727 For additional information, see the CDE User's Guide.")));
1731 * Now create the dialog box
1734 tmpString = GETMESSAGE(18, 37, "Action Required");
1735 XtSetArg(uiArgs[i], XmNmessageString, bmsNoStartString);i++;
1736 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
1737 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
1738 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
1739 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
1740 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
1741 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
1742 smDD.noStart = XmCreateWarningDialog(smGD.topLevelWid, "noStartDialog",
1745 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
1746 XtSetValues(XtParent(smDD.noStart), uiArgs, i);
1748 XtAddCallback (XtParent(smDD.noStart),
1749 XmNpopupCallback, DialogUp, NULL);
1750 XtUnmanageChild(XmMessageBoxGetChild(smDD.noStart,
1751 XmDIALOG_HELP_BUTTON));
1752 XtUnmanageChild(XmMessageBoxGetChild(smDD.noStart,
1753 XmDIALOG_CANCEL_BUTTON));
1756 * Now add in the callback and get out of here
1758 XtAddCallback (smDD.noStart, XmNokCallback,
1759 SimpleOK, smDD.noStart);
1760 XmStringFree(bmsNoStartString);
1762 XtManageChild(smDD.noStart);
1765 } /* END OF FUNCTION WarnNoStartup */
1770 /*************************************<->*************************************
1777 * Warn the user that a new .dtprofile has just been added to their $HOME
1778 * directory, indicating a need to edit it and their .login/.profile files.
1793 *************************************<->***********************************/
1795 WarnNewProfile( void )
1798 XmString newProfileString;
1801 newProfileString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 99,
1802 "The new file '.dtprofile' has been added to your home directory.\n\
1804 Follow the instructions in this file to ensure that when you log in\n\
1805 again your '.login' or '.profile' file will be activated and \n\
1806 that it will interact correctly with CDE. \n\
1808 For additional information, see the CDE Advanced User's and System\n\
1809 Administrator's Guide.")));
1813 * Now create the dialog box
1816 tmpString = GETMESSAGE(18, 37, "Action Required");
1817 XtSetArg(uiArgs[i], XmNmessageString, newProfileString);i++;
1818 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
1819 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
1820 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
1821 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
1822 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
1823 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
1824 smDD.newProfile = XmCreateWarningDialog(smGD.topLevelWid,
1828 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
1829 XtSetValues(XtParent(smDD.newProfile), uiArgs, i);
1831 XtAddCallback (XtParent(smDD.newProfile),
1832 XmNpopupCallback, DialogUp, NULL);
1833 XtUnmanageChild(XmMessageBoxGetChild(smDD.newProfile,
1834 XmDIALOG_HELP_BUTTON));
1835 XtUnmanageChild(XmMessageBoxGetChild(smDD.newProfile,
1836 XmDIALOG_CANCEL_BUTTON));
1839 * Now add in the callback and get out of here
1841 XtAddCallback (smDD.newProfile, XmNokCallback,
1842 SimpleOK, smDD.newProfile);
1843 XmStringFree(newProfileString);
1845 XtManageChild(smDD.newProfile);
1848 } /* END OF FUNCTION WarnNewProfile */
1854 /*************************************<->*************************************
1856 * ConfirmSessionCreation () -
1867 * Returns True if the user says to continue the session; False otherwise
1868 * or if malloc fails;
1873 *************************************<->***********************************/
1875 ConfirmSessionCreation (
1881 XmString title_string;
1883 XmString cancel_string;
1884 XmString help_string;
1885 XmString msg_string;
1891 Dimension width, height;
1898 * Create temporary argv because the X toolkit may remove
1899 * pieces of the command line options.
1902 argv = (char **) XtMalloc (_argc * sizeof (char *));
1903 for (i = 0; i < _argc; i++)
1907 if (session_type == HOME_SESSION)
1908 pch1 = strdup ((char *) GETMESSAGE(18, 50, "Home"));
1910 pch1 = strdup ((char *) GETMESSAGE(18, 51, "Current"));
1912 PrintError(DtError, smNLS.cantMallocErrorString);
1916 pch2 = strdup ((char *) GETMESSAGE(18, 52,
1917 "A display-specific '%s' session was selected\nfor display '%s' but one does not exist.\n\nIf you continue, a new display-specific session will\nbe created."));
1919 PrintError(DtError, smNLS.cantMallocErrorString);
1923 pch3 = XtMalloc (strlen (pch1) +
1924 strlen (XDisplayName (getenv("DISPLAY"))) +
1928 PrintError(DtError, smNLS.cantMallocErrorString);
1931 (void) sprintf (pch3, pch2, pch1, XDisplayName (getenv("DISPLAY")));
1934 * The X toolkit has not yet been initialized, so do it now.
1937 XtToolkitInitialize ();
1938 smGD.appCon = XtCreateApplicationContext();
1939 smGD.display = XtOpenDisplay(smGD.appCon, NULL, argv[0],
1940 SM_RESOURCE_CLASS, NULL, 0, &argc, argv);
1942 XtSetArg(args[j], XmNbackground,
1943 XBlackPixel(smGD.display, XDefaultScreen(smGD.display))); j++;
1944 XtSetArg(args[j], XmNmappedWhenManaged, False); j++;
1945 XtSetArg (args[j], XmNwidth, 1); j++;
1946 XtSetArg (args[j], XmNheight, 1); j++;
1947 tmp_widget = XtAppCreateShell (
1949 applicationShellWidgetClass,
1950 smGD.display, args, j);
1951 XtRealizeWidget(tmp_widget);
1954 * Create the compound strings for the confirmation dialog
1956 msg_string = XmStringCreateLocalized (pch3);
1957 title_string = XmStringCreateLocalized(pch3);
1959 ok_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
1960 cancel_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 40, "Cancel")));
1961 help_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
1963 free (pch1); free (pch2); XtFree (pch3);
1966 * Create the dialog box
1969 XtSetArg (uiArgs[i], XmNmessageString, msg_string); i++;
1970 XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
1971 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
1972 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
1973 XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
1974 XtSetArg (uiArgs[i], XmNtitle, title_string); i++;
1975 XtSetArg (uiArgs[i], XmNokLabelString, ok_string); i++;
1976 XtSetArg (uiArgs[i], XmNcancelLabelString, cancel_string); i++;
1977 XtSetArg (uiArgs[i], XmNhelpLabelString, help_string); i++;
1978 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
1980 smDD.confirmSession = XmCreateWarningDialog(
1981 tmp_widget, "confirmDialog", uiArgs, i);
1983 XtAddCallback (smDD.confirmSession, XmNokCallback,
1987 * Some help state is not yet initialized and the help
1988 * callback assumes it is so some initializations must
1991 smDD.smHelpDialog = NULL;
1992 smDD.okString = ok_string;
1993 smGD.topLevelWid = tmp_widget;
1995 XtAddCallback (smDD.confirmSession, XmNhelpCallback,
1996 TopicHelpRequested, HELP_CONFIRMATION_SESSION_STR);
1998 XtAddCallback (smDD.confirmSession, XmNcancelCallback,
1999 ConfirmCancelCB, NULL);
2001 XtManageChild(smDD.confirmSession);
2004 * Center the dialog on the display
2007 XtSetArg(uiArgs[i], XmNwidth, &width); i++;
2008 XtSetArg(uiArgs[i], XmNheight, &height); i++;
2009 XtGetValues(smDD.confirmSession, uiArgs, i);
2011 x = (DisplayWidth(smGD.display, XDefaultScreen(smGD.display)) / 2)
2013 y = (DisplayHeight(smGD.display, XDefaultScreen(smGD.display)) / 2)
2017 XtSetArg(uiArgs[i], XmNx, x); i++;
2018 XtSetArg(uiArgs[i], XmNy, y); i++;
2019 XtSetValues(smDD.confirmSession, uiArgs, i);
2021 XmStringFree (msg_string);
2022 XmStringFree (title_string);
2023 XmStringFree (cancel_string);
2024 XmStringFree (help_string);
2027 * Spin until the OK or Cancel CB is invoked
2029 confirmState = ConfirmationNone;
2031 XtAppNextEvent(smGD.appCon, &next);
2033 XtDispatchEvent(&next);
2034 if (confirmState == ConfirmationOK) {
2035 XtDestroyWidget (tmp_widget);
2036 XmStringFree (ok_string);
2039 else if (confirmState == ConfirmationCancel) {
2040 XtDestroyWidget (tmp_widget);
2041 XmStringFree (ok_string);
2048 /*************************************<->*************************************
2052 *************************************<->***********************************/
2056 XtPointer client_data,
2057 XtPointer call_data )
2059 XtUnmanageChild(smDD.confirmSession);
2060 confirmState = ConfirmationOK;
2064 /*************************************<->*************************************
2066 * ConfirmCancelCB ()
2068 *************************************<->***********************************/
2072 XtPointer client_data,
2073 XtPointer call_data )
2075 XtUnmanageChild(smDD.confirmSession);
2076 confirmState = ConfirmationCancel;
2080 /*************************************<->*************************************
2082 * PostXSMPFailureDialog () -
2093 * Returns True if the user says to continue the session; False otherwise
2094 * or if malloc fails;
2099 *************************************<->***********************************/
2101 PostXSMPFailureDialog (
2102 XSMPFailure failure_code,
2103 Boolean check_errorlog)
2107 XmString help_string;
2108 XmString msg_string;
2116 Dimension width, height;
2121 pch1 = strdup ((char *) GETMESSAGE(40, 1,
2122 "A session cannot be started because of the\nfollowing error:"));
2124 PrintError(DtError, smNLS.cantMallocErrorString);
2128 switch (failure_code) {
2129 case XSMP_FAILURE_SMS_INITIALIZE:
2130 pch2 = strdup ((char *) GETMESSAGE (40, 2,
2131 "SmsInitialize failed."));
2133 case XSMP_FAILURE_ICE_LISTEN:
2134 pch2 = strdup ((char *) GETMESSAGE (40, 3,
2135 "IceListenForConnections failed."));
2137 case XSMP_FAILURE_AUTHENTICATION:
2138 pch2 = strdup ((char *) GETMESSAGE (40, 4,
2139 "The authentication file ~/.ICEauthority could not be created.\n If the files ~/.ICEauthority-c and ~/.ICEauthority-l exist,\n they must be removed before your session can be started."));
2141 case XSMP_FAILURE_ICE_ADD_WATCH:
2142 pch2 = strdup ((char *) GETMESSAGE (40, 5,
2143 "IceAddConnectionWatch failed."));
2145 case XSMP_FAILURE_ICE_COMPOSE_IDS:
2146 pch2 = strdup ((char *) GETMESSAGE (40, 6,
2147 "IceComposeNetworkIds failed."));
2149 case XSMP_FAILURE_MALLOC:
2150 pch2 = strdup ((char *) GETMESSAGE (40, 7,
2151 "Could not create the SESSION_MANAGER environment variable."));
2155 PrintError(DtError, smNLS.cantMallocErrorString);
2159 pch3 = strdup ((char *) GETMESSAGE(18, 70,
2160 "See the following for more information:"));
2162 PrintError(DtError, smNLS.cantMallocErrorString);
2166 pch4 = strdup ((char *) GETMESSAGE(18, 71,
2167 "CDE Advanced Users and System's Administration Guide"));
2169 PrintError(DtError, smNLS.cantMallocErrorString);
2173 error_file = XtMalloc(MAXPATHLEN+1);
2174 strcpy (error_file, "");
2176 /* JET - VU#497553 */
2181 if (home = getenv ("HOME"))
2183 len = strlen(home) +
2184 strlen(DtPERSONAL_CONFIG_DIRECTORY) +
2185 strlen(DtERRORLOG_FILE);
2187 if (len > MAXPATHLEN)
2188 error_file = XtRealloc(error_file, len + 1);
2190 sprintf (error_file, "%s/%s/%s", home,
2191 DtPERSONAL_CONFIG_DIRECTORY,
2196 pch5 = XtMalloc (strlen (pch1) + strlen (pch2) + strlen (pch3) + strlen (pch4) +
2197 strlen (error_file) + 15);
2199 PrintError(DtError, smNLS.cantMallocErrorString);
2202 (void) sprintf (pch5, "%s\n\n %s\n\n%s\n\n %s\n %s\n",
2203 pch1, pch2, pch3, pch4, error_file);
2208 * No top level widget has been created so must create one now.
2211 XtSetArg (args[j], XmNbackground, XBlackPixel(smGD.display,
2212 XDefaultScreen(smGD.display))); j++;
2213 XtSetArg (args[j], XmNmappedWhenManaged, False); j++;
2214 XtSetArg (args[j], XmNwidth, 1); j++;
2215 XtSetArg (args[j], XmNheight, 1); j++;
2217 smGD.topLevelWid = XtAppCreateShell (SM_RESOURCE_NAME,
2218 SM_RESOURCE_CLASS, applicationShellWidgetClass,
2219 smGD.display, args, j);
2221 XtRealizeWidget(smGD.topLevelWid);
2224 * Create the compound strings for the confirmation dialog
2226 msg_string = XmStringCreateLocalized (pch5);
2228 ok_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
2229 help_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
2231 free (pch1); free (pch2); free (pch3); free (pch4); XtFree (pch5);
2234 * Create the dialog box
2237 XtSetArg (uiArgs[i], XmNmessageString, msg_string); i++;
2238 XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
2239 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
2240 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
2241 XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
2242 XtSetArg (uiArgs[i], XmNokLabelString, ok_string); i++;
2243 XtSetArg (uiArgs[i], XmNhelpLabelString, help_string); i++;
2244 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
2246 smDD.confirmSession = XmCreateWarningDialog(
2247 smGD.topLevelWid, "confirmDialog", uiArgs, i);
2249 XtAddCallback (smDD.confirmSession, XmNokCallback,
2250 XSMPFailureOKCB, NULL);
2253 * Some help state is not yet initialized and the help
2254 * callback assumes it is so some initializations must
2257 smDD.smHelpDialog = NULL;
2258 smDD.okString = ok_string;
2260 XtAddCallback (smDD.confirmSession, XmNhelpCallback,
2261 TopicHelpRequested, HELP_XSMP_INIT_FAILURE_STR);
2263 XtUnmanageChild(XmMessageBoxGetChild(smDD.confirmSession,
2264 XmDIALOG_CANCEL_BUTTON));
2266 XtManageChild(smDD.confirmSession);
2269 * Center the dialog on the display
2272 XtSetArg(uiArgs[i], XmNwidth, &width); i++;
2273 XtSetArg(uiArgs[i], XmNheight, &height); i++;
2274 XtGetValues(smDD.confirmSession, uiArgs, i);
2276 x = (DisplayWidth(smGD.display, XDefaultScreen(smGD.display)) / 2)
2278 y = (DisplayHeight(smGD.display, XDefaultScreen(smGD.display)) / 2)
2282 XtSetArg(uiArgs[i], XmNx, x); i++;
2283 XtSetArg(uiArgs[i], XmNy, y); i++;
2284 XtSetValues(smDD.confirmSession, uiArgs, i);
2286 XmStringFree (msg_string);
2287 XmStringFree (help_string);
2290 * Spin until the OK CB is invoked
2293 XtAppNextEvent(smGD.appCon, &next);
2295 XtDispatchEvent(&next);
2300 /*************************************<->*************************************
2302 * XSMPFailureOKCB ()
2304 *************************************<->***********************************/
2308 XtPointer client_data,
2309 XtPointer call_data )
2311 XtUnmanageChild(smDD.confirmSession);
2318 /*************************************<->*************************************
2320 * PostSaveSessionErrorDialog
2324 * Let the user know that the Save_Session message does not have the
2325 * required data and the session will not be saved.
2333 *************************************<->***********************************/
2335 PostSaveSessionErrorDialog ( void )
2338 XmString messageString;
2341 if(smDD.saveSession == NULL)
2343 messageString = XmStringCreateLocalized (((char *) GETMESSAGE(18, 56,
2344 "The session cannot be saved because the required\n\
2345 'save_type' parameter was not in the message.\n\n\
2346 The session will not be saved.")));
2348 titleString = GETMESSAGE(18, 55, "Save Session Failure");
2351 XtSetArg (uiArgs[i], XmNmessageString, messageString); i++;
2352 XtSetArg (uiArgs[i], XmNallowShellResize, True); i++;
2353 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
2354 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
2355 XtSetArg (uiArgs[i], XmNtitle, titleString); i++;
2356 XtSetArg (uiArgs[i], XmNokLabelString, smDD.okString); i++;
2357 XtSetArg (uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
2358 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
2360 smDD.saveSession = XmCreateErrorDialog(smGD.topLevelWid,
2361 "sessionSaveDialog", uiArgs, i);
2364 XtSetArg (uiArgs[i], XmNuseAsyncGeometry, True);i++;
2365 XtSetArg (uiArgs[i], XmNmwmFunctions, 0);i++;
2366 XtSetArg (uiArgs[i], XmNmwmDecorations,
2367 (MWM_DECOR_TITLE | MWM_DECOR_BORDER)); i++;
2368 XtSetArg (uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
2370 XtSetValues(XtParent(smDD.saveSession), uiArgs, i);
2372 XtAddCallback (XtParent(smDD.saveSession),
2373 XmNpopupCallback, DialogUp, NULL);
2375 XtUnmanageChild (XmMessageBoxGetChild(smDD.saveSession,
2376 XmDIALOG_CANCEL_BUTTON));
2378 XtAddCallback (smDD.saveSession, XmNokCallback,
2379 SimpleOK, (XtPointer) smDD.saveSession);
2381 XtAddCallback (smDD.saveSession, XmNhelpCallback,
2382 TopicHelpRequested, HELP_SESSION_SAVE_ERROR_STR);
2384 XmStringFree(messageString);
2387 XtManageChild(smDD.saveSession);
2394 /*************************************<->*************************************
2396 * PostReasonsDialog - posts a Warning dialog on behalf of a client
2397 * that supplied a "reason" when it closed its connection
2405 *************************************<->***********************************/
2411 Boolean waitForResponse)
2415 XmString helpString;
2425 str1 = strdup ((char *) GETMESSAGE(40, 28,
2426 "Application '%s'\nexited for the following reason:\n\n%s"));
2428 PrintError(DtError, smNLS.cantMallocErrorString);
2432 for (i = 0, len = 0; i < numMsgs; i++)
2433 len += strlen (message[i]);
2435 str2 = XtMalloc (len + (numMsgs * 3) + 1);
2437 PrintError(DtError, smNLS.cantMallocErrorString);
2441 for (i = 0; i < numMsgs; i++) {
2442 strcat (str2, message[i]);
2443 strcat (str2, "\n");
2446 str3 = XtMalloc (strlen (str1) + strlen (str2) + strlen (progName) + 4);
2448 PrintError(DtError, smNLS.cantMallocErrorString);
2451 (void) sprintf (str3, str1, progName, str2);
2453 DtMsgLogMessage (smGD.programName, DtMsgLogWarning, str3);
2456 str1 = strdup ((char *) GETMESSAGE(40, 29,
2457 "Application Close Reasons"));
2459 PrintError(DtError, smNLS.cantMallocErrorString);
2463 msgString = XmStringCreateLocalized (str3);
2465 okString = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
2467 helpString = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
2470 * Create the dialog box
2473 XtSetArg (uiArgs[i], XmNmessageString, msgString); i++;
2474 XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
2475 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
2476 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
2477 XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
2478 XtSetArg (uiArgs[i], XmNtitle, str1); i++;
2479 XtSetArg (uiArgs[i], XmNokLabelString, okString); i++;
2480 XtSetArg (uiArgs[i], XmNhelpLabelString, helpString); i++;
2481 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
2483 smDD.clientReasons = XmCreateWarningDialog(smGD.topLevelWid,
2484 "clientReasons", uiArgs, i);
2487 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
2488 XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
2489 XtSetArg(uiArgs[i], XmNmwmDecorations,
2490 (MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
2491 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
2492 XtSetValues(XtParent(smDD.clientReasons), uiArgs, i);
2494 XtAddCallback (XtParent(smDD.clientReasons),
2495 XmNpopupCallback, DialogUp, NULL);
2497 XtUnmanageChild (XmMessageBoxGetChild (smDD.clientReasons,
2498 XmDIALOG_CANCEL_BUTTON));
2501 * Now add in the callback and get out of here
2503 XtAddCallback (smDD.clientReasons, XmNokCallback,
2504 SimpleOK, (XtPointer) smDD.clientReasons);
2506 XtAddCallback (smDD.clientReasons, XmNhelpCallback,
2507 TopicHelpRequested, HELP_APP_CLOSE_REASONS_STR);
2512 XmStringFree (msgString);
2513 XmStringFree (okString);
2514 XmStringFree (helpString);
2516 XtManageChild (smDD.clientReasons);
2519 * Spin until the OK callback is invoked. If a shutdown
2520 * is in progress, we don't want to return until the
2521 * user has acknowledged this message.
2523 reasonsDialogOK = False;
2524 if (waitForResponse) {
2526 XtAppNextEvent (smGD.appCon, &next);
2528 XtDispatchEvent(&next);
2529 if (reasonsDialogOK == True)
2536 /*************************************<->*************************************
2542 * Timeout procedure that is invoked when a save timer expires.
2550 *************************************<->***********************************/
2553 XtPointer client_data,
2558 if (smXSMP.saveState.shutdownCanceled == False) {
2560 * Run the user's exit script if there is one
2562 if (smGD.compatMode == False)
2563 StartEtc(True); /* run sessionexit */
2565 _DtReleaseLock(smGD.display, SM_RUNNING_LOCK);