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));
1160 sigblock(sigmask(SIGHUP));
1161 sigblock(sigmask(SIGPIPE));
1163 old = sighold(SIGTERM);
1168 if(smGD.bmsDead == False)
1170 notice = (Tt_message) tttk_message_create( 0, TT_NOTICE, TT_SESSION, 0,
1171 "XSession_Ending", 0);
1172 tt_message_send( notice );
1173 tt_message_destroy( notice );
1176 tt_message_reply( msg );
1177 tt_message_destroy( msg );
1184 int sessionType = smGD.sessionType;
1185 XtIntervalId timerId;
1187 msg = (Tt_message) tttk_message_create( 0, TT_NOTICE, TT_SESSION, 0,
1188 "DtActivity_Beginning", 0 );
1189 tt_message_send( msg );
1190 tt_message_destroy( msg );
1192 if (smGD.sessionType == CURRENT_SESSION ||
1193 smGD.sessionType == DEFAULT_SESSION)
1194 SaveState (False, DtSM_CURRENT_STATE, SmSaveLocal, True,
1195 DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
1196 else if (smGD.sessionType == HOME_SESSION &&
1197 smSettings.startState == DtSM_CURRENT_STATE)
1198 SaveState (False, DtSM_HOME_STATE, SmSaveLocal, True,
1199 DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
1201 SaveState (False, DtSM_HOME_STATE, SmSaveGlobal, True,
1202 DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
1205 * Restore sessionType - it may have been changed in SaveState
1207 smGD.sessionType = sessionType;
1209 XSync(smGD.display, 0);
1211 smGD.loggingOut = True;
1213 /* JET - set this here so we don't exit prematurely (while
1214 * handling our own SM exit callback - duh).
1216 smGD.ExitComplete = False;
1218 saveTimeout = False;
1219 timerId = XtAppAddTimeOut (smGD.appCon, smRes.saveYourselfTimeout,
1222 while (smXSMP.saveState.saveComplete == False &&
1223 smXSMP.saveState.shutdownCanceled == False) {
1226 XtAppNextEvent(smGD.appCon, &next);
1228 XtDispatchEvent(&next);
1232 /* JET - need this, since dtsession was exiting in the
1233 * XtAppNextEvent above (receiving it's own EXIT SM message) This
1234 * is checked in SmExit() so exit's will only occur after this
1235 * housekeeping has been completed.
1237 smGD.ExitComplete = True;
1239 if (smXSMP.saveState.shutdownCanceled == False) {
1241 * Run the user's exit script if there is one
1243 if (smGD.compatMode == False)
1245 StartEtc(True); /* run sessionexit */
1248 _DtReleaseLock(smGD.display, SM_RUNNING_LOCK);
1255 /*************************************<->*************************************
1262 * Called when the user bails out from a logout at the confirmation dialog
1267 * client_data - tells which dialog to unmange (the query or confirm exit)
1268 * msg -- if non-zero, Session_Exit request to reply/fail && destroy
1279 *************************************<->***********************************/
1283 XtPointer client_data,
1284 XtPointer call_data )
1286 ExitRecord *exitRec = (ExitRecord *)client_data;
1288 if(XtIsManaged(exitRec->u.exitCancelledDialog))
1290 XtUnmanageChild(exitRec->u.exitCancelledDialog);
1293 if(smDD.smHelpDialog && XtIsManaged(smDD.smHelpDialog))
1295 XtUnmanageChild(smDD.smHelpDialog);
1298 if (*exitRec->pmsg != 0) {
1299 tttk_message_fail(*exitRec->pmsg, TT_DESKTOP_ECANCELED, 0, 1 );
1306 /*************************************<->*************************************
1313 * Once the dialog is managed, but not popped up - reposition it so that
1314 * it appears in the middle of the screen then remove the popup callback
1328 * This routine can be used for any generic SYSTEM_MODAL dialog
1330 *************************************<->***********************************/
1334 XtPointer client_data,
1335 XtPointer call_data )
1338 Dimension width, height;
1342 * Get the size of the dialog box - then compute its position
1345 XtSetArg(uiArgs[i], XmNwidth, &width);i++;
1346 XtSetArg(uiArgs[i], XmNheight, &height);i++;
1347 XtGetValues(w, uiArgs, i);
1349 x = (DisplayWidth(smGD.display, smGD.screen) / 2) - (width / 2);
1350 y = (DisplayHeight(smGD.display, smGD.screen) / 2) - (height / 2);
1353 XtSetArg(uiArgs[i], XmNx, x);i++;
1354 XtSetArg(uiArgs[i], XmNy, y);i++;
1355 XtSetValues(w, uiArgs, i);
1357 XtRemoveCallback(w, XmNpopupCallback, DialogUp, NULL);
1363 /*************************************<->*************************************
1365 * ShowWaitState (flag)
1370 * Enter/Leave the wait state.
1375 * flag = TRUE for Enter, FALSE for Leave.
1385 * Stolen from the window manager code.
1387 *************************************<->***********************************/
1395 XGrabPointer (smGD.display, DefaultRootWindow(smGD.display), FALSE,
1396 0, GrabModeAsync, GrabModeAsync, None,
1397 smGD.waitCursor, CurrentTime);
1398 XGrabKeyboard (smGD.display, DefaultRootWindow(smGD.display), FALSE,
1399 GrabModeAsync, GrabModeAsync, CurrentTime);
1403 XUngrabPointer (smGD.display, CurrentTime);
1404 XUngrabKeyboard (smGD.display, CurrentTime);
1406 XSync(smGD.display, 0);
1410 /*************************************<->*************************************
1417 * This function determines whether a server supports large cursors. It it
1418 * does large feedback cursors are used in some cases (wait state and
1419 * system modal state); otherwise smaller (16x16) standard cursors are used.
1423 * Returns true if large cursors are supported, false otherwise
1427 * This code was stolen from the window manager
1429 *************************************<->***********************************/
1431 InitCursorInfo( void )
1433 unsigned int cWidth;
1434 unsigned int cHeight;
1436 if (XQueryBestCursor (smGD.display, DefaultRootWindow(smGD.display),
1437 32, 32, &cWidth, &cHeight))
1439 if ((cWidth >= 32) && (cHeight >= 32))
1450 /*************************************<->*************************************
1457 * Once the lock dialog is managed, but not popped up - reposition it so that
1458 * it appears in the middle of the screen then remove the popup callback
1473 *************************************<->***********************************/
1477 XtPointer client_data,
1478 XtPointer call_data )
1482 Dimension width, height; /* size values returned by XtGetValues */
1483 Dimension shadowThickness;/* size values returned by XtGetValues */
1486 { /* position, size of widgets (pixels) */
1491 } mw; /* matte, logo, drop shadow & login matte */
1493 int width1, width2; /* general width variable */
1494 int x1, y1; /* general position variables */
1498 * The partial cover has widgets of index 0 - the cover has
1501 if(smGD.coverScreen == True)
1511 * - center the main matte horizontally and vertically...
1514 XtSetArg(uiArgs[i], XmNwidth, &width); i++;
1515 XtSetArg(uiArgs[i], XmNheight, &height); i++;
1516 XtSetArg(uiArgs[i], XmNshadowThickness, &shadowThickness); i++;
1517 XtGetValues(smDD.matte[index], uiArgs, i);
1519 mw.shadow = shadowThickness;
1522 mw.x = (DisplayWidth(smGD.display, smGD.screen) - mw.width)/2;
1523 mw.y = (DisplayHeight(smGD.display, smGD.screen) - mw.height)/2;
1525 if ( mw.x < 0 ) mw.x = 0;
1526 if ( mw.y < 0 ) mw.y = 0;
1533 XtSetArg(uiArgs[i], XmNx, x1); i++;
1534 XtSetArg(uiArgs[i], XmNy, y1); i++;
1536 XtSetValues(smDD.matte[index], uiArgs, i);
1539 * - center the login/password frames horizontally in the login_matte...
1541 XtSetArg(uiArgs[0], XmNwidth, &width);
1542 XtGetValues(smDD.loginMatte[index], uiArgs, 1);
1543 width1 = (int)width;
1545 XtSetArg(uiArgs[0], XmNwidth, &width);
1546 XtGetValues(smDD.loginForm[index], uiArgs, 1);
1547 width2 = (int)width;
1550 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
1551 XtSetArg(uiArgs[i], XmNleftOffset, (width1 - width2) / 2); i++;
1552 XtSetValues(smDD.loginForm[index], uiArgs, i);
1557 /*************************************<->*************************************
1564 * Simply dismiss a dialog. Does special process for a compatibility mode
1565 * logout dialog and when the bms won't start.
1570 * client_data - sends in the dialog to be dismissed.
1581 *************************************<->***********************************/
1585 XtPointer client_data,
1586 XtPointer call_data )
1588 Widget dismissDialog = (Widget) client_data;
1590 if(XtIsManaged(dismissDialog))
1592 XtUnmanageChild(dismissDialog);
1595 if(dismissDialog == smDD.compatExit)
1600 if(dismissDialog == smDD.noStart)
1604 if(dismissDialog == smDD.clientReasons)
1606 reasonsDialogOK = True;
1612 /*************************************<->*************************************
1614 * UpdatePasswdField ()
1619 * Give the visual feedback neccessary when the user is entering a password
1624 * numChars = number of characters entered into the field
1635 *************************************<->***********************************/
1641 char passwdMessage[25];
1647 strcpy(passwdMessage, "|");
1648 for(i = 1;i < numChars;i++)
1651 strcpy(passwdMessage, "|");
1653 strcat(passwdMessage, " ");
1655 strcat(passwdMessage, PASSWORD_INDICATOR);
1659 strcpy(passwdMessage, "|");
1662 tmpString = XmStringCreateLocalized (passwdMessage);
1665 * Set the index for the indLabel widget
1667 if(smGD.coverScreen == True)
1677 XtSetArg(uiArgs[i], XmNlabelString, tmpString); i++;
1678 XtSetValues(smDD.indLabel[index], uiArgs, i);
1680 XmStringFree(tmpString);
1685 /*************************************<->*************************************
1692 * When the BMS refuses to be started, warn the user about why dt is
1693 * crashing and then exit.
1708 *************************************<->***********************************/
1710 WarnNoStartup( void )
1713 XmString bmsNoStartString;
1718 bmsNoStartString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 76,
1719 "The DT 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 your hostname exists correctly in /etc/hosts if your\n\
1725 network has already been configured.\n\
1726 4. If your network has not yet been configured, make sure that /etc/hosts\n\
1727 has the following entry in it:\n\
1728 127.0.0.1 localhost \n\n\
1729 For additional information, see the CDE User's Guide.")));
1732 bmsNoStartString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 36,
1733 "The desktop messaging system could not be started.\n\n\
1734 To correct the problem:\n\n\
1735 1. Choose [OK] to return to the login screen.\n\n\
1736 2. Select Failsafe Session from the login screen's option\n\
1737 menu and log in.\n\n\
1738 3. Check to see that the desktop is properly installed,\n\
1739 the hostname is correct (/etc/hosts) and that the\n\
1740 network is properly configured.\n\n\
1741 For additional information, see the CDE User's Guide.")));
1745 * Now create the dialog box
1748 tmpString = GETMESSAGE(18, 37, "Action Required");
1749 XtSetArg(uiArgs[i], XmNmessageString, bmsNoStartString);i++;
1750 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
1751 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
1752 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
1753 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
1754 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
1755 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
1756 smDD.noStart = XmCreateWarningDialog(smGD.topLevelWid, "noStartDialog",
1759 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
1760 XtSetValues(XtParent(smDD.noStart), uiArgs, i);
1762 XtAddCallback (XtParent(smDD.noStart),
1763 XmNpopupCallback, DialogUp, NULL);
1764 XtUnmanageChild(XmMessageBoxGetChild(smDD.noStart,
1765 XmDIALOG_HELP_BUTTON));
1766 XtUnmanageChild(XmMessageBoxGetChild(smDD.noStart,
1767 XmDIALOG_CANCEL_BUTTON));
1770 * Now add in the callback and get out of here
1772 XtAddCallback (smDD.noStart, XmNokCallback,
1773 SimpleOK, smDD.noStart);
1774 XmStringFree(bmsNoStartString);
1776 XtManageChild(smDD.noStart);
1779 } /* END OF FUNCTION WarnNoStartup */
1784 /*************************************<->*************************************
1791 * Warn the user that a new .dtprofile has just been added to their $HOME
1792 * directory, indicating a need to edit it and their .login/.profile files.
1807 *************************************<->***********************************/
1809 WarnNewProfile( void )
1812 XmString newProfileString;
1815 newProfileString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 99,
1816 "The new file '.dtprofile' has been added to your home directory.\n\
1818 Follow the instructions in this file to ensure that when you log in\n\
1819 again your '.login' or '.profile' file will be activated and \n\
1820 that it will interact correctly with CDE. \n\
1822 For additional information, see the CDE Advanced User's and System\n\
1823 Administrator's Guide.")));
1827 * Now create the dialog box
1830 tmpString = GETMESSAGE(18, 37, "Action Required");
1831 XtSetArg(uiArgs[i], XmNmessageString, newProfileString);i++;
1832 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
1833 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
1834 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
1835 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
1836 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
1837 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
1838 smDD.newProfile = XmCreateWarningDialog(smGD.topLevelWid,
1842 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
1843 XtSetValues(XtParent(smDD.newProfile), uiArgs, i);
1845 XtAddCallback (XtParent(smDD.newProfile),
1846 XmNpopupCallback, DialogUp, NULL);
1847 XtUnmanageChild(XmMessageBoxGetChild(smDD.newProfile,
1848 XmDIALOG_HELP_BUTTON));
1849 XtUnmanageChild(XmMessageBoxGetChild(smDD.newProfile,
1850 XmDIALOG_CANCEL_BUTTON));
1853 * Now add in the callback and get out of here
1855 XtAddCallback (smDD.newProfile, XmNokCallback,
1856 SimpleOK, smDD.newProfile);
1857 XmStringFree(newProfileString);
1859 XtManageChild(smDD.newProfile);
1862 } /* END OF FUNCTION WarnNewProfile */
1868 /*************************************<->*************************************
1870 * ConfirmSessionCreation () -
1881 * Returns True if the user says to continue the session; False otherwise
1882 * or if malloc fails;
1887 *************************************<->***********************************/
1889 ConfirmSessionCreation (
1895 XmString title_string;
1897 XmString cancel_string;
1898 XmString help_string;
1899 XmString msg_string;
1905 Dimension width, height;
1912 * Create temporary argv because the X toolkit may remove
1913 * pieces of the command line options.
1916 argv = (char **) XtMalloc (_argc * sizeof (char *));
1917 for (i = 0; i < _argc; i++)
1921 if (session_type == HOME_SESSION)
1922 pch1 = strdup ((char *) GETMESSAGE(18, 50, "Home"));
1924 pch1 = strdup ((char *) GETMESSAGE(18, 51, "Current"));
1926 PrintError(DtError, smNLS.cantMallocErrorString);
1930 pch2 = strdup ((char *) GETMESSAGE(18, 52,
1931 "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."));
1933 PrintError(DtError, smNLS.cantMallocErrorString);
1937 pch3 = XtMalloc (strlen (pch1) +
1938 strlen (XDisplayName (getenv("DISPLAY"))) +
1942 PrintError(DtError, smNLS.cantMallocErrorString);
1945 (void) sprintf (pch3, pch2, pch1, XDisplayName (getenv("DISPLAY")));
1948 * The X toolkit has not yet been initialized, so do it now.
1951 XtToolkitInitialize ();
1952 smGD.appCon = XtCreateApplicationContext();
1953 smGD.display = XtOpenDisplay(smGD.appCon, NULL, argv[0],
1954 SM_RESOURCE_CLASS, NULL, 0, &argc, argv);
1956 XtSetArg(args[j], XmNbackground,
1957 XBlackPixel(smGD.display, XDefaultScreen(smGD.display))); j++;
1958 XtSetArg(args[j], XmNmappedWhenManaged, False); j++;
1959 XtSetArg (args[j], XmNwidth, 1); j++;
1960 XtSetArg (args[j], XmNheight, 1); j++;
1961 tmp_widget = XtAppCreateShell (
1963 applicationShellWidgetClass,
1964 smGD.display, args, j);
1965 XtRealizeWidget(tmp_widget);
1968 * Create the compound strings for the confirmation dialog
1970 msg_string = XmStringCreateLocalized (pch3);
1971 title_string = XmStringCreateLocalized(pch3);
1973 ok_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
1974 cancel_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 40, "Cancel")));
1975 help_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
1977 free (pch1); free (pch2); XtFree (pch3);
1980 * Create the dialog box
1983 XtSetArg (uiArgs[i], XmNmessageString, msg_string); i++;
1984 XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
1985 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
1986 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
1987 XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
1988 XtSetArg (uiArgs[i], XmNtitle, title_string); i++;
1989 XtSetArg (uiArgs[i], XmNokLabelString, ok_string); i++;
1990 XtSetArg (uiArgs[i], XmNcancelLabelString, cancel_string); i++;
1991 XtSetArg (uiArgs[i], XmNhelpLabelString, help_string); i++;
1992 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
1994 smDD.confirmSession = XmCreateWarningDialog(
1995 tmp_widget, "confirmDialog", uiArgs, i);
1997 XtAddCallback (smDD.confirmSession, XmNokCallback,
2001 * Some help state is not yet initialized and the help
2002 * callback assumes it is so some initializations must
2005 smDD.smHelpDialog = NULL;
2006 smDD.okString = ok_string;
2007 smGD.topLevelWid = tmp_widget;
2009 XtAddCallback (smDD.confirmSession, XmNhelpCallback,
2010 TopicHelpRequested, HELP_CONFIRMATION_SESSION_STR);
2012 XtAddCallback (smDD.confirmSession, XmNcancelCallback,
2013 ConfirmCancelCB, NULL);
2015 XtManageChild(smDD.confirmSession);
2018 * Center the dialog on the display
2021 XtSetArg(uiArgs[i], XmNwidth, &width); i++;
2022 XtSetArg(uiArgs[i], XmNheight, &height); i++;
2023 XtGetValues(smDD.confirmSession, uiArgs, i);
2025 x = (DisplayWidth(smGD.display, XDefaultScreen(smGD.display)) / 2)
2027 y = (DisplayHeight(smGD.display, XDefaultScreen(smGD.display)) / 2)
2031 XtSetArg(uiArgs[i], XmNx, x); i++;
2032 XtSetArg(uiArgs[i], XmNy, y); i++;
2033 XtSetValues(smDD.confirmSession, uiArgs, i);
2035 XmStringFree (msg_string);
2036 XmStringFree (title_string);
2037 XmStringFree (cancel_string);
2038 XmStringFree (help_string);
2041 * Spin until the OK or Cancel CB is invoked
2043 confirmState = ConfirmationNone;
2045 XtAppNextEvent(smGD.appCon, &next);
2047 XtDispatchEvent(&next);
2048 if (confirmState == ConfirmationOK) {
2049 XtDestroyWidget (tmp_widget);
2050 XmStringFree (ok_string);
2053 else if (confirmState == ConfirmationCancel) {
2054 XtDestroyWidget (tmp_widget);
2055 XmStringFree (ok_string);
2062 /*************************************<->*************************************
2066 *************************************<->***********************************/
2070 XtPointer client_data,
2071 XtPointer call_data )
2073 XtUnmanageChild(smDD.confirmSession);
2074 confirmState = ConfirmationOK;
2078 /*************************************<->*************************************
2080 * ConfirmCancelCB ()
2082 *************************************<->***********************************/
2086 XtPointer client_data,
2087 XtPointer call_data )
2089 XtUnmanageChild(smDD.confirmSession);
2090 confirmState = ConfirmationCancel;
2094 /*************************************<->*************************************
2096 * PostXSMPFailureDialog () -
2107 * Returns True if the user says to continue the session; False otherwise
2108 * or if malloc fails;
2113 *************************************<->***********************************/
2115 PostXSMPFailureDialog (
2116 XSMPFailure failure_code,
2117 Boolean check_errorlog)
2121 XmString help_string;
2122 XmString msg_string;
2130 Dimension width, height;
2135 pch1 = strdup ((char *) GETMESSAGE(40, 1,
2136 "A session cannot be started because of the\nfollowing error:"));
2138 PrintError(DtError, smNLS.cantMallocErrorString);
2142 switch (failure_code) {
2143 case XSMP_FAILURE_SMS_INITIALIZE:
2144 pch2 = strdup ((char *) GETMESSAGE (40, 2,
2145 "SmsInitialize failed."));
2147 case XSMP_FAILURE_ICE_LISTEN:
2148 pch2 = strdup ((char *) GETMESSAGE (40, 3,
2149 "IceListenForConnections failed."));
2151 case XSMP_FAILURE_AUTHENTICATION:
2152 pch2 = strdup ((char *) GETMESSAGE (40, 4,
2153 "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."));
2155 case XSMP_FAILURE_ICE_ADD_WATCH:
2156 pch2 = strdup ((char *) GETMESSAGE (40, 5,
2157 "IceAddConnectionWatch failed."));
2159 case XSMP_FAILURE_ICE_COMPOSE_IDS:
2160 pch2 = strdup ((char *) GETMESSAGE (40, 6,
2161 "IceComposeNetworkIds failed."));
2163 case XSMP_FAILURE_MALLOC:
2164 pch2 = strdup ((char *) GETMESSAGE (40, 7,
2165 "Could not create the SESSION_MANAGER environment variable."));
2169 PrintError(DtError, smNLS.cantMallocErrorString);
2173 pch3 = strdup ((char *) GETMESSAGE(18, 70,
2174 "See the following for more information:"));
2176 PrintError(DtError, smNLS.cantMallocErrorString);
2180 pch4 = strdup ((char *) GETMESSAGE(18, 71,
2181 "CDE Advanced Users and System's Administration Guide"));
2183 PrintError(DtError, smNLS.cantMallocErrorString);
2187 error_file = XtMalloc(MAXPATHLEN+1);
2188 strcpy (error_file, "");
2190 /* JET - VU#497553 */
2195 if (home = getenv ("HOME"))
2197 len = strlen(home) +
2198 strlen(DtPERSONAL_CONFIG_DIRECTORY) +
2199 strlen(DtERRORLOG_FILE);
2201 if (len > MAXPATHLEN)
2202 error_file = XtRealloc(error_file, len + 1);
2204 sprintf (error_file, "%s/%s/%s", home,
2205 DtPERSONAL_CONFIG_DIRECTORY,
2210 pch5 = XtMalloc (strlen (pch1) + strlen (pch2) + strlen (pch3) + strlen (pch4) +
2211 strlen (error_file) + 15);
2213 PrintError(DtError, smNLS.cantMallocErrorString);
2216 (void) sprintf (pch5, "%s\n\n %s\n\n%s\n\n %s\n %s\n",
2217 pch1, pch2, pch3, pch4, error_file);
2222 * No top level widget has been created so must create one now.
2225 XtSetArg (args[j], XmNbackground, XBlackPixel(smGD.display,
2226 XDefaultScreen(smGD.display))); j++;
2227 XtSetArg (args[j], XmNmappedWhenManaged, False); j++;
2228 XtSetArg (args[j], XmNwidth, 1); j++;
2229 XtSetArg (args[j], XmNheight, 1); j++;
2231 smGD.topLevelWid = XtAppCreateShell (SM_RESOURCE_NAME,
2232 SM_RESOURCE_CLASS, applicationShellWidgetClass,
2233 smGD.display, args, j);
2235 XtRealizeWidget(smGD.topLevelWid);
2238 * Create the compound strings for the confirmation dialog
2240 msg_string = XmStringCreateLocalized (pch5);
2242 ok_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
2243 help_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
2245 free (pch1); free (pch2); free (pch3); free (pch4); XtFree (pch5);
2248 * Create the dialog box
2251 XtSetArg (uiArgs[i], XmNmessageString, msg_string); i++;
2252 XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
2253 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
2254 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
2255 XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
2256 XtSetArg (uiArgs[i], XmNokLabelString, ok_string); i++;
2257 XtSetArg (uiArgs[i], XmNhelpLabelString, help_string); i++;
2258 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
2260 smDD.confirmSession = XmCreateWarningDialog(
2261 smGD.topLevelWid, "confirmDialog", uiArgs, i);
2263 XtAddCallback (smDD.confirmSession, XmNokCallback,
2264 XSMPFailureOKCB, NULL);
2267 * Some help state is not yet initialized and the help
2268 * callback assumes it is so some initializations must
2271 smDD.smHelpDialog = NULL;
2272 smDD.okString = ok_string;
2274 XtAddCallback (smDD.confirmSession, XmNhelpCallback,
2275 TopicHelpRequested, HELP_XSMP_INIT_FAILURE_STR);
2277 XtUnmanageChild(XmMessageBoxGetChild(smDD.confirmSession,
2278 XmDIALOG_CANCEL_BUTTON));
2280 XtManageChild(smDD.confirmSession);
2283 * Center the dialog on the display
2286 XtSetArg(uiArgs[i], XmNwidth, &width); i++;
2287 XtSetArg(uiArgs[i], XmNheight, &height); i++;
2288 XtGetValues(smDD.confirmSession, uiArgs, i);
2290 x = (DisplayWidth(smGD.display, XDefaultScreen(smGD.display)) / 2)
2292 y = (DisplayHeight(smGD.display, XDefaultScreen(smGD.display)) / 2)
2296 XtSetArg(uiArgs[i], XmNx, x); i++;
2297 XtSetArg(uiArgs[i], XmNy, y); i++;
2298 XtSetValues(smDD.confirmSession, uiArgs, i);
2300 XmStringFree (msg_string);
2301 XmStringFree (help_string);
2304 * Spin until the OK CB is invoked
2307 XtAppNextEvent(smGD.appCon, &next);
2309 XtDispatchEvent(&next);
2314 /*************************************<->*************************************
2316 * XSMPFailureOKCB ()
2318 *************************************<->***********************************/
2322 XtPointer client_data,
2323 XtPointer call_data )
2325 XtUnmanageChild(smDD.confirmSession);
2332 /*************************************<->*************************************
2334 * PostSaveSessionErrorDialog
2338 * Let the user know that the Save_Session message does not have the
2339 * required data and the session will not be saved.
2347 *************************************<->***********************************/
2349 PostSaveSessionErrorDialog ( void )
2352 XmString messageString;
2355 if(smDD.saveSession == NULL)
2357 messageString = XmStringCreateLocalized (((char *) GETMESSAGE(18, 56,
2358 "The session cannot be saved because the required\n\
2359 'save_type' parameter was not in the message.\n\n\
2360 The session will not be saved.")));
2362 titleString = GETMESSAGE(18, 55, "Save Session Failure");
2365 XtSetArg (uiArgs[i], XmNmessageString, messageString); i++;
2366 XtSetArg (uiArgs[i], XmNallowShellResize, True); i++;
2367 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
2368 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
2369 XtSetArg (uiArgs[i], XmNtitle, titleString); i++;
2370 XtSetArg (uiArgs[i], XmNokLabelString, smDD.okString); i++;
2371 XtSetArg (uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
2372 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
2374 smDD.saveSession = XmCreateErrorDialog(smGD.topLevelWid,
2375 "sessionSaveDialog", uiArgs, i);
2378 XtSetArg (uiArgs[i], XmNuseAsyncGeometry, True);i++;
2379 XtSetArg (uiArgs[i], XmNmwmFunctions, 0);i++;
2380 XtSetArg (uiArgs[i], XmNmwmDecorations,
2381 (MWM_DECOR_TITLE | MWM_DECOR_BORDER)); i++;
2382 XtSetArg (uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
2384 XtSetValues(XtParent(smDD.saveSession), uiArgs, i);
2386 XtAddCallback (XtParent(smDD.saveSession),
2387 XmNpopupCallback, DialogUp, NULL);
2389 XtUnmanageChild (XmMessageBoxGetChild(smDD.saveSession,
2390 XmDIALOG_CANCEL_BUTTON));
2392 XtAddCallback (smDD.saveSession, XmNokCallback,
2393 SimpleOK, (XtPointer) smDD.saveSession);
2395 XtAddCallback (smDD.saveSession, XmNhelpCallback,
2396 TopicHelpRequested, HELP_SESSION_SAVE_ERROR_STR);
2398 XmStringFree(messageString);
2401 XtManageChild(smDD.saveSession);
2408 /*************************************<->*************************************
2410 * PostReasonsDialog - posts a Warning dialog on behalf of a client
2411 * that supplied a "reason" when it closed its connection
2419 *************************************<->***********************************/
2425 Boolean waitForResponse)
2429 XmString helpString;
2439 str1 = strdup ((char *) GETMESSAGE(40, 28,
2440 "Application '%s'\nexited for the following reason:\n\n%s"));
2442 PrintError(DtError, smNLS.cantMallocErrorString);
2446 for (i = 0, len = 0; i < numMsgs; i++)
2447 len += strlen (message[i]);
2449 str2 = XtMalloc (len + (numMsgs * 3) + 1);
2451 PrintError(DtError, smNLS.cantMallocErrorString);
2455 for (i = 0; i < numMsgs; i++) {
2456 strcat (str2, message[i]);
2457 strcat (str2, "\n");
2460 str3 = XtMalloc (strlen (str1) + strlen (str2) + strlen (progName) + 4);
2462 PrintError(DtError, smNLS.cantMallocErrorString);
2465 (void) sprintf (str3, str1, progName, str2);
2467 DtMsgLogMessage (smGD.programName, DtMsgLogWarning, str3);
2470 str1 = strdup ((char *) GETMESSAGE(40, 29,
2471 "Application Close Reasons"));
2473 PrintError(DtError, smNLS.cantMallocErrorString);
2477 msgString = XmStringCreateLocalized (str3);
2479 okString = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
2481 helpString = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
2484 * Create the dialog box
2487 XtSetArg (uiArgs[i], XmNmessageString, msgString); i++;
2488 XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
2489 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
2490 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
2491 XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
2492 XtSetArg (uiArgs[i], XmNtitle, str1); i++;
2493 XtSetArg (uiArgs[i], XmNokLabelString, okString); i++;
2494 XtSetArg (uiArgs[i], XmNhelpLabelString, helpString); i++;
2495 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
2497 smDD.clientReasons = XmCreateWarningDialog(smGD.topLevelWid,
2498 "clientReasons", uiArgs, i);
2501 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
2502 XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
2503 XtSetArg(uiArgs[i], XmNmwmDecorations,
2504 (MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
2505 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
2506 XtSetValues(XtParent(smDD.clientReasons), uiArgs, i);
2508 XtAddCallback (XtParent(smDD.clientReasons),
2509 XmNpopupCallback, DialogUp, NULL);
2511 XtUnmanageChild (XmMessageBoxGetChild (smDD.clientReasons,
2512 XmDIALOG_CANCEL_BUTTON));
2515 * Now add in the callback and get out of here
2517 XtAddCallback (smDD.clientReasons, XmNokCallback,
2518 SimpleOK, (XtPointer) smDD.clientReasons);
2520 XtAddCallback (smDD.clientReasons, XmNhelpCallback,
2521 TopicHelpRequested, HELP_APP_CLOSE_REASONS_STR);
2526 XmStringFree (msgString);
2527 XmStringFree (okString);
2528 XmStringFree (helpString);
2530 XtManageChild (smDD.clientReasons);
2533 * Spin until the OK callback is invoked. If a shutdown
2534 * is in progress, we don't want to return until the
2535 * user has acknowledged this message.
2537 reasonsDialogOK = False;
2538 if (waitForResponse) {
2540 XtAppNextEvent (smGD.appCon, &next);
2542 XtDispatchEvent(&next);
2543 if (reasonsDialogOK == True)
2550 /*************************************<->*************************************
2556 * Timeout procedure that is invoked when a save timer expires.
2564 *************************************<->***********************************/
2567 XtPointer client_data,
2572 if (smXSMP.saveState.shutdownCanceled == False) {
2574 * Run the user's exit script if there is one
2576 if (smGD.compatMode == False)
2577 StartEtc(True); /* run sessionexit */
2579 _DtReleaseLock(smGD.display, SM_RUNNING_LOCK);