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 libraries 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>
85 #include "SmRestore.h"
87 #include "SmGlobals.h"
90 #include <DtXinerama.h>
100 ConfirmState confirmState;
105 #define PASSWORD_INDICATOR " "
107 typedef struct _ExitRecord {
110 Widget exitCancelledDialog;
111 int queryExitConfirmedMode;
123 * Local Function Declarations
126 static int CompatModeExit( void ) ;
127 static void ExitConfirmed( Widget, XtPointer, XtPointer ) ;
128 static void ExitCancelled( Widget, XtPointer, XtPointer ) ;
129 static void LockDialogUp( Widget, XtPointer, XtPointer ) ;
130 static void SimpleOK( Widget, XtPointer, XtPointer ) ;
131 static void ConfirmOKCB ( Widget, XtPointer, XtPointer ) ;
132 static void ConfirmCancelCB ( Widget, XtPointer, XtPointer ) ;
133 static void ConfirmHelpCB ( Widget, XtPointer, XtPointer ) ;
134 static void XSMPFailureOKCB( Widget w, XtPointer client_data, XtPointer call_data );
135 static void SaveTimeout( XtPointer , XtIntervalId *) ;
141 static Boolean session_confirmed = False;
142 static Boolean reasonsDialogOK;
143 static Boolean saveTimeout;
147 /*************************************<->*************************************
149 * CreateLockDialog ()
154 * Create the lock dialog when it exists NOT as a part of a cover
169 *************************************<->***********************************/
171 CreateLockDialog( void )
174 Widget loginLabel, instructLabel, tmpLock, indFrame;
175 Widget passwdLabel, passwdForm, picFrame, loginPic, loginFrame;
176 Dimension width; /* width, height of login label */
177 XmString lockString, passwordString;
180 Pixel fg, bg, focus_color; /* foreground, background colors */
183 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
184 XtSetArg(uiArgs[i], XmNmarginWidth, 0); i++;
185 XtSetArg(uiArgs[i], XmNmarginHeight, 0); i++;
186 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
187 XtSetArg(uiArgs[i], XmNshadowThickness,5); i++;
188 XtSetArg(uiArgs[i], XmNunitType, XmPIXELS); i++;
189 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
190 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
191 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
192 XtSetArg(uiArgs[i], XmNmappedWhenManaged, True); i++;
193 tmpLock = XmCreateFormDialog(smGD.topLevelWid, "lockDialog", uiArgs, i);
194 XtAddCallback (XtParent(tmpLock), XmNpopupCallback,
196 smDD.matte[0] = tmpLock;
199 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
200 XtSetArg(uiArgs[i], XmNmwmDecorations, 0);i++;
201 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
202 XtSetValues(XtParent(tmpLock), uiArgs, i);
205 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
206 XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
207 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
208 XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
209 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
210 XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
211 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
212 XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
213 picFrame = XmCreateFrame(tmpLock, "picFrame", uiArgs, i);
216 XtSetArg(uiArgs[i], XmNforeground, &fg); i++;
217 XtSetArg(uiArgs[i], XmNbackground, &bg); i++;
218 XtGetValues(tmpLock, uiArgs, i);
221 XtSetArg(uiArgs[i], XmNfillMode, XmFILL_SELF); i++;
222 XtSetArg(uiArgs[i], XmNbehavior, XmICON_LABEL); i++;
223 XtSetArg(uiArgs[i], XmNpixmapForeground, fg); i++;
224 XtSetArg(uiArgs[i], XmNpixmapBackground, bg); i++;
225 XtSetArg(uiArgs[i], XmNstring, NULL); i++;
226 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
227 XtSetArg(uiArgs[i], XmNtraversalOn, False); i++;
228 loginPic = _DtCreateIcon(picFrame, "lockLabelPixmap", uiArgs, i);
231 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
232 XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
233 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
234 XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
235 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
236 XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
237 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
238 XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
239 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
240 XtSetArg(uiArgs[i], XmNrightOffset, 0); i++;
241 XtSetArg(uiArgs[i], XmNrightWidget, loginPic); i++;
242 loginFrame = XmCreateFrame(tmpLock, "loginFrame", uiArgs, i);
246 * create the login matte...
249 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
250 smDD.loginMatte[0] = XmCreateForm(loginFrame, "loginMatte", uiArgs, i);
253 * create the login/password forms
256 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
257 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
258 XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
259 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
260 XtSetArg(uiArgs[i], XmNbottomPosition, 50); i++;
261 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
262 XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
263 smDD.loginForm[0] = XmCreateForm(smDD.loginMatte[0], "loginForm", uiArgs, i);
266 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
267 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
268 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
269 XtSetArg(uiArgs[i], XmNtopPosition, 50); i++;
270 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
271 XtSetArg(uiArgs[i], XmNleftWidget, smDD.loginForm[0]); i++;
272 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
273 XtSetArg(uiArgs[i], XmNrightWidget, smDD.loginForm[0]); i++;
274 passwdForm = XmCreateForm(smDD.loginMatte[0], "passwdForm", uiArgs, i);
278 * create the login/password labels...
281 envLog = getenv("LOGNAME");
282 slen = 100 + strlen(envLog) + 1;
283 lockMessage = XtCalloc(1, slen);
284 snprintf(lockMessage, slen - 1,
285 (char*) GETMESSAGE(18, 1, "Display locked by user %s."), envLog);
286 lockString = XmStringCreateLocalized(lockMessage);
287 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
288 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
289 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
290 XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
291 loginLabel = XmCreateLabelGadget(smDD.loginForm[0],
292 "loginLabel", uiArgs, i);
293 XtManageChild(loginLabel);
294 XmStringFree(lockString);
298 lockString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 2, "Enter password to unlock.")));
299 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
300 XtSetArg(uiArgs[i], XmNtopWidget, loginLabel); i++;
301 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
302 XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
303 instructLabel = XmCreateLabelGadget(smDD.loginForm[0], "instructLabel",
305 XtManageChild(instructLabel);
306 XmStringFree(lockString);
309 passwordString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 3, "Password: ")));
310 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
311 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
312 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
313 XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
314 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
315 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
316 XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
317 passwdLabel = XmCreateLabelGadget(passwdForm,
318 "passwdLabel", uiArgs, i);
319 XtManageChild(passwdLabel);
320 XmStringFree(passwordString);
323 * Give the password label an offset
326 XtSetArg(uiArgs[i], XmNwidth, &width);i++;
327 XtGetValues(passwdLabel, uiArgs, i);
331 XtSetArg(uiArgs[i], XmNwidth, width);i++;
332 XtSetArg(uiArgs[i], XmNrecomputeSize, False);i++;
333 XtSetValues(passwdLabel, uiArgs, i);
337 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_IN); i++;
338 XtSetArg(uiArgs[i], XmNshadowThickness, 1); i++;
339 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
340 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
341 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
342 XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
343 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
344 XtSetArg(uiArgs[i], XmNleftWidget, passwdLabel); i++;
345 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
346 XtSetArg(uiArgs[i], XmNrightOffset, 10); i++;
347 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
348 indFrame = XmCreateFrame(passwdForm, "indFrame", uiArgs, i);
351 passwordString = XmStringCreateLocalized("|");
352 XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
353 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_BEGINNING); i++;
354 smDD.indLabel[0] = XmCreateLabel(indFrame, "indLabel",
356 XtManageChild(smDD.indLabel[0]);
357 XmStringFree(passwordString);
360 XtSetArg(uiArgs[i], XmNhighlightColor, &focus_color); i++;
361 XtGetValues(indFrame, uiArgs, i);
362 XtVaSetValues ( smDD.indLabel[0],
364 XmNborderColor, focus_color,
368 * Manage forms AFTER all children have been managed
370 XtManageChild(indFrame);
371 XtManageChild(passwdForm);
372 XtManageChild(smDD.loginForm[0]);
373 XtManageChild(smDD.loginMatte[0]);
374 XtManageChild(loginPic);
375 XtManageChild(picFrame);
376 XtManageChild(loginFrame);
383 /*************************************<->*************************************
390 * Determines which exit routines get called when an exit request is made
391 * of the session manager.
392 * If smGD.bmsDead == false, we just exit.
393 * If ASK_STATE is turned on, the query dialog is
394 * put up, if VERBOSE is on, confirm exit in current mode (restart or reset)
395 * if confirmation is turned off - exit immediately.
400 * msg -- if non-zero, Session_Exit request to reply/fail && destroy
411 *************************************<->***********************************/
416 if (smGD.bmsDead == True)
418 ImmediateExit(-1, msg, True);
420 if(smGD.compatMode == True)
423 tt_message_reply( msg );
424 tt_message_destroy( msg );
430 if(smSettings.confirmMode == DtSM_VERBOSE_MODE ||
431 smSettings.startState == DtSM_ASK_STATE)
433 ConfirmExit( msg, True );
437 ImmediateExit(smSettings.startState, msg, True);
444 /*************************************<->*************************************
451 * Create the exit confirmation dialog box (if it hasn't been) and confirm
452 * that the user wants to exit the session. This routine only gets called
453 * when the user hasn't turned of exit confirmation and is not in ASK mode
458 * msg -- if non-zero, Session_Exit request to reply/fail && destroy
469 *************************************<->***********************************/
479 static XmString homeToHome; /* started Home, restore to Home */
480 static XmString returnToCurrent; /* started Home or Current but
482 static XmString currentToHome; /* started Current, return to Home */
484 if(smDD.confExit == NULL)
487 * Create all compound strings for confirmation dialogs
489 returnToCurrent = XmStringCreateLocalized(((char *)GETMESSAGE(18, 4,
490 "Exiting the desktop session...\n\n\
491 Your Current session will be restored upon login.\n\n\
492 Application updates you have not saved will be lost.\n\n\
493 Continue Logout?")));
495 homeToHome = XmStringCreateLocalized(((char *)GETMESSAGE(18, 5,
496 "Exiting the desktop session...\n\n\
497 Your Home session will be restored upon login.\n\
498 Your Current session will not be saved.\n\n\
499 Application updates you have not saved will be lost.\n\n\
500 Continue Logout?")));
502 currentToHome = XmStringCreateLocalized(((char *)GETMESSAGE(18, 75,
503 "Exiting the desktop session...\n\n\
504 Your Current session will be saved but your Home\n\
505 session will be restored upon login.\n\n\
506 Application updates you have not saved will be lost.\n\n\
507 Continue Logout?")));
510 * Build up the correct string for this dialog
513 if (smGD.sessionType == HOME_SESSION &&
514 smSettings.startState == DtSM_HOME_STATE)
516 XtSetArg(uiArgs[i], XmNmessageString, homeToHome); i++;
518 else if (smGD.sessionType == CURRENT_SESSION &&
519 smSettings.startState == DtSM_HOME_STATE)
521 XtSetArg(uiArgs[i], XmNmessageString, currentToHome); i++;
525 XtSetArg(uiArgs[i], XmNmessageString, returnToCurrent); i++;
529 * Now create the dialog box
531 tmpString = GETMESSAGE(18, 6, "Logout Confirmation");
532 XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
533 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
534 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_CENTER); i++;
535 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
536 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okLogoutString); i++;
537 XtSetArg(uiArgs[i], XmNcancelLabelString, smDD.cancelLogoutString); i++;
538 XtSetArg(uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
539 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
541 pmsg = (Tt_message *)XtMalloc(sizeof(Tt_message));
542 XtSetArg(uiArgs[i], XmNuserData, pmsg); i++;
544 smDD.confExit = XmCreateWarningDialog(smGD.topLevelWid, "exitDialog",
548 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
549 XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
550 XtSetArg(uiArgs[i], XmNmwmDecorations,
551 (MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
552 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
553 XtSetValues(XtParent(smDD.confExit), uiArgs, i);
555 exitRec = (ExitRecord *)XtMalloc( sizeof(ExitRecord) );
556 exitRec->pmsg = pmsg;
557 exitRec->doSave = doSave;
558 XtAddCallback (smDD.confExit, XmNokCallback, ExitConfirmed, exitRec);
560 XtAddCallback (smDD.confExit, XmNhelpCallback,
561 TopicHelpRequested, HELP_LOGOUT_STR);
563 exitRec = (ExitRecord *)XtMalloc( sizeof(ExitRecord) );
564 exitRec->pmsg = pmsg;
565 exitRec->doSave = doSave;
566 exitRec->u.exitCancelledDialog = smDD.confExit;
567 XtAddCallback (smDD.confExit, XmNcancelCallback,
568 ExitCancelled, exitRec);
573 * The user may have changed the type of session to be
574 * restored so must update the dialog's message.
577 if (smGD.sessionType == HOME_SESSION &&
578 smSettings.startState == DtSM_HOME_STATE)
580 XtSetArg(uiArgs[i], XmNmessageString, homeToHome); i++;
582 else if (smGD.sessionType == CURRENT_SESSION &&
583 smSettings.startState == DtSM_HOME_STATE)
585 XtSetArg(uiArgs[i], XmNmessageString, currentToHome); i++;
589 XtSetArg(uiArgs[i], XmNmessageString, returnToCurrent); i++;
592 XtSetValues(smDD.confExit, uiArgs, i);
596 * Refresh buffer containing pointer to Tt_message.
599 XtSetArg(uiArgs[i], XmNuserData, &pmsg); i++;
600 XtGetValues(smDD.confExit, uiArgs, i);
604 XtAddCallback (XtParent(smDD.confExit), XmNpopupCallback, DialogUp, NULL);
606 XtManageChild(smDD.confExit);
611 /*************************************<->*************************************
618 * Let the user know that the bms has died and that the current session
634 *************************************<->***********************************/
636 WarnMsgFailure( void )
639 XmString bmsDeadString;
642 if(smDD.deadWid == NULL)
644 bmsDeadString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 38,
645 "Messaging System Inoperative\n\n\
646 To restart:\n\n1) Save all open data files.\n\
648 3) Log in again.\n\nNote: The current session will not be saved.\n\n\
649 When you are ready to begin the restart process, click [OK] and\n\
650 proceed to save your files.")));
653 * Now create the dialog box
656 tmpString = GETMESSAGE(18, 12, "Message Failure");
657 XtSetArg(uiArgs[i], XmNmessageString, bmsDeadString);i++;
658 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
659 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
660 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
661 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
662 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
663 XtSetArg(uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
664 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
665 smDD.deadWid = XmCreateWarningDialog(smGD.topLevelWid, "deadDialog",
669 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
670 XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
671 XtSetArg(uiArgs[i], XmNmwmDecorations,
672 (MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
673 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
674 XtSetValues(XtParent(smDD.deadWid), uiArgs, i);
676 XtAddCallback (XtParent(smDD.deadWid),
677 XmNpopupCallback, DialogUp, NULL);
678 XtUnmanageChild(XmMessageBoxGetChild(smDD.deadWid,
679 XmDIALOG_CANCEL_BUTTON));
682 * Now add in the callback and get out of here
684 XtAddCallback (smDD.deadWid, XmNokCallback,
685 SimpleOK, (XtPointer) smDD.deadWid);
687 XtAddCallback (smDD.deadWid, XmNhelpCallback,
688 TopicHelpRequested, HELP_BMS_DEAD_STR);
690 XtAddCallback (smDD.deadWid, XmNcancelCallback,
692 XmStringFree(bmsDeadString);
695 XtManageChild(smDD.deadWid);
700 /*************************************<->*************************************
707 * Let the user know that the logout button can not be used to exit in
708 * compatibility mode.
723 *************************************<->***********************************/
725 CompatModeExit( void )
728 XmString compatModeString;
731 if(smDD.compatExit == NULL)
733 compatModeString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 34,
734 "This session was started from an X Window System startup script.\n\n\
735 No session information will be saved.\n\nUse the reset key sequence to log out.")));
738 * Now create the dialog box
741 tmpString = GETMESSAGE(18, 35, "Logout Message");
742 XtSetArg(uiArgs[i], XmNmessageString, compatModeString);i++;
743 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
744 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
745 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_CENTER); i++;
746 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
747 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
748 XtSetArg(uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
749 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
750 smDD.compatExit = XmCreateInformationDialog(smGD.topLevelWid,
755 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
756 XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
757 XtSetArg(uiArgs[i], XmNmwmDecorations,
758 (MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
759 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
760 XtSetValues(XtParent(smDD.compatExit), uiArgs, i);
762 XtAddCallback (XtParent(smDD.compatExit),
763 XmNpopupCallback, DialogUp, NULL);
764 XtUnmanageChild(XmMessageBoxGetChild(smDD.compatExit,
765 XmDIALOG_CANCEL_BUTTON));
768 * Now add in the callback and get out of here
770 XtAddCallback (smDD.compatExit, XmNokCallback,
771 SimpleOK, smDD.compatExit);
773 XtAddCallback (smDD.compatExit, XmNhelpCallback,
774 TopicHelpRequested, HELP_LOGOUT_COMPAT_MODE_STR);
776 XmStringFree(compatModeString);
779 XtManageChild(smDD.compatExit);
785 /*************************************<->*************************************
787 * CreateLockDialogWithCover()
792 * Create the lock dialog when it exists as a part of a cover
807 *************************************<->***********************************/
809 CreateLockDialogWithCover(
813 Widget loginLabel, instructLabel, tmpLock;
814 Widget indFrame, loginPic, picFrame, loginFrame;
815 Widget passwdLabel, passwdForm;
816 Dimension width; /* width, height of drop shadow */
817 XmString lockString, passwordString;
820 Pixel fg, bg, focus_color; /* foreground, background colors */
823 XtSetArg(uiArgs[i], XmNmarginWidth, 0); i++;
824 XtSetArg(uiArgs[i], XmNmarginHeight, 0); i++;
825 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
826 XtSetArg(uiArgs[i], XmNshadowThickness,5); i++;
827 XtSetArg(uiArgs[i], XmNunitType, XmPIXELS); i++;
828 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
829 XtSetArg(uiArgs[i], XmNmappedWhenManaged, False); i++;
830 tmpLock = XmCreateForm(parent, "lockDialog", uiArgs, i);
831 smDD.matte[1] = tmpLock;
834 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
835 XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
836 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
837 XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
838 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
839 XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
840 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
841 XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
842 picFrame = XmCreateFrame(tmpLock, "picFrame", uiArgs, i);
845 XtSetArg(uiArgs[i], XmNforeground, &fg); i++;
846 XtSetArg(uiArgs[i], XmNbackground, &bg); i++;
847 XtGetValues(tmpLock, uiArgs, i);
850 XtSetArg(uiArgs[i], XmNfillMode, XmFILL_SELF); i++;
851 XtSetArg(uiArgs[i], XmNbehavior, XmICON_LABEL); i++;
852 XtSetArg(uiArgs[i], XmNpixmapForeground, fg); i++;
853 XtSetArg(uiArgs[i], XmNpixmapBackground, bg); i++;
854 XtSetArg(uiArgs[i], XmNstring, NULL); i++;
855 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
856 XtSetArg(uiArgs[i], XmNtraversalOn, False); i++;
857 loginPic = _DtCreateIcon(picFrame, "lockLabelPixmap", uiArgs, i);
860 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
861 XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
862 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
863 XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
864 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
865 XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
866 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
867 XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
868 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
869 XtSetArg(uiArgs[i], XmNrightWidget, picFrame); i++;
870 XtSetArg(uiArgs[i], XmNrightOffset, 0); i++;
871 loginFrame = XmCreateFrame(tmpLock, "loginFrame", uiArgs, i);
874 * create the login matte...
877 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
878 smDD.loginMatte[1] = XmCreateForm(loginFrame, "loginMatte", uiArgs, i);
881 * create the login/password forms
884 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
885 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
886 XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
887 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
888 XtSetArg(uiArgs[i], XmNbottomPosition, 50); i++;
889 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
890 XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
891 smDD.loginForm[1] = XmCreateForm(smDD.loginMatte[1], "loginForm", uiArgs, i);
894 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
895 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
896 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
897 XtSetArg(uiArgs[i], XmNtopPosition, 50); i++;
898 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
899 XtSetArg(uiArgs[i], XmNleftWidget, smDD.loginForm[1]); i++;
900 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
901 XtSetArg(uiArgs[i], XmNrightWidget, smDD.loginForm[1]); i++;
902 passwdForm = XmCreateForm(smDD.loginMatte[1], "passwdForm", uiArgs, i);
906 * create the login/password labels...
909 envLog = getenv("LOGNAME");
910 lockMessage = XtCalloc(1, 100 + strlen(envLog));
911 snprintf(lockMessage, 100 + strlen(envLog) - 1,
912 ((char *)GETMESSAGE(18, 1, "Display locked by user %s.")), envLog);
913 lockString = XmStringCreateLocalized(lockMessage);
914 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
915 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
916 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
917 XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
918 loginLabel = XmCreateLabelGadget(smDD.loginForm[1],
919 "loginLabel", uiArgs, i);
920 XtManageChild(loginLabel);
921 XmStringFree(lockString);
925 lockString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 2, "Enter password to unlock.")));
926 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
927 XtSetArg(uiArgs[i], XmNtopWidget, loginLabel); i++;
928 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
929 XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
930 instructLabel = XmCreateLabelGadget(smDD.loginForm[1], "instructLabel",
932 XtManageChild(instructLabel);
933 XmStringFree(lockString);
936 passwordString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 3, "Password: ")));
937 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
938 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
939 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
940 XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
941 XtSetArg(uiArgs[i], XmNleftOffset, 0); i++;
942 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
943 XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
944 passwdLabel = XmCreateLabelGadget(passwdForm,
945 "passwdLabel", uiArgs, i);
946 XtManageChild(passwdLabel);
947 XmStringFree(passwordString);
950 * Give the password label an offset
953 XtSetArg(uiArgs[i], XmNwidth, &width);i++;
954 XtGetValues(passwdLabel, uiArgs, i);
958 XtSetArg(uiArgs[i], XmNwidth, width);i++;
959 XtSetArg(uiArgs[i], XmNrecomputeSize, False);i++;
960 XtSetValues(passwdLabel, uiArgs, i);
964 XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_IN); i++;
965 XtSetArg(uiArgs[i], XmNshadowThickness, 1); i++;
966 XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
967 XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
968 XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
969 XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
970 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
971 XtSetArg(uiArgs[i], XmNleftWidget, passwdLabel); i++;
972 XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
973 XtSetArg(uiArgs[i], XmNrightOffset, 10); i++;
974 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
975 indFrame = XmCreateFrame(passwdForm, "indFrame", uiArgs, i);
978 passwordString = XmStringCreateLocalized("|");
979 XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
980 XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_BEGINNING); i++;
981 smDD.indLabel[1] = XmCreateLabel(indFrame, "indLabel",
983 XtManageChild(smDD.indLabel[1]);
984 XmStringFree(passwordString);
987 XtSetArg(uiArgs[i], XmNhighlightColor, &focus_color); i++;
988 XtGetValues(indFrame, uiArgs, i);
989 XtVaSetValues ( smDD.indLabel[1],
991 XmNborderColor, focus_color,
994 * Manage forms AFTER all children have been managed
996 XtManageChild(indFrame);
997 XtManageChild(passwdForm);
998 XtManageChild(smDD.loginForm[1]);
999 XtManageChild(smDD.loginMatte[1]);
1000 XtManageChild(loginPic);
1001 XtManageChild(picFrame);
1002 XtManageChild(loginFrame);
1009 /*************************************<->*************************************
1011 * CreateCoverDialog ()
1016 * Create the cover dialogs for all the screens
1031 *************************************<->***********************************/
1038 Widget tmpCover, table;
1039 char geomString[50];
1041 sprintf(geomString, "%dx%d+0+0",
1042 DisplayWidth(smGD.display, screenNum),
1043 DisplayHeight(smGD.display, screenNum));
1046 XtSetArg(uiArgs[i], XmNmwmDecorations, 0);i++;
1047 XtSetArg(uiArgs[i], XmNgeometry, (String) geomString);i++;
1048 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
1049 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
1050 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
1051 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
1052 XtSetArg(uiArgs[i], XmNdepth, DefaultDepth(smGD.display, screenNum));i++;
1053 XtSetArg(uiArgs[i], XmNscreen,
1054 ScreenOfDisplay(smGD.display, screenNum));i++;
1055 XtSetArg(uiArgs[i], XmNcolormap,
1056 DefaultColormap(smGD.display, screenNum));i++;
1057 tmpCover = XtCreatePopupShell("coverDialog", topLevelShellWidgetClass,
1058 smGD.topLevelWid, uiArgs, i);
1061 XtSetArg(uiArgs[i], XmNmarginWidth, 0); i++;
1062 XtSetArg(uiArgs[i], XmNmarginHeight, 0); i++;
1063 XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
1064 XtSetArg(uiArgs[i], XmNheight,
1065 (Dimension) DisplayHeight(smGD.display, smGD.screen)); i++;
1066 XtSetArg(uiArgs[i], XmNwidth,
1067 (Dimension) DisplayWidth(smGD.display, smGD.screen)); i++;
1068 XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
1069 table = XmCreateDrawingArea(tmpCover, "drawArea", uiArgs, i);
1070 XtManageChild(table);
1071 smDD.coverDrawing[screenNum] = table;
1073 if(withLock == True)
1075 XtAddCallback (tmpCover, XmNpopupCallback,
1076 LockDialogUp, NULL);
1079 XtRealizeWidget(tmpCover);
1085 /*************************************<->*************************************
1092 * Callback that is called when user confirms the exit of a session by
1093 * pressing the OK button on the confirmation dialog. This routine just
1094 * facilitates the exit process.
1109 *************************************<->***********************************/
1113 XtPointer client_data,
1114 XtPointer call_data )
1116 ExitRecord *exitRec = (ExitRecord *)client_data;
1118 XtUnmanageChild(smDD.confExit);
1120 ImmediateExit(smSettings.startState, *exitRec->pmsg, exitRec->doSave);
1125 /*************************************<->*************************************
1132 * This process puts in motion the exit procedure, and then exits.
1137 * mode = Whether this session should be reset or restarted
1138 * msg -- if non-zero, Session_Exit request to reply/fail && destroy
1139 * doSave - if True, the session will be saved.
1150 *************************************<->***********************************/
1161 * Turn off SIGTERM so we don't catch one in the middle of shutting
1164 #if !defined(SVR4) && !defined(sco)
1165 old = sigblock(sigmask(SIGTERM));
1166 sigblock(sigmask(SIGHUP));
1167 sigblock(sigmask(SIGPIPE));
1169 old = sighold(SIGTERM);
1174 if(smGD.bmsDead == False)
1176 notice = (Tt_message) tttk_message_create( NULL, TT_NOTICE, TT_SESSION, NULL,
1177 "XSession_Ending", NULL);
1178 tt_message_send( notice );
1179 tt_message_destroy( notice );
1182 tt_message_reply( msg );
1183 tt_message_destroy( msg );
1190 int sessionType = smGD.sessionType;
1191 XtIntervalId timerId;
1193 msg = (Tt_message) tttk_message_create( NULL, TT_NOTICE, TT_SESSION, NULL,
1194 "DtActivity_Beginning", NULL );
1195 tt_message_send( msg );
1196 tt_message_destroy( msg );
1198 if (smGD.sessionType == CURRENT_SESSION ||
1199 smGD.sessionType == DEFAULT_SESSION)
1200 SaveState (False, DtSM_CURRENT_STATE, SmSaveLocal, True,
1201 DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
1202 else if (smGD.sessionType == HOME_SESSION &&
1203 smSettings.startState == DtSM_CURRENT_STATE)
1204 SaveState (False, DtSM_HOME_STATE, SmSaveLocal, True,
1205 DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
1207 SaveState (False, DtSM_HOME_STATE, SmSaveGlobal, True,
1208 DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
1211 * Restore sessionType - it may have been changed in SaveState
1213 smGD.sessionType = sessionType;
1215 XSync(smGD.display, 0);
1217 smGD.loggingOut = True;
1219 /* JET - set this here so we don't exit prematurely (while
1220 * handling our own SM exit callback - duh).
1222 smGD.ExitComplete = False;
1224 saveTimeout = False;
1225 timerId = XtAppAddTimeOut (smGD.appCon, smRes.saveYourselfTimeout,
1228 while (smXSMP.saveState.saveComplete == False &&
1229 smXSMP.saveState.shutdownCanceled == False) {
1232 XtAppNextEvent(smGD.appCon, &next);
1234 XtDispatchEvent(&next);
1238 /* JET - need this, since dtsession was exiting in the
1239 * XtAppNextEvent above (receiving it's own EXIT SM message) This
1240 * is checked in SmExit() so exit's will only occur after this
1241 * housekeeping has been completed.
1243 smGD.ExitComplete = True;
1245 if (smXSMP.saveState.shutdownCanceled == False) {
1247 * Run the user's exit script if there is one
1249 if (smGD.compatMode == False)
1251 StartEtc(True); /* run sessionexit */
1254 _DtReleaseLock(smGD.display, SM_RUNNING_LOCK);
1261 /*************************************<->*************************************
1268 * Called when the user bails out from a logout at the confirmation dialog
1273 * client_data - tells which dialog to unmange (the query or confirm exit)
1274 * msg -- if non-zero, Session_Exit request to reply/fail && destroy
1285 *************************************<->***********************************/
1289 XtPointer client_data,
1290 XtPointer call_data )
1292 ExitRecord *exitRec = (ExitRecord *)client_data;
1294 if(XtIsManaged(exitRec->u.exitCancelledDialog))
1296 XtUnmanageChild(exitRec->u.exitCancelledDialog);
1299 if(smDD.smHelpDialog && XtIsManaged(smDD.smHelpDialog))
1301 XtUnmanageChild(smDD.smHelpDialog);
1304 if (*exitRec->pmsg != 0) {
1305 tttk_message_fail(*exitRec->pmsg, TT_DESKTOP_ECANCELED, 0, 1 );
1312 /*************************************<->*************************************
1319 * Once the dialog is managed, but not popped up - reposition it so that
1320 * it appears in the middle of the screen then remove the popup callback
1334 * This routine can be used for any generic SYSTEM_MODAL dialog
1336 *************************************<->***********************************/
1340 XtPointer client_data,
1341 XtPointer call_data )
1344 Dimension width, height;
1346 unsigned int dpwidth, dpheight, xorg, yorg; /* JET - Xinerama */
1349 * Get the size of the dialog box - then compute its position
1352 XtSetArg(uiArgs[i], XmNwidth, &width);i++;
1353 XtSetArg(uiArgs[i], XmNheight, &height);i++;
1354 XtGetValues(w, uiArgs, i);
1356 /* JET - get xinerama info */
1358 /* use the 'prefered' screen */
1359 if (!_DtXineramaGetScreen(smGD.DtXineramaInfo,
1360 smRes.xineramaPreferredScreen,
1361 &dpwidth, &dpheight, &xorg, &yorg))
1362 { /* no joy here either - setup for normal */
1363 dpwidth = DisplayWidth(smGD.display, smGD.screen);
1364 dpheight = DisplayHeight(smGD.display, smGD.screen);
1367 #else /* no Xinerama */
1368 dpwidth = DisplayWidth(smGD.display, smGD.screen);
1369 dpheight = DisplayHeight(smGD.display, smGD.screen);
1373 x = (dpwidth / 2) - (width / 2);
1374 y = (dpheight / 2) - (height / 2);
1376 /* add the x/y origins for Xinerama */
1381 XtSetArg(uiArgs[i], XmNx, x);i++;
1382 XtSetArg(uiArgs[i], XmNy, y);i++;
1383 XtSetValues(w, uiArgs, i);
1385 XtRemoveCallback(w, XmNpopupCallback, DialogUp, NULL);
1391 /*************************************<->*************************************
1393 * ShowWaitState (flag)
1398 * Enter/Leave the wait state.
1403 * flag = TRUE for Enter, FALSE for Leave.
1413 * Stolen from the window manager code.
1415 *************************************<->***********************************/
1423 XGrabPointer (smGD.display, DefaultRootWindow(smGD.display), FALSE,
1424 0, GrabModeAsync, GrabModeAsync, None,
1425 smGD.waitCursor, CurrentTime);
1426 XGrabKeyboard (smGD.display, DefaultRootWindow(smGD.display), FALSE,
1427 GrabModeAsync, GrabModeAsync, CurrentTime);
1431 XUngrabPointer (smGD.display, CurrentTime);
1432 XUngrabKeyboard (smGD.display, CurrentTime);
1434 XSync(smGD.display, 0);
1438 /*************************************<->*************************************
1445 * This function determines whether a server supports large cursors. It it
1446 * does large feedback cursors are used in some cases (wait state and
1447 * system modal state); otherwise smaller (16x16) standard cursors are used.
1451 * Returns true if large cursors are supported, false otherwise
1455 * This code was stolen from the window manager
1457 *************************************<->***********************************/
1459 InitCursorInfo( void )
1461 unsigned int cWidth;
1462 unsigned int cHeight;
1464 if (XQueryBestCursor (smGD.display, DefaultRootWindow(smGD.display),
1465 32, 32, &cWidth, &cHeight))
1467 if ((cWidth >= 32) && (cHeight >= 32))
1478 /*************************************<->*************************************
1485 * Once the lock dialog is managed, but not popped up - reposition it so that
1486 * it appears in the middle of the screen then remove the popup callback
1501 *************************************<->***********************************/
1505 XtPointer client_data,
1506 XtPointer call_data )
1510 Dimension width, height; /* size values returned by XtGetValues */
1511 Dimension shadowThickness;/* size values returned by XtGetValues */
1512 unsigned int dpwidth, dpheight, xorg, yorg; /* JET - xinerama */
1515 { /* position, size of widgets (pixels) */
1520 } mw; /* matte, logo, drop shadow & login matte */
1522 int width1, width2; /* general width variable */
1523 int x1, y1; /* general position variables */
1526 /* JET - get xinerama info */
1528 /* use the prefered screen */
1529 if (!_DtXineramaGetScreen(smGD.DtXineramaInfo,
1530 smRes.xineramaPreferredScreen,
1531 &dpwidth, &dpheight, &xorg, &yorg))
1532 { /* no joy here either - setup for normal */
1533 dpwidth = DisplayWidth(smGD.display, smGD.screen);
1534 dpheight = DisplayHeight(smGD.display, smGD.screen);
1537 #else /* no Xinerama */
1538 dpwidth = DisplayWidth(smGD.display, smGD.screen);
1539 dpheight = DisplayHeight(smGD.display, smGD.screen);
1544 * The partial cover has widgets of index 0 - the cover has
1547 if(smGD.coverScreen == True)
1557 * - center the main matte horizontally and vertically...
1560 XtSetArg(uiArgs[i], XmNwidth, &width); i++;
1561 XtSetArg(uiArgs[i], XmNheight, &height); i++;
1562 XtSetArg(uiArgs[i], XmNshadowThickness, &shadowThickness); i++;
1563 XtGetValues(smDD.matte[index], uiArgs, i);
1565 mw.shadow = shadowThickness;
1568 mw.x = (dpwidth - mw.width)/2;
1569 mw.y = (dpheight - mw.height)/2;
1571 if ( mw.x < 0 ) mw.x = 0;
1572 if ( mw.y < 0 ) mw.y = 0;
1574 /* adjust origins if using Xinerama */
1580 XtSetArg(uiArgs[i], XmNx, x1); i++;
1581 XtSetArg(uiArgs[i], XmNy, y1); i++;
1583 XtSetValues(smDD.matte[index], uiArgs, i);
1586 * - center the login/password frames horizontally in the login_matte...
1588 XtSetArg(uiArgs[0], XmNwidth, &width);
1589 XtGetValues(smDD.loginMatte[index], uiArgs, 1);
1590 width1 = (int)width;
1592 XtSetArg(uiArgs[0], XmNwidth, &width);
1593 XtGetValues(smDD.loginForm[index], uiArgs, 1);
1594 width2 = (int)width;
1597 XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
1598 XtSetArg(uiArgs[i], XmNleftOffset, (width1 - width2) / 2); i++;
1599 XtSetValues(smDD.loginForm[index], uiArgs, i);
1604 /*************************************<->*************************************
1611 * Simply dismiss a dialog. Does special process for a compatibility mode
1612 * logout dialog and when the bms won't start.
1617 * client_data - sends in the dialog to be dismissed.
1628 *************************************<->***********************************/
1632 XtPointer client_data,
1633 XtPointer call_data )
1635 Widget dismissDialog = (Widget) client_data;
1637 if(XtIsManaged(dismissDialog))
1639 XtUnmanageChild(dismissDialog);
1642 if(dismissDialog == smDD.compatExit)
1647 if(dismissDialog == smDD.noStart)
1651 if(dismissDialog == smDD.clientReasons)
1653 reasonsDialogOK = True;
1659 /*************************************<->*************************************
1661 * UpdatePasswdField ()
1666 * Give the visual feedback necessary when the user is entering a password
1671 * numChars = number of characters entered into the field
1682 *************************************<->***********************************/
1688 char *passwdMessage = XtMalloc(numChars + 1);
1691 if (!passwdMessage) {
1692 PrintErrnoError(DtError, smNLS.cantMallocErrorString);
1698 strcpy(passwdMessage, "|");
1699 for(i = 1;i < numChars;i++)
1702 strcpy(passwdMessage, "|");
1704 strcat(passwdMessage, " ");
1706 strcat(passwdMessage, PASSWORD_INDICATOR);
1710 strcpy(passwdMessage, "|");
1713 tmpString = XmStringCreateLocalized (passwdMessage);
1714 XtFree(passwdMessage);
1716 * Set the index for the indLabel widget
1718 if(smGD.coverScreen == True)
1728 XtSetArg(uiArgs[i], XmNlabelString, tmpString); i++;
1729 XtSetValues(smDD.indLabel[index], uiArgs, i);
1731 XmStringFree(tmpString);
1736 /*************************************<->*************************************
1743 * When the BMS refuses to be started, warn the user about why dt is
1744 * crashing and then exit.
1759 *************************************<->***********************************/
1761 WarnNoStartup( void )
1764 XmString bmsNoStartString;
1769 bmsNoStartString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 76,
1770 "The DT messaging system could not be started.\n\n\
1771 To correct the problem:\n\n\
1772 1. Choose [OK] to return to the login screen.\n\n\
1773 2. Select Failsafe Session from the login screen's option\n\
1774 menu and log in.\n\n\
1775 3. Check to see that your hostname exists correctly in /etc/hosts if your\n\
1776 network has already been configured.\n\
1777 4. If your network has not yet been configured, make sure that /etc/hosts\n\
1778 has the following entry in it:\n\
1779 127.0.0.1 localhost \n\n\
1780 For additional information, see the CDE User's Guide.")));
1783 bmsNoStartString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 36,
1784 "The desktop messaging system could not be started.\n\n\
1785 To correct the problem:\n\n\
1786 1. Choose [OK] to return to the login screen.\n\n\
1787 2. Select Failsafe Session from the login screen's option\n\
1788 menu and log in.\n\n\
1789 3. Check to see that the desktop is properly installed,\n\
1790 the hostname is correct (/etc/hosts) and that the\n\
1791 network is properly configured.\n\n\
1792 For additional information, see the CDE User's Guide.")));
1796 * Now create the dialog box
1799 tmpString = GETMESSAGE(18, 37, "Action Required");
1800 XtSetArg(uiArgs[i], XmNmessageString, bmsNoStartString);i++;
1801 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
1802 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
1803 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
1804 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
1805 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
1806 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
1807 smDD.noStart = XmCreateWarningDialog(smGD.topLevelWid, "noStartDialog",
1810 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
1811 XtSetValues(XtParent(smDD.noStart), uiArgs, i);
1813 XtAddCallback (XtParent(smDD.noStart),
1814 XmNpopupCallback, DialogUp, NULL);
1815 XtUnmanageChild(XmMessageBoxGetChild(smDD.noStart,
1816 XmDIALOG_HELP_BUTTON));
1817 XtUnmanageChild(XmMessageBoxGetChild(smDD.noStart,
1818 XmDIALOG_CANCEL_BUTTON));
1821 * Now add in the callback and get out of here
1823 XtAddCallback (smDD.noStart, XmNokCallback,
1824 SimpleOK, smDD.noStart);
1825 XmStringFree(bmsNoStartString);
1827 XtManageChild(smDD.noStart);
1830 } /* END OF FUNCTION WarnNoStartup */
1835 /*************************************<->*************************************
1842 * Warn the user that a new .dtprofile has just been added to their $HOME
1843 * directory, indicating a need to edit it and their .login/.profile files.
1858 *************************************<->***********************************/
1860 WarnNewProfile( void )
1863 XmString newProfileString;
1866 newProfileString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 99,
1867 "The new file '.dtprofile' has been added to your home directory.\n\
1869 Follow the instructions in this file to ensure that when you log in\n\
1870 again your '.login' or '.profile' file will be activated and \n\
1871 that it will interact correctly with CDE. \n\
1873 For additional information, see the CDE Advanced User's and System\n\
1874 Administrator's Guide.")));
1878 * Now create the dialog box
1881 tmpString = GETMESSAGE(18, 37, "Action Required");
1882 XtSetArg(uiArgs[i], XmNmessageString, newProfileString);i++;
1883 XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
1884 XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
1885 XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
1886 XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
1887 XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
1888 XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
1889 smDD.newProfile = XmCreateWarningDialog(smGD.topLevelWid,
1893 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
1894 XtSetValues(XtParent(smDD.newProfile), uiArgs, i);
1896 XtAddCallback (XtParent(smDD.newProfile),
1897 XmNpopupCallback, DialogUp, NULL);
1898 XtUnmanageChild(XmMessageBoxGetChild(smDD.newProfile,
1899 XmDIALOG_HELP_BUTTON));
1900 XtUnmanageChild(XmMessageBoxGetChild(smDD.newProfile,
1901 XmDIALOG_CANCEL_BUTTON));
1904 * Now add in the callback and get out of here
1906 XtAddCallback (smDD.newProfile, XmNokCallback,
1907 SimpleOK, smDD.newProfile);
1908 XmStringFree(newProfileString);
1910 XtManageChild(smDD.newProfile);
1913 } /* END OF FUNCTION WarnNewProfile */
1919 /*************************************<->*************************************
1921 * ConfirmSessionCreation () -
1932 * Returns True if the user says to continue the session; False otherwise
1933 * or if malloc fails;
1938 *************************************<->***********************************/
1940 ConfirmSessionCreation (
1946 XmString title_string;
1948 XmString cancel_string;
1949 XmString help_string;
1950 XmString msg_string;
1956 Dimension width, height;
1963 * Create temporary argv because the X toolkit may remove
1964 * pieces of the command line options.
1967 argv = (char **) XtMalloc (_argc * sizeof (char *));
1968 for (i = 0; i < _argc; i++)
1972 if (session_type == HOME_SESSION)
1973 pch1 = strdup ((char *) GETMESSAGE(18, 50, "Home"));
1975 pch1 = strdup ((char *) GETMESSAGE(18, 51, "Current"));
1977 PrintError(DtError, smNLS.cantMallocErrorString);
1981 pch2 = strdup ((char *) GETMESSAGE(18, 52,
1982 "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."));
1984 PrintError(DtError, smNLS.cantMallocErrorString);
1988 pch3 = XtMalloc (strlen (pch1) +
1989 strlen (XDisplayName (getenv("DISPLAY"))) +
1993 PrintError(DtError, smNLS.cantMallocErrorString);
1996 (void) sprintf (pch3, pch2, pch1, XDisplayName (getenv("DISPLAY")));
1999 * The X toolkit has not yet been initialized, so do it now.
2002 XtToolkitInitialize ();
2003 smGD.appCon = XtCreateApplicationContext();
2004 smGD.display = XtOpenDisplay(smGD.appCon, NULL, argv[0],
2005 SM_RESOURCE_CLASS, NULL, 0, &argc, argv);
2007 XtSetArg(args[j], XmNbackground,
2008 XBlackPixel(smGD.display, XDefaultScreen(smGD.display))); j++;
2009 XtSetArg(args[j], XmNmappedWhenManaged, False); j++;
2010 XtSetArg (args[j], XmNwidth, 1); j++;
2011 XtSetArg (args[j], XmNheight, 1); j++;
2012 tmp_widget = XtAppCreateShell (
2014 applicationShellWidgetClass,
2015 smGD.display, args, j);
2016 XtRealizeWidget(tmp_widget);
2019 * Create the compound strings for the confirmation dialog
2021 msg_string = XmStringCreateLocalized (pch3);
2022 title_string = XmStringCreateLocalized(pch3);
2024 ok_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
2025 cancel_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 40, "Cancel")));
2026 help_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
2028 free (pch1); free (pch2); XtFree (pch3);
2031 * Create the dialog box
2034 XtSetArg (uiArgs[i], XmNmessageString, msg_string); i++;
2035 XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
2036 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
2037 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
2038 XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
2039 XtSetArg (uiArgs[i], XmNtitle, title_string); i++;
2040 XtSetArg (uiArgs[i], XmNokLabelString, ok_string); i++;
2041 XtSetArg (uiArgs[i], XmNcancelLabelString, cancel_string); i++;
2042 XtSetArg (uiArgs[i], XmNhelpLabelString, help_string); i++;
2043 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
2045 smDD.confirmSession = XmCreateWarningDialog(
2046 tmp_widget, "confirmDialog", uiArgs, i);
2048 XtAddCallback (smDD.confirmSession, XmNokCallback,
2052 * Some help state is not yet initialized and the help
2053 * callback assumes it is so some initializations must
2056 smDD.smHelpDialog = NULL;
2057 smDD.okString = ok_string;
2058 smGD.topLevelWid = tmp_widget;
2060 XtAddCallback (smDD.confirmSession, XmNhelpCallback,
2061 TopicHelpRequested, HELP_CONFIRMATION_SESSION_STR);
2063 XtAddCallback (smDD.confirmSession, XmNcancelCallback,
2064 ConfirmCancelCB, NULL);
2066 XtManageChild(smDD.confirmSession);
2069 * Center the dialog on the display
2072 XtSetArg(uiArgs[i], XmNwidth, &width); i++;
2073 XtSetArg(uiArgs[i], XmNheight, &height); i++;
2074 XtGetValues(smDD.confirmSession, uiArgs, i);
2076 x = (DisplayWidth(smGD.display, XDefaultScreen(smGD.display)) / 2)
2078 y = (DisplayHeight(smGD.display, XDefaultScreen(smGD.display)) / 2)
2082 XtSetArg(uiArgs[i], XmNx, x); i++;
2083 XtSetArg(uiArgs[i], XmNy, y); i++;
2084 XtSetValues(smDD.confirmSession, uiArgs, i);
2086 XmStringFree (msg_string);
2087 XmStringFree (title_string);
2088 XmStringFree (cancel_string);
2089 XmStringFree (help_string);
2092 * Spin until the OK or Cancel CB is invoked
2094 confirmState = ConfirmationNone;
2096 XtAppNextEvent(smGD.appCon, &next);
2098 XtDispatchEvent(&next);
2099 if (confirmState == ConfirmationOK) {
2100 XtDestroyWidget (tmp_widget);
2101 XmStringFree (ok_string);
2104 else if (confirmState == ConfirmationCancel) {
2105 XtDestroyWidget (tmp_widget);
2106 XmStringFree (ok_string);
2113 /*************************************<->*************************************
2117 *************************************<->***********************************/
2121 XtPointer client_data,
2122 XtPointer call_data )
2124 XtUnmanageChild(smDD.confirmSession);
2125 confirmState = ConfirmationOK;
2129 /*************************************<->*************************************
2131 * ConfirmCancelCB ()
2133 *************************************<->***********************************/
2137 XtPointer client_data,
2138 XtPointer call_data )
2140 XtUnmanageChild(smDD.confirmSession);
2141 confirmState = ConfirmationCancel;
2145 /*************************************<->*************************************
2147 * PostXSMPFailureDialog () -
2158 * Returns True if the user says to continue the session; False otherwise
2159 * or if malloc fails;
2164 *************************************<->***********************************/
2166 PostXSMPFailureDialog (
2167 XSMPFailure failure_code,
2168 Boolean check_errorlog)
2172 XmString help_string;
2173 XmString msg_string;
2181 Dimension width, height;
2186 pch1 = strdup ((char *) GETMESSAGE(40, 1,
2187 "A session cannot be started because of the\nfollowing error:"));
2189 PrintError(DtError, smNLS.cantMallocErrorString);
2193 switch (failure_code) {
2194 case XSMP_FAILURE_SMS_INITIALIZE:
2195 pch2 = strdup ((char *) GETMESSAGE (40, 2,
2196 "SmsInitialize failed."));
2198 case XSMP_FAILURE_ICE_LISTEN:
2199 pch2 = strdup ((char *) GETMESSAGE (40, 3,
2200 "IceListenForConnections failed."));
2202 case XSMP_FAILURE_AUTHENTICATION:
2203 pch2 = strdup ((char *) GETMESSAGE (40, 4,
2204 "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."));
2206 case XSMP_FAILURE_ICE_ADD_WATCH:
2207 pch2 = strdup ((char *) GETMESSAGE (40, 5,
2208 "IceAddConnectionWatch failed."));
2210 case XSMP_FAILURE_ICE_COMPOSE_IDS:
2211 pch2 = strdup ((char *) GETMESSAGE (40, 6,
2212 "IceComposeNetworkIds failed."));
2214 case XSMP_FAILURE_MALLOC:
2215 pch2 = strdup ((char *) GETMESSAGE (40, 7,
2216 "Could not create the SESSION_MANAGER environment variable."));
2220 PrintError(DtError, smNLS.cantMallocErrorString);
2224 pch3 = strdup ((char *) GETMESSAGE(18, 70,
2225 "See the following for more information:"));
2227 PrintError(DtError, smNLS.cantMallocErrorString);
2231 pch4 = strdup ((char *) GETMESSAGE(18, 71,
2232 "CDE Advanced Users and System's Administration Guide"));
2234 PrintError(DtError, smNLS.cantMallocErrorString);
2238 error_file = XtMalloc(MAXPATHLEN+1);
2239 strcpy (error_file, "");
2241 /* JET - VU#497553 */
2246 if (home = getenv ("HOME"))
2248 len = strlen(home) +
2249 strlen(DtPERSONAL_CONFIG_DIRECTORY) +
2250 strlen(DtERRORLOG_FILE);
2252 if (len > MAXPATHLEN)
2253 error_file = XtRealloc(error_file, len + 1);
2255 sprintf (error_file, "%s/%s/%s", home,
2256 DtPERSONAL_CONFIG_DIRECTORY,
2261 pch5 = XtMalloc (strlen (pch1) + strlen (pch2) + strlen (pch3) + strlen (pch4) +
2262 strlen (error_file) + 15);
2264 PrintError(DtError, smNLS.cantMallocErrorString);
2267 (void) sprintf (pch5, "%s\n\n %s\n\n%s\n\n %s\n %s\n",
2268 pch1, pch2, pch3, pch4, error_file);
2273 * No top level widget has been created so must create one now.
2276 XtSetArg (args[j], XmNbackground, XBlackPixel(smGD.display,
2277 XDefaultScreen(smGD.display))); j++;
2278 XtSetArg (args[j], XmNmappedWhenManaged, False); j++;
2279 XtSetArg (args[j], XmNwidth, 1); j++;
2280 XtSetArg (args[j], XmNheight, 1); j++;
2282 smGD.topLevelWid = XtAppCreateShell (SM_RESOURCE_NAME,
2283 SM_RESOURCE_CLASS, applicationShellWidgetClass,
2284 smGD.display, args, j);
2286 XtRealizeWidget(smGD.topLevelWid);
2289 * Create the compound strings for the confirmation dialog
2291 msg_string = XmStringCreateLocalized (pch5);
2293 ok_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
2294 help_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
2296 free (pch1); free (pch2); free (pch3); free (pch4); XtFree (pch5);
2299 * Create the dialog box
2302 XtSetArg (uiArgs[i], XmNmessageString, msg_string); i++;
2303 XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
2304 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
2305 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
2306 XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
2307 XtSetArg (uiArgs[i], XmNokLabelString, ok_string); i++;
2308 XtSetArg (uiArgs[i], XmNhelpLabelString, help_string); i++;
2309 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
2311 smDD.confirmSession = XmCreateWarningDialog(
2312 smGD.topLevelWid, "confirmDialog", uiArgs, i);
2314 XtAddCallback (smDD.confirmSession, XmNokCallback,
2315 XSMPFailureOKCB, NULL);
2318 * Some help state is not yet initialized and the help
2319 * callback assumes it is so some initializations must
2322 smDD.smHelpDialog = NULL;
2323 smDD.okString = ok_string;
2325 XtAddCallback (smDD.confirmSession, XmNhelpCallback,
2326 TopicHelpRequested, HELP_XSMP_INIT_FAILURE_STR);
2328 XtUnmanageChild(XmMessageBoxGetChild(smDD.confirmSession,
2329 XmDIALOG_CANCEL_BUTTON));
2331 XtManageChild(smDD.confirmSession);
2334 * Center the dialog on the display
2337 XtSetArg(uiArgs[i], XmNwidth, &width); i++;
2338 XtSetArg(uiArgs[i], XmNheight, &height); i++;
2339 XtGetValues(smDD.confirmSession, uiArgs, i);
2341 x = (DisplayWidth(smGD.display, XDefaultScreen(smGD.display)) / 2)
2343 y = (DisplayHeight(smGD.display, XDefaultScreen(smGD.display)) / 2)
2347 XtSetArg(uiArgs[i], XmNx, x); i++;
2348 XtSetArg(uiArgs[i], XmNy, y); i++;
2349 XtSetValues(smDD.confirmSession, uiArgs, i);
2351 XmStringFree (msg_string);
2352 XmStringFree (help_string);
2355 * Spin until the OK CB is invoked
2358 XtAppNextEvent(smGD.appCon, &next);
2360 XtDispatchEvent(&next);
2365 /*************************************<->*************************************
2367 * XSMPFailureOKCB ()
2369 *************************************<->***********************************/
2373 XtPointer client_data,
2374 XtPointer call_data )
2376 XtUnmanageChild(smDD.confirmSession);
2383 /*************************************<->*************************************
2385 * PostSaveSessionErrorDialog
2389 * Let the user know that the Save_Session message does not have the
2390 * required data and the session will not be saved.
2398 *************************************<->***********************************/
2400 PostSaveSessionErrorDialog ( void )
2403 XmString messageString;
2406 if(smDD.saveSession == NULL)
2408 messageString = XmStringCreateLocalized (((char *) GETMESSAGE(18, 56,
2409 "The session cannot be saved because the required\n\
2410 'save_type' parameter was not in the message.\n\n\
2411 The session will not be saved.")));
2413 titleString = GETMESSAGE(18, 55, "Save Session Failure");
2416 XtSetArg (uiArgs[i], XmNmessageString, messageString); i++;
2417 XtSetArg (uiArgs[i], XmNallowShellResize, True); i++;
2418 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
2419 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
2420 XtSetArg (uiArgs[i], XmNtitle, titleString); i++;
2421 XtSetArg (uiArgs[i], XmNokLabelString, smDD.okString); i++;
2422 XtSetArg (uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
2423 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
2425 smDD.saveSession = XmCreateErrorDialog(smGD.topLevelWid,
2426 "sessionSaveDialog", uiArgs, i);
2429 XtSetArg (uiArgs[i], XmNuseAsyncGeometry, True);i++;
2430 XtSetArg (uiArgs[i], XmNmwmFunctions, 0);i++;
2431 XtSetArg (uiArgs[i], XmNmwmDecorations,
2432 (MWM_DECOR_TITLE | MWM_DECOR_BORDER)); i++;
2433 XtSetArg (uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
2435 XtSetValues(XtParent(smDD.saveSession), uiArgs, i);
2437 XtAddCallback (XtParent(smDD.saveSession),
2438 XmNpopupCallback, DialogUp, NULL);
2440 XtUnmanageChild (XmMessageBoxGetChild(smDD.saveSession,
2441 XmDIALOG_CANCEL_BUTTON));
2443 XtAddCallback (smDD.saveSession, XmNokCallback,
2444 SimpleOK, (XtPointer) smDD.saveSession);
2446 XtAddCallback (smDD.saveSession, XmNhelpCallback,
2447 TopicHelpRequested, HELP_SESSION_SAVE_ERROR_STR);
2449 XmStringFree(messageString);
2452 XtManageChild(smDD.saveSession);
2459 /*************************************<->*************************************
2461 * PostReasonsDialog - posts a Warning dialog on behalf of a client
2462 * that supplied a "reason" when it closed its connection
2470 *************************************<->***********************************/
2476 Boolean waitForResponse)
2480 XmString helpString;
2490 str1 = strdup ((char *) GETMESSAGE(40, 28,
2491 "Application '%s'\nexited for the following reason:\n\n%s"));
2493 PrintError(DtError, smNLS.cantMallocErrorString);
2497 for (i = 0, len = 0; i < numMsgs; i++)
2498 len += strlen (message[i]);
2500 str2 = XtMalloc (len + (numMsgs * 3) + 1);
2502 PrintError(DtError, smNLS.cantMallocErrorString);
2506 for (i = 0; i < numMsgs; i++) {
2507 strcat (str2, message[i]);
2508 strcat (str2, "\n");
2511 str3 = XtMalloc (strlen (str1) + strlen (str2) + strlen (progName) + 4);
2513 PrintError(DtError, smNLS.cantMallocErrorString);
2516 (void) sprintf (str3, str1, progName, str2);
2518 DtMsgLogMessage (smGD.programName, DtMsgLogWarning, str3);
2521 str1 = strdup ((char *) GETMESSAGE(40, 29,
2522 "Application Close Reasons"));
2524 PrintError(DtError, smNLS.cantMallocErrorString);
2528 msgString = XmStringCreateLocalized (str3);
2530 okString = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
2532 helpString = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
2535 * Create the dialog box
2538 XtSetArg (uiArgs[i], XmNmessageString, msgString); i++;
2539 XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
2540 XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
2541 XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
2542 XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
2543 XtSetArg (uiArgs[i], XmNtitle, str1); i++;
2544 XtSetArg (uiArgs[i], XmNokLabelString, okString); i++;
2545 XtSetArg (uiArgs[i], XmNhelpLabelString, helpString); i++;
2546 XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
2548 smDD.clientReasons = XmCreateWarningDialog(smGD.topLevelWid,
2549 "clientReasons", uiArgs, i);
2552 XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
2553 XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
2554 XtSetArg(uiArgs[i], XmNmwmDecorations,
2555 (MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
2556 XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
2557 XtSetValues(XtParent(smDD.clientReasons), uiArgs, i);
2559 XtAddCallback (XtParent(smDD.clientReasons),
2560 XmNpopupCallback, DialogUp, NULL);
2562 XtUnmanageChild (XmMessageBoxGetChild (smDD.clientReasons,
2563 XmDIALOG_CANCEL_BUTTON));
2566 * Now add in the callback and get out of here
2568 XtAddCallback (smDD.clientReasons, XmNokCallback,
2569 SimpleOK, (XtPointer) smDD.clientReasons);
2571 XtAddCallback (smDD.clientReasons, XmNhelpCallback,
2572 TopicHelpRequested, HELP_APP_CLOSE_REASONS_STR);
2577 XmStringFree (msgString);
2578 XmStringFree (okString);
2579 XmStringFree (helpString);
2581 XtManageChild (smDD.clientReasons);
2584 * Spin until the OK callback is invoked. If a shutdown
2585 * is in progress, we don't want to return until the
2586 * user has acknowledged this message.
2588 reasonsDialogOK = False;
2589 if (waitForResponse) {
2591 XtAppNextEvent (smGD.appCon, &next);
2593 XtDispatchEvent(&next);
2594 if (reasonsDialogOK == True)
2601 /*************************************<->*************************************
2607 * Timeout procedure that is invoked when a save timer expires.
2615 *************************************<->***********************************/
2618 XtPointer client_data,
2623 if (smXSMP.saveState.shutdownCanceled == False) {
2625 * Run the user's exit script if there is one
2627 if (smGD.compatMode == False)
2628 StartEtc(True); /* run sessionexit */
2630 _DtReleaseLock(smGD.display, SM_RUNNING_LOCK);