1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00
cde/cde/programs/dtsession/SmUI.c
2014-12-27 19:52:37 -07:00

2633 lines
72 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these librararies and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $TOG: SmUI.c /main/32 1998/07/23 18:08:17 mgreess $ */
/* *
* (c) Copyright 1993, 1994 Hewlett-Packard Company *
* (c) Copyright 1993, 1994 International Business Machines Corp. *
* (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
* (c) Copyright 1993, 1994 Novell, Inc. *
*/
/*************************************<+>*************************************
*****************************************************************************
**
** File: SmUI.c
**
** Project: DT Session Manager (dtsession)
**
** Description:
** -----------
** This file handles all UI components of the session manager. This
** includes all dialog boxes. The session manager does not handle its
** representations in the front panel and customizer. That is handled
** by those tools.
**
**
**
*******************************************************************
** (c) Copyright Hewlett-Packard Company, 1990. All rights are
** reserved. Copying or other reproduction of this program
** except for archival purposes is prohibited without prior
** written consent of Hewlett-Packard Company.
********************************************************************
**
**
**
*****************************************************************************
*************************************<+>*************************************/
#include <signal.h>
#include <stdio.h>
#include <sys/param.h>
#include <X11/Intrinsic.h>
#include <Xm/MwmUtil.h>
#include <Xm/Xm.h>
#include <Xm/PushB.h>
#include <Xm/Form.h>
#include <Xm/Label.h>
#include <Xm/LabelG.h>
#include <Xm/DrawingA.h>
#include <Xm/Frame.h>
#include <Xm/Separator.h>
#include <Xm/MessageB.h>
#include <Xm/DialogS.h>
#include <Xm/Text.h>
#include <Dt/DtP.h>
#include <Dt/SessionM.h>
#include <Dt/Icon.h>
#include <Dt/MsgLog.h>
#include <Dt/Lock.h>
#include <Tt/tttk.h>
#include "Sm.h"
#include "SmUI.h"
#include "SmSave.h"
#include "SmRestore.h"
#include "SmHelp.h"
#include "SmGlobals.h"
#ifdef USE_XINERAMA
#include <DtXinerama.h>
#endif
typedef enum {
ConfirmationNone,
ConfirmationOK,
ConfirmationCancel,
ConfirmationHelp
} ConfirmState;
ConfirmState confirmState;
/*
* #define statements
*/
#define PASSWORD_INDICATOR " "
typedef struct _ExitRecord {
Tt_message *pmsg;
union {
Widget exitCancelledDialog;
int queryExitConfirmedMode;
} u;
Boolean doSave;
} ExitRecord;
/*
* Global variables
*/
DialogData smDD;
Arg uiArgs[20];
/*
* Local Function Declarations
*/
static int CompatModeExit( void ) ;
static void ExitConfirmed( Widget, XtPointer, XtPointer ) ;
static void ExitCancelled( Widget, XtPointer, XtPointer ) ;
static void LockDialogUp( Widget, XtPointer, XtPointer ) ;
static void SimpleOK( Widget, XtPointer, XtPointer ) ;
static void ConfirmOKCB ( Widget, XtPointer, XtPointer ) ;
static void ConfirmCancelCB ( Widget, XtPointer, XtPointer ) ;
static void ConfirmHelpCB ( Widget, XtPointer, XtPointer ) ;
static void XSMPFailureOKCB( Widget w, XtPointer client_data, XtPointer call_data );
static void SaveTimeout( XtPointer , XtIntervalId *) ;
/*
* Local vars
*/
static Boolean session_confirmed = False;
static Boolean reasonsDialogOK;
static Boolean saveTimeout;
/*************************************<->*************************************
*
* CreateLockDialog ()
*
*
* Description:
* -----------
* Create the lock dialog when it exists NOT as a part of a cover
*
*
* Inputs:
* ------
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
Widget
CreateLockDialog( void )
{
int i, slen;
Widget loginLabel, instructLabel, tmpLock, indFrame;
Widget passwdLabel, passwdForm, picFrame, loginPic, loginFrame;
Dimension width; /* width, height of login label */
XmString lockString, passwordString;
char *lockMessage;
char *envLog;
Pixel fg, bg, focus_color; /* foreground, background colors */
i = 0;
XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
XtSetArg(uiArgs[i], XmNmarginWidth, 0); i++;
XtSetArg(uiArgs[i], XmNmarginHeight, 0); i++;
XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
XtSetArg(uiArgs[i], XmNshadowThickness,5); i++;
XtSetArg(uiArgs[i], XmNunitType, XmPIXELS); i++;
XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
XtSetArg(uiArgs[i], XmNmappedWhenManaged, True); i++;
tmpLock = XmCreateFormDialog(smGD.topLevelWid, "lockDialog", uiArgs, i);
XtAddCallback (XtParent(tmpLock), XmNpopupCallback,
LockDialogUp, NULL);
smDD.matte[0] = tmpLock;
i = 0;
XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
XtSetArg(uiArgs[i], XmNmwmDecorations, 0);i++;
XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
XtSetValues(XtParent(tmpLock), uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
picFrame = XmCreateFrame(tmpLock, "picFrame", uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNforeground, &fg); i++;
XtSetArg(uiArgs[i], XmNbackground, &bg); i++;
XtGetValues(tmpLock, uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNfillMode, XmFILL_SELF); i++;
XtSetArg(uiArgs[i], XmNbehavior, XmICON_LABEL); i++;
XtSetArg(uiArgs[i], XmNpixmapForeground, fg); i++;
XtSetArg(uiArgs[i], XmNpixmapBackground, bg); i++;
XtSetArg(uiArgs[i], XmNstring, NULL); i++;
XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
XtSetArg(uiArgs[i], XmNtraversalOn, False); i++;
loginPic = _DtCreateIcon(picFrame, "lockLabelPixmap", uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
XtSetArg(uiArgs[i], XmNrightOffset, 0); i++;
XtSetArg(uiArgs[i], XmNrightWidget, loginPic); i++;
loginFrame = XmCreateFrame(tmpLock, "loginFrame", uiArgs, i);
/*
* create the login matte...
*/
i = 0;
XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
smDD.loginMatte[0] = XmCreateForm(loginFrame, "loginMatte", uiArgs, i);
/*
* create the login/password forms
*/
i = 0;
XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNbottomPosition, 50); i++;
XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
smDD.loginForm[0] = XmCreateForm(smDD.loginMatte[0], "loginForm", uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNtopPosition, 50); i++;
XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(uiArgs[i], XmNleftWidget, smDD.loginForm[0]); i++;
XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(uiArgs[i], XmNrightWidget, smDD.loginForm[0]); i++;
passwdForm = XmCreateForm(smDD.loginMatte[0], "passwdForm", uiArgs, i);
/*
* create the login/password labels...
*/
i = 0;
envLog = getenv("LOGNAME");
slen = 100 + strlen(envLog) + 1;
lockMessage = XtCalloc(1, slen);
snprintf(lockMessage, slen - 1,
(char*) GETMESSAGE(18, 1, "Display locked by user %s."), envLog);
lockString = XmStringCreateLocalized(lockMessage);
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
loginLabel = XmCreateLabelGadget(smDD.loginForm[0],
"loginLabel", uiArgs, i);
XtManageChild(loginLabel);
XmStringFree(lockString);
XtFree(lockMessage);
i = 0;
lockString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 2, "Enter password to unlock.")));
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
XtSetArg(uiArgs[i], XmNtopWidget, loginLabel); i++;
XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
instructLabel = XmCreateLabelGadget(smDD.loginForm[0], "instructLabel",
uiArgs, i);
XtManageChild(instructLabel);
XmStringFree(lockString);
i = 0;
passwordString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 3, "Password: ")));
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
passwdLabel = XmCreateLabelGadget(passwdForm,
"passwdLabel", uiArgs, i);
XtManageChild(passwdLabel);
XmStringFree(passwordString);
/*
* Give the password label an offset
*/
i = 0;
XtSetArg(uiArgs[i], XmNwidth, &width);i++;
XtGetValues(passwdLabel, uiArgs, i);
i = 0;
width += (width/6);
XtSetArg(uiArgs[i], XmNwidth, width);i++;
XtSetArg(uiArgs[i], XmNrecomputeSize, False);i++;
XtSetValues(passwdLabel, uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_IN); i++;
XtSetArg(uiArgs[i], XmNshadowThickness, 1); i++;
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
XtSetArg(uiArgs[i], XmNleftWidget, passwdLabel); i++;
XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNrightOffset, 10); i++;
XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
indFrame = XmCreateFrame(passwdForm, "indFrame", uiArgs, i);
i = 0;
passwordString = XmStringCreateLocalized("|");
XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_BEGINNING); i++;
smDD.indLabel[0] = XmCreateLabel(indFrame, "indLabel",
uiArgs, i);
XtManageChild(smDD.indLabel[0]);
XmStringFree(passwordString);
i = 0;
XtSetArg(uiArgs[i], XmNhighlightColor, &focus_color); i++;
XtGetValues(indFrame, uiArgs, i);
XtVaSetValues ( smDD.indLabel[0],
XmNborderWidth, 2,
XmNborderColor, focus_color,
NULL );
/*
* Manage forms AFTER all children have been managed
*/
XtManageChild(indFrame);
XtManageChild(passwdForm);
XtManageChild(smDD.loginForm[0]);
XtManageChild(smDD.loginMatte[0]);
XtManageChild(loginPic);
XtManageChild(picFrame);
XtManageChild(loginFrame);
return(tmpLock);
}
/*************************************<->*************************************
*
* ExitSession ()
*
*
* Description:
* -----------
* Determines which exit routines get called when an exit request is made
* of the session manager.
* If smGD.bmsDead == false, we just exit.
* If ASK_STATE is turned on, the query dialog is
* put up, if VERBOSE is on, confirm exit in current mode (restart or reset)
* if confirmation is turned off - exit immediately.
*
*
* Inputs:
* ------
* msg -- if non-zero, Session_Exit request to reply/fail && destroy
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
void
ExitSession(
Tt_message msg)
{
if (smGD.bmsDead == True)
{
ImmediateExit(-1, msg, True);
}
if(smGD.compatMode == True)
{
if (msg != 0) {
tt_message_reply( msg );
tt_message_destroy( msg );
}
CompatModeExit();
}
else
{
if(smSettings.confirmMode == DtSM_VERBOSE_MODE ||
smSettings.startState == DtSM_ASK_STATE)
{
ConfirmExit( msg, True );
}
else
{
ImmediateExit(smSettings.startState, msg, True);
}
}
}
/*************************************<->*************************************
*
* ConfirmExit ()
*
*
* Description:
* -----------
* Create the exit confirmation dialog box (if it hasn't been) and confirm
* that the user wants to exit the session. This routine only gets called
* when the user hasn't turned of exit confirmation and is not in ASK mode
*
*
* Inputs:
* ------
* msg -- if non-zero, Session_Exit request to reply/fail && destroy
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
int
ConfirmExit(
Tt_message msg,
Boolean doSave)
{
int i;
String tmpString;
ExitRecord *exitRec;
Tt_message *pmsg;
static XmString homeToHome; /* started Home, restore to Home */
static XmString returnToCurrent; /* started Home or Current but
retrun to Current */
static XmString currentToHome; /* started Current, return to Home */
if(smDD.confExit == NULL)
{
/*
* Create all compound strings for confirmation dialogs
*/
returnToCurrent = XmStringCreateLocalized(((char *)GETMESSAGE(18, 4,
"Exiting the desktop session...\n\n\
Your Current session will be restored upon login.\n\n\
Application updates you have not saved will be lost.\n\n\
Continue Logout?")));
homeToHome = XmStringCreateLocalized(((char *)GETMESSAGE(18, 5,
"Exiting the desktop session...\n\n\
Your Home session will be restored upon login.\n\
Your Current session will not be saved.\n\n\
Application updates you have not saved will be lost.\n\n\
Continue Logout?")));
currentToHome = XmStringCreateLocalized(((char *)GETMESSAGE(18, 75,
"Exiting the desktop session...\n\n\
Your Current session will be saved but your Home\n\
session will be restored upon login.\n\n\
Application updates you have not saved will be lost.\n\n\
Continue Logout?")));
/*
* Build up the correct string for this dialog
*/
i = 0;
if (smGD.sessionType == HOME_SESSION &&
smSettings.startState == DtSM_HOME_STATE)
{
XtSetArg(uiArgs[i], XmNmessageString, homeToHome); i++;
}
else if (smGD.sessionType == CURRENT_SESSION &&
smSettings.startState == DtSM_HOME_STATE)
{
XtSetArg(uiArgs[i], XmNmessageString, currentToHome); i++;
}
else
{
XtSetArg(uiArgs[i], XmNmessageString, returnToCurrent); i++;
}
/*
* Now create the dialog box
*/
tmpString = GETMESSAGE(18, 6, "Logout Confirmation");
XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_CENTER); i++;
XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
XtSetArg(uiArgs[i], XmNokLabelString, smDD.okLogoutString); i++;
XtSetArg(uiArgs[i], XmNcancelLabelString, smDD.cancelLogoutString); i++;
XtSetArg(uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
pmsg = (Tt_message *)XtMalloc(sizeof(Tt_message));
XtSetArg(uiArgs[i], XmNuserData, pmsg); i++;
smDD.confExit = XmCreateWarningDialog(smGD.topLevelWid, "exitDialog",
uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
XtSetArg(uiArgs[i], XmNmwmDecorations,
(MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
XtSetValues(XtParent(smDD.confExit), uiArgs, i);
exitRec = (ExitRecord *)XtMalloc( sizeof(ExitRecord) );
exitRec->pmsg = pmsg;
exitRec->doSave = doSave;
XtAddCallback (smDD.confExit, XmNokCallback, ExitConfirmed, exitRec);
#ifndef NO_XVH
XtAddCallback (smDD.confExit, XmNhelpCallback,
TopicHelpRequested, HELP_LOGOUT_STR);
#endif
exitRec = (ExitRecord *)XtMalloc( sizeof(ExitRecord) );
exitRec->pmsg = pmsg;
exitRec->doSave = doSave;
exitRec->u.exitCancelledDialog = smDD.confExit;
XtAddCallback (smDD.confExit, XmNcancelCallback,
ExitCancelled, exitRec);
}
else
{
/*
* The user may have changed the type of session to be
* restored so must update the dialog's message.
*/
i = 0;
if (smGD.sessionType == HOME_SESSION &&
smSettings.startState == DtSM_HOME_STATE)
{
XtSetArg(uiArgs[i], XmNmessageString, homeToHome); i++;
}
else if (smGD.sessionType == CURRENT_SESSION &&
smSettings.startState == DtSM_HOME_STATE)
{
XtSetArg(uiArgs[i], XmNmessageString, currentToHome); i++;
}
else
{
XtSetArg(uiArgs[i], XmNmessageString, returnToCurrent); i++;
}
XtSetValues(smDD.confExit, uiArgs, i);
}
/*
* Refresh buffer containing pointer to Tt_message.
*/
i=0;
XtSetArg(uiArgs[i], XmNuserData, &pmsg); i++;
XtGetValues(smDD.confExit, uiArgs, i);
*pmsg = msg;
XtAddCallback (XtParent(smDD.confExit), XmNpopupCallback, DialogUp, NULL);
XtManageChild(smDD.confExit);
return(0);
}
/*************************************<->*************************************
*
* WarnMsgFailue ()
*
*
* Description:
* -----------
* Let the user know that the bms has died and that the current session
* will not be saved.
*
*
* Inputs:
* ------
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
int
WarnMsgFailure( void )
{
int i;
XmString bmsDeadString;
String tmpString;
if(smDD.deadWid == NULL)
{
bmsDeadString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 38,
"Messaging System Inoperative\n\n\
To restart:\n\n1) Save all open data files.\n\
2) Logout.\n\
3) Log in again.\n\nNote: The current session will not be saved.\n\n\
When you are ready to begin the restart process, click [OK] and\n\
proceed to save your files.")));
/*
* Now create the dialog box
*/
i = 0;
tmpString = GETMESSAGE(18, 12, "Message Failure");
XtSetArg(uiArgs[i], XmNmessageString, bmsDeadString);i++;
XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
XtSetArg(uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
smDD.deadWid = XmCreateWarningDialog(smGD.topLevelWid, "deadDialog",
uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
XtSetArg(uiArgs[i], XmNmwmDecorations,
(MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
XtSetValues(XtParent(smDD.deadWid), uiArgs, i);
XtAddCallback (XtParent(smDD.deadWid),
XmNpopupCallback, DialogUp, NULL);
XtUnmanageChild(XmMessageBoxGetChild(smDD.deadWid,
XmDIALOG_CANCEL_BUTTON));
/*
* Now add in the callback and get out of here
*/
XtAddCallback (smDD.deadWid, XmNokCallback,
SimpleOK, (XtPointer) smDD.deadWid);
#ifndef NO_XVH
XtAddCallback (smDD.deadWid, XmNhelpCallback,
TopicHelpRequested, HELP_BMS_DEAD_STR);
#endif
XtAddCallback (smDD.deadWid, XmNcancelCallback,
NULL, NULL);
XmStringFree(bmsDeadString);
}
XtManageChild(smDD.deadWid);
return(0);
}
/*************************************<->*************************************
*
* CompatModeExit ()
*
*
* Description:
* -----------
* Let the user know that the logout button can not be used to exit in
* compatibility mode.
*
*
* Inputs:
* ------
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
static int
CompatModeExit( void )
{
int i;
XmString compatModeString;
String tmpString;
if(smDD.compatExit == NULL)
{
compatModeString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 34,
"This session was started from an X Window System startup script.\n\n\
No session information will be saved.\n\nUse the reset key sequence to log out.")));
/*
* Now create the dialog box
*/
i = 0;
tmpString = GETMESSAGE(18, 35, "Logout Message");
XtSetArg(uiArgs[i], XmNmessageString, compatModeString);i++;
XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_CENTER); i++;
XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
XtSetArg(uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
smDD.compatExit = XmCreateInformationDialog(smGD.topLevelWid,
"compatDialog",
uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
XtSetArg(uiArgs[i], XmNmwmDecorations,
(MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
XtSetValues(XtParent(smDD.compatExit), uiArgs, i);
XtAddCallback (XtParent(smDD.compatExit),
XmNpopupCallback, DialogUp, NULL);
XtUnmanageChild(XmMessageBoxGetChild(smDD.compatExit,
XmDIALOG_CANCEL_BUTTON));
/*
* Now add in the callback and get out of here
*/
XtAddCallback (smDD.compatExit, XmNokCallback,
SimpleOK, smDD.compatExit);
#ifndef NO_XVH
XtAddCallback (smDD.compatExit, XmNhelpCallback,
TopicHelpRequested, HELP_LOGOUT_COMPAT_MODE_STR);
#endif
XmStringFree(compatModeString);
}
XtManageChild(smDD.compatExit);
return(0);
}
/*************************************<->*************************************
*
* CreateLockDialogWithCover()
*
*
* Description:
* -----------
* Create the lock dialog when it exists as a part of a cover
*
*
* Inputs:
* ------
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
Widget
CreateLockDialogWithCover(
Widget parent )
{
int i;
Widget loginLabel, instructLabel, tmpLock;
Widget indFrame, loginPic, picFrame, loginFrame;
Widget passwdLabel, passwdForm;
Dimension width; /* width, height of drop shadow */
XmString lockString, passwordString;
char *lockMessage;
char *envLog;
Pixel fg, bg, focus_color; /* foreground, background colors */
i = 0;
XtSetArg(uiArgs[i], XmNmarginWidth, 0); i++;
XtSetArg(uiArgs[i], XmNmarginHeight, 0); i++;
XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
XtSetArg(uiArgs[i], XmNshadowThickness,5); i++;
XtSetArg(uiArgs[i], XmNunitType, XmPIXELS); i++;
XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
XtSetArg(uiArgs[i], XmNmappedWhenManaged, False); i++;
tmpLock = XmCreateForm(parent, "lockDialog", uiArgs, i);
smDD.matte[1] = tmpLock;
i = 0;
XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
picFrame = XmCreateFrame(tmpLock, "picFrame", uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNforeground, &fg); i++;
XtSetArg(uiArgs[i], XmNbackground, &bg); i++;
XtGetValues(tmpLock, uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNfillMode, XmFILL_SELF); i++;
XtSetArg(uiArgs[i], XmNbehavior, XmICON_LABEL); i++;
XtSetArg(uiArgs[i], XmNpixmapForeground, fg); i++;
XtSetArg(uiArgs[i], XmNpixmapBackground, bg); i++;
XtSetArg(uiArgs[i], XmNstring, NULL); i++;
XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
XtSetArg(uiArgs[i], XmNtraversalOn, False); i++;
loginPic = _DtCreateIcon(picFrame, "lockLabelPixmap", uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_OUT); i++;
XtSetArg(uiArgs[i], XmNshadowThickness, 2); i++;
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNtopOffset, 15); i++;
XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNbottomOffset, 15); i++;
XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
XtSetArg(uiArgs[i], XmNrightWidget, picFrame); i++;
XtSetArg(uiArgs[i], XmNrightOffset, 0); i++;
loginFrame = XmCreateFrame(tmpLock, "loginFrame", uiArgs, i);
/*
* create the login matte...
*/
i = 0;
XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
smDD.loginMatte[1] = XmCreateForm(loginFrame, "loginMatte", uiArgs, i);
/*
* create the login/password forms
*/
i = 0;
XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNrightOffset, 15); i++;
XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNbottomPosition, 50); i++;
XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNleftOffset, 15); i++;
smDD.loginForm[1] = XmCreateForm(smDD.loginMatte[1], "loginForm", uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNtopPosition, 50); i++;
XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(uiArgs[i], XmNleftWidget, smDD.loginForm[1]); i++;
XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(uiArgs[i], XmNrightWidget, smDD.loginForm[1]); i++;
passwdForm = XmCreateForm(smDD.loginMatte[1], "passwdForm", uiArgs, i);
/*
* create the login/password labels...
*/
i = 0;
envLog = getenv("LOGNAME");
lockMessage = XtCalloc(1, 100 + strlen(envLog));
snprintf(lockMessage, 100 + strlen(envLog) - 1,
((char *)GETMESSAGE(18, 1, "Display locked by user %s.")), envLog);
lockString = XmStringCreateLocalized(lockMessage);
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
loginLabel = XmCreateLabelGadget(smDD.loginForm[1],
"loginLabel", uiArgs, i);
XtManageChild(loginLabel);
XmStringFree(lockString);
XtFree(lockMessage);
i = 0;
lockString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 2, "Enter password to unlock.")));
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
XtSetArg(uiArgs[i], XmNtopWidget, loginLabel); i++;
XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_CENTER); i++;
XtSetArg(uiArgs[i], XmNlabelString, lockString); i++;
instructLabel = XmCreateLabelGadget(smDD.loginForm[1], "instructLabel",
uiArgs, i);
XtManageChild(instructLabel);
XmStringFree(lockString);
i = 0;
passwordString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 3, "Password: ")));
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
XtSetArg(uiArgs[i], XmNleftOffset, 0); i++;
XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
passwdLabel = XmCreateLabelGadget(passwdForm,
"passwdLabel", uiArgs, i);
XtManageChild(passwdLabel);
XmStringFree(passwordString);
/*
* Give the password label an offset
*/
i = 0;
XtSetArg(uiArgs[i], XmNwidth, &width);i++;
XtGetValues(passwdLabel, uiArgs, i);
i = 0;
width += (width/6);
XtSetArg(uiArgs[i], XmNwidth, width);i++;
XtSetArg(uiArgs[i], XmNrecomputeSize, False);i++;
XtSetValues(passwdLabel, uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNshadowType, XmSHADOW_IN); i++;
XtSetArg(uiArgs[i], XmNshadowThickness, 1); i++;
XtSetArg(uiArgs[i], XmNtopAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNtopPosition, 20); i++;
XtSetArg(uiArgs[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
XtSetArg(uiArgs[i], XmNbottomPosition, 80); i++;
XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
XtSetArg(uiArgs[i], XmNleftWidget, passwdLabel); i++;
XtSetArg(uiArgs[i], XmNrightAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNrightOffset, 10); i++;
XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_END); i++;
indFrame = XmCreateFrame(passwdForm, "indFrame", uiArgs, i);
i = 0;
passwordString = XmStringCreateLocalized("|");
XtSetArg(uiArgs[i], XmNlabelString, passwordString); i++;
XtSetArg(uiArgs[i], XmNalignment, XmALIGNMENT_BEGINNING); i++;
smDD.indLabel[1] = XmCreateLabel(indFrame, "indLabel",
uiArgs, i);
XtManageChild(smDD.indLabel[1]);
XmStringFree(passwordString);
i = 0;
XtSetArg(uiArgs[i], XmNhighlightColor, &focus_color); i++;
XtGetValues(indFrame, uiArgs, i);
XtVaSetValues ( smDD.indLabel[1],
XmNborderWidth, 2,
XmNborderColor, focus_color,
NULL );
/*
* Manage forms AFTER all children have been managed
*/
XtManageChild(indFrame);
XtManageChild(passwdForm);
XtManageChild(smDD.loginForm[1]);
XtManageChild(smDD.loginMatte[1]);
XtManageChild(loginPic);
XtManageChild(picFrame);
XtManageChild(loginFrame);
return(tmpLock);
}
/*************************************<->*************************************
*
* CreateCoverDialog ()
*
*
* Description:
* -----------
* Create the cover dialogs for all the screens
*
*
* Inputs:
* ------
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
Widget
CreateCoverDialog(
int screenNum,
Boolean withLock )
{
int i;
Widget tmpCover, table;
char geomString[50];
sprintf(geomString, "%dx%d+0+0",
DisplayWidth(smGD.display, screenNum),
DisplayHeight(smGD.display, screenNum));
i = 0;
XtSetArg(uiArgs[i], XmNmwmDecorations, 0);i++;
XtSetArg(uiArgs[i], XmNgeometry, (String) geomString);i++;
XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
XtSetArg(uiArgs[i], XmNdepth, DefaultDepth(smGD.display, screenNum));i++;
XtSetArg(uiArgs[i], XmNscreen,
ScreenOfDisplay(smGD.display, screenNum));i++;
XtSetArg(uiArgs[i], XmNcolormap,
DefaultColormap(smGD.display, screenNum));i++;
tmpCover = XtCreatePopupShell("coverDialog", topLevelShellWidgetClass,
smGD.topLevelWid, uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNmarginWidth, 0); i++;
XtSetArg(uiArgs[i], XmNmarginHeight, 0); i++;
XtSetArg(uiArgs[i], XmNshadowThickness, 0); i++;
XtSetArg(uiArgs[i], XmNheight,
(Dimension) DisplayHeight(smGD.display, smGD.screen)); i++;
XtSetArg(uiArgs[i], XmNwidth,
(Dimension) DisplayWidth(smGD.display, smGD.screen)); i++;
XtSetArg(uiArgs[i], XmNresizePolicy, XmRESIZE_NONE);i++;
table = XmCreateDrawingArea(tmpCover, "drawArea", uiArgs, i);
XtManageChild(table);
smDD.coverDrawing[screenNum] = table;
if(withLock == True)
{
XtAddCallback (tmpCover, XmNpopupCallback,
LockDialogUp, NULL);
}
XtRealizeWidget(tmpCover);
return(tmpCover);
}
/*************************************<->*************************************
*
* ExitConfirmed ()
*
*
* Description:
* -----------
* Callback that is called when user confirms the exit of a session by
* pressing the OK button on the confirmation dialog. This routine just
* facilitates the exit process.
*
*
* Inputs:
* ------
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
static void
ExitConfirmed(
Widget w,
XtPointer client_data,
XtPointer call_data )
{
ExitRecord *exitRec = (ExitRecord *)client_data;
XtUnmanageChild(smDD.confExit);
ImmediateExit(smSettings.startState, *exitRec->pmsg, exitRec->doSave);
}
/*************************************<->*************************************
*
* ImmediateExit -
*
*
* Description:
* -----------
* This process puts in motion the exit procedure, and then exits.
*
*
* Inputs:
* ------
* mode = Whether this session should be reset or restarted
* msg -- if non-zero, Session_Exit request to reply/fail && destroy
* doSave - if True, the session will be saved.
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
void
ImmediateExit(
int mode,
Tt_message msg,
Boolean doSave)
{
long old;
Tt_message notice;
/*
* Turn off SIGTERM so we don't catch one in the middle of shutting
* down
*/
#if !defined(SVR4) && !defined(sco)
old = sigblock(sigmask(SIGTERM));
sigblock(sigmask(SIGHUP));
sigblock(sigmask(SIGPIPE));
#else
old = sighold(SIGTERM);
#endif
/*
*
*/
if(smGD.bmsDead == False)
{
notice = (Tt_message) tttk_message_create( NULL, TT_NOTICE, TT_SESSION, NULL,
"XSession_Ending", NULL);
tt_message_send( notice );
tt_message_destroy( notice );
}
if (msg != 0) {
tt_message_reply( msg );
tt_message_destroy( msg );
}
if (doSave)
{
XEvent next;
Tt_message msg;
int sessionType = smGD.sessionType;
XtIntervalId timerId;
msg = (Tt_message) tttk_message_create( NULL, TT_NOTICE, TT_SESSION, NULL,
"DtActivity_Beginning", NULL );
tt_message_send( msg );
tt_message_destroy( msg );
if (smGD.sessionType == CURRENT_SESSION ||
smGD.sessionType == DEFAULT_SESSION)
SaveState (False, DtSM_CURRENT_STATE, SmSaveLocal, True,
DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
else if (smGD.sessionType == HOME_SESSION &&
smSettings.startState == DtSM_CURRENT_STATE)
SaveState (False, DtSM_HOME_STATE, SmSaveLocal, True,
DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
else
SaveState (False, DtSM_HOME_STATE, SmSaveGlobal, True,
DEFAULT_INTERACT_STYLE, DEFAULT_FAST, DEFAULT_GLOBAL);
/*
* Restore sessionType - it may have been changed in SaveState
*/
smGD.sessionType = sessionType;
XSync(smGD.display, 0);
smGD.loggingOut = True;
/* JET - set this here so we don't exit prematurely (while
* handling our own SM exit callback - duh).
*/
smGD.ExitComplete = False;
saveTimeout = False;
timerId = XtAppAddTimeOut (smGD.appCon, smRes.saveYourselfTimeout,
SaveTimeout, NULL);
while (smXSMP.saveState.saveComplete == False &&
smXSMP.saveState.shutdownCanceled == False) {
if (saveTimeout)
break;
XtAppNextEvent(smGD.appCon, &next);
if (next.type != 0)
XtDispatchEvent(&next);
}
}
/* JET - need this, since dtsession was exiting in the
* XtAppNextEvent above (receiving it's own EXIT SM message) This
* is checked in SmExit() so exit's will only occur after this
* housekeeping has been completed.
*/
smGD.ExitComplete = True;
if (smXSMP.saveState.shutdownCanceled == False) {
/*
* Run the user's exit script if there is one
*/
if (smGD.compatMode == False)
{
StartEtc(True); /* run sessionexit */
}
_DtReleaseLock(smGD.display, SM_RUNNING_LOCK);
SM_EXIT(0);
}
}
/*************************************<->*************************************
*
* ExitCancelled ()
*
*
* Description:
* -----------
* Called when the user bails out from a logout at the confirmation dialog
*
*
* Inputs:
* ------
* client_data - tells which dialog to unmange (the query or confirm exit)
* msg -- if non-zero, Session_Exit request to reply/fail && destroy
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
static void
ExitCancelled(
Widget w,
XtPointer client_data,
XtPointer call_data )
{
ExitRecord *exitRec = (ExitRecord *)client_data;
if(XtIsManaged(exitRec->u.exitCancelledDialog))
{
XtUnmanageChild(exitRec->u.exitCancelledDialog);
}
if(smDD.smHelpDialog && XtIsManaged(smDD.smHelpDialog))
{
XtUnmanageChild(smDD.smHelpDialog);
}
if (*exitRec->pmsg != 0) {
tttk_message_fail(*exitRec->pmsg, TT_DESKTOP_ECANCELED, 0, 1 );
}
SetSystemReady();
}
/*************************************<->*************************************
*
* DialogUp ()
*
*
* Description:
* -----------
* Once the dialog is managed, but not popped up - reposition it so that
* it appears in the middle of the screen then remove the popup callback
*
*
* Inputs:
* ------
*
*
* Outputs:
* -------
* None
*
*
* Comments:
* --------
* This routine can be used for any generic SYSTEM_MODAL dialog
*
*************************************<->***********************************/
void
DialogUp(
Widget w,
XtPointer client_data,
XtPointer call_data )
{
int i;
Dimension width, height;
Position x, y;
unsigned int dpwidth, dpheight, xorg, yorg; /* JET - Xinerama */
/*
* Get the size of the dialog box - then compute its position
*/
i = 0;
XtSetArg(uiArgs[i], XmNwidth, &width);i++;
XtSetArg(uiArgs[i], XmNheight, &height);i++;
XtGetValues(w, uiArgs, i);
/* JET - get xinerama info */
#ifdef USE_XINERAMA
/* use the 'prefered' screen */
if (!_DtXineramaGetScreen(smGD.DtXineramaInfo,
smRes.xineramaPreferredScreen,
&dpwidth, &dpheight, &xorg, &yorg))
{ /* no joy here either - setup for normal */
dpwidth = DisplayWidth(smGD.display, smGD.screen);
dpheight = DisplayHeight(smGD.display, smGD.screen);
xorg = yorg = 0;
}
#else /* no Xinerama */
dpwidth = DisplayWidth(smGD.display, smGD.screen);
dpheight = DisplayHeight(smGD.display, smGD.screen);
xorg = yorg = 0;
#endif
x = (dpwidth / 2) - (width / 2);
y = (dpheight / 2) - (height / 2);
/* add the x/y origins for Xinerama */
x += xorg;
y += yorg;
i = 0;
XtSetArg(uiArgs[i], XmNx, x);i++;
XtSetArg(uiArgs[i], XmNy, y);i++;
XtSetValues(w, uiArgs, i);
XtRemoveCallback(w, XmNpopupCallback, DialogUp, NULL);
}
/*************************************<->*************************************
*
* ShowWaitState (flag)
*
*
* Description:
* -----------
* Enter/Leave the wait state.
*
*
* Inputs:
* ------
* flag = TRUE for Enter, FALSE for Leave.
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
* Stolen from the window manager code.
*
*************************************<->***********************************/
void
ShowWaitState(
Boolean flag )
{
if (flag)
{
XGrabPointer (smGD.display, DefaultRootWindow(smGD.display), FALSE,
0, GrabModeAsync, GrabModeAsync, None,
smGD.waitCursor, CurrentTime);
XGrabKeyboard (smGD.display, DefaultRootWindow(smGD.display), FALSE,
GrabModeAsync, GrabModeAsync, CurrentTime);
}
else
{
XUngrabPointer (smGD.display, CurrentTime);
XUngrabKeyboard (smGD.display, CurrentTime);
}
XSync(smGD.display, 0);
}
/*************************************<->*************************************
*
* InitCursorInfo ()
*
*
* Description:
* -----------
* This function determines whether a server supports large cursors. It it
* does large feedback cursors are used in some cases (wait state and
* system modal state); otherwise smaller (16x16) standard cursors are used.
*
* Outputs:
* -------
* Returns true if large cursors are supported, false otherwise
*
* Comments:
* ---------
* This code was stolen from the window manager
*
*************************************<->***********************************/
Boolean
InitCursorInfo( void )
{
unsigned int cWidth;
unsigned int cHeight;
if (XQueryBestCursor (smGD.display, DefaultRootWindow(smGD.display),
32, 32, &cWidth, &cHeight))
{
if ((cWidth >= 32) && (cHeight >= 32))
{
return(True);
}
}
return(False);
}
/*************************************<->*************************************
*
* LockDialogUp ()
*
*
* Description:
* -----------
* Once the lock dialog is managed, but not popped up - reposition it so that
* it appears in the middle of the screen then remove the popup callback
*
*
* Inputs:
* ------
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
static void
LockDialogUp(
Widget w,
XtPointer client_data,
XtPointer call_data )
{
register int i;
Dimension width, height; /* size values returned by XtGetValues */
Dimension shadowThickness;/* size values returned by XtGetValues */
unsigned int dpwidth, dpheight, xorg, yorg; /* JET - xinerama */
struct
{ /* position, size of widgets (pixels) */
int x, y;
int width;
int height;
int shadow;
} mw; /* matte, logo, drop shadow & login matte */
int width1, width2; /* general width variable */
int x1, y1; /* general position variables */
int index;
/* JET - get xinerama info */
#ifdef USE_XINERAMA
/* use the prefered screen */
if (!_DtXineramaGetScreen(smGD.DtXineramaInfo,
smRes.xineramaPreferredScreen,
&dpwidth, &dpheight, &xorg, &yorg))
{ /* no joy here either - setup for normal */
dpwidth = DisplayWidth(smGD.display, smGD.screen);
dpheight = DisplayHeight(smGD.display, smGD.screen);
xorg = yorg = 0;
}
#else /* no Xinerama */
dpwidth = DisplayWidth(smGD.display, smGD.screen);
dpheight = DisplayHeight(smGD.display, smGD.screen);
xorg = yorg = 0;
#endif
/*
* The partial cover has widgets of index 0 - the cover has
* index 1
*/
if(smGD.coverScreen == True)
{
index = 1;
}
else
{
index = 0;
}
/*
* - center the main matte horizontally and vertically...
*/
i = 0;
XtSetArg(uiArgs[i], XmNwidth, &width); i++;
XtSetArg(uiArgs[i], XmNheight, &height); i++;
XtSetArg(uiArgs[i], XmNshadowThickness, &shadowThickness); i++;
XtGetValues(smDD.matte[index], uiArgs, i);
mw.shadow = shadowThickness;
mw.width = width;
mw.height = height;
mw.x = (dpwidth - mw.width)/2;
mw.y = (dpheight - mw.height)/2;
if ( mw.x < 0 ) mw.x = 0;
if ( mw.y < 0 ) mw.y = 0;
/* adjust origins if using Xinerama */
x1 = mw.x + xorg;
y1 = mw.y + yorg;
i = 0;
XtSetArg(uiArgs[i], XmNx, x1); i++;
XtSetArg(uiArgs[i], XmNy, y1); i++;
XtSetValues(smDD.matte[index], uiArgs, i);
/*
* - center the login/password frames horizontally in the login_matte...
*/
XtSetArg(uiArgs[0], XmNwidth, &width);
XtGetValues(smDD.loginMatte[index], uiArgs, 1);
width1 = (int)width;
XtSetArg(uiArgs[0], XmNwidth, &width);
XtGetValues(smDD.loginForm[index], uiArgs, 1);
width2 = (int)width;
i = 0;
XtSetArg(uiArgs[i], XmNleftAttachment, XmATTACH_FORM); i++;
XtSetArg(uiArgs[i], XmNleftOffset, (width1 - width2) / 2); i++;
XtSetValues(smDD.loginForm[index], uiArgs, i);
}
/*************************************<->*************************************
*
* SimpleOK()
*
*
* Description:
* -----------
* Simply dismiss a dialog. Does special process for a compatibility mode
* logout dialog and when the bms won't start.
*
*
* Inputs:
* ------
* client_data - sends in the dialog to be dismissed.
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
static void
SimpleOK(
Widget w,
XtPointer client_data,
XtPointer call_data )
{
Widget dismissDialog = (Widget) client_data;
if(XtIsManaged(dismissDialog))
{
XtUnmanageChild(dismissDialog);
}
if(dismissDialog == smDD.compatExit)
{
SetSystemReady();
}
if(dismissDialog == smDD.noStart)
{
SM_EXIT(-1);
}
if(dismissDialog == smDD.clientReasons)
{
reasonsDialogOK = True;
}
}
/*************************************<->*************************************
*
* UpdatePasswdField ()
*
*
* Description:
* -----------
* Give the visual feedback neccessary when the user is entering a password
*
*
* Inputs:
* ------
* numChars = number of characters entered into the field
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
void
UpdatePasswdField(
int numChars )
{
int i, index;
char *passwdMessage = XtMalloc(numChars + 1);
XmString tmpString;
if (!passwdMessage) {
PrintErrnoError(DtError, smNLS.cantMallocErrorString);
return;
}
if(numChars > 0)
{
strcpy(passwdMessage, "|");
for(i = 1;i < numChars;i++)
{
if(i==1)
strcpy(passwdMessage, "|");
else
strcat(passwdMessage, " ");
}
strcat(passwdMessage, PASSWORD_INDICATOR);
}
else
{
strcpy(passwdMessage, "|");
}
tmpString = XmStringCreateLocalized (passwdMessage);
XtFree(passwdMessage);
/*
* Set the index for the indLabel widget
*/
if(smGD.coverScreen == True)
{
index = 1;
}
else
{
index = 0;
}
i = 0;
XtSetArg(uiArgs[i], XmNlabelString, tmpString); i++;
XtSetValues(smDD.indLabel[index], uiArgs, i);
XmStringFree(tmpString);
}
/*************************************<->*************************************
*
* WarnNoStartup ()
*
*
* Description:
* -----------
* When the BMS refuses to be started, warn the user about why dt is
* crashing and then exit.
*
*
* Inputs:
* ------
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
int
WarnNoStartup( void )
{
int i;
XmString bmsNoStartString;
String tmpString;
#ifdef __osf__
bmsNoStartString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 76,
"The DT messaging system could not be started.\n\n\
To correct the problem:\n\n\
1. Choose [OK] to return to the login screen.\n\n\
2. Select Failsafe Session from the login screen's option\n\
menu and log in.\n\n\
3. Check to see that your hostname exists correctly in /etc/hosts if your\n\
network has already been configured.\n\
4. If your network has not yet been configured, make sure that /etc/hosts\n\
has the following entry in it:\n\
127.0.0.1 localhost \n\n\
For additional information, see the CDE User's Guide.")));
#else
bmsNoStartString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 36,
"The desktop messaging system could not be started.\n\n\
To correct the problem:\n\n\
1. Choose [OK] to return to the login screen.\n\n\
2. Select Failsafe Session from the login screen's option\n\
menu and log in.\n\n\
3. Check to see that the desktop is properly installed,\n\
the hostname is correct (/etc/hosts) and that the\n\
network is properly configured.\n\n\
For additional information, see the CDE User's Guide.")));
#endif
/*
* Now create the dialog box
*/
i = 0;
tmpString = GETMESSAGE(18, 37, "Action Required");
XtSetArg(uiArgs[i], XmNmessageString, bmsNoStartString);i++;
XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
smDD.noStart = XmCreateWarningDialog(smGD.topLevelWid, "noStartDialog",
uiArgs, i);
XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
XtSetValues(XtParent(smDD.noStart), uiArgs, i);
XtAddCallback (XtParent(smDD.noStart),
XmNpopupCallback, DialogUp, NULL);
XtUnmanageChild(XmMessageBoxGetChild(smDD.noStart,
XmDIALOG_HELP_BUTTON));
XtUnmanageChild(XmMessageBoxGetChild(smDD.noStart,
XmDIALOG_CANCEL_BUTTON));
/*
* Now add in the callback and get out of here
*/
XtAddCallback (smDD.noStart, XmNokCallback,
SimpleOK, smDD.noStart);
XmStringFree(bmsNoStartString);
XtManageChild(smDD.noStart);
return(0);
} /* END OF FUNCTION WarnNoStartup */
#ifdef __osf__
/*************************************<->*************************************
*
* WarnNewProfile()
*
*
* Description:
* -----------
* Warn the user that a new .dtprofile has just been added to their $HOME
* directory, indicating a need to edit it and their .login/.profile files.
*
*
* Inputs:
* ------
*
*
* Outputs:
* -------
* None.
*
*
* Comments:
* --------
*
*************************************<->***********************************/
int
WarnNewProfile( void )
{
int i;
XmString newProfileString;
String tmpString;
newProfileString = XmStringCreateLocalized(((char *)GETMESSAGE(18, 99,
"The new file '.dtprofile' has been added to your home directory.\n\
\n\
Follow the instructions in this file to ensure that when you log in\n\
again your '.login' or '.profile' file will be activated and \n\
that it will interact correctly with CDE. \n\
\n\
For additional information, see the CDE Advanced User's and System\n\
Administrator's Guide.")));
/*
* Now create the dialog box
*/
i = 0;
tmpString = GETMESSAGE(18, 37, "Action Required");
XtSetArg(uiArgs[i], XmNmessageString, newProfileString);i++;
XtSetArg(uiArgs[i], XmNallowShellResize, True); i++;
XtSetArg(uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
XtSetArg(uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
XtSetArg(uiArgs[i], XmNtitle, tmpString); i++;
XtSetArg(uiArgs[i], XmNokLabelString, smDD.okString); i++;
XtSetArg(uiArgs[i], XmNautoUnmanage, False); i++;
smDD.newProfile = XmCreateWarningDialog(smGD.topLevelWid,
"newProfileDialog",
uiArgs, i);
XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
XtSetValues(XtParent(smDD.newProfile), uiArgs, i);
XtAddCallback (XtParent(smDD.newProfile),
XmNpopupCallback, DialogUp, NULL);
XtUnmanageChild(XmMessageBoxGetChild(smDD.newProfile,
XmDIALOG_HELP_BUTTON));
XtUnmanageChild(XmMessageBoxGetChild(smDD.newProfile,
XmDIALOG_CANCEL_BUTTON));
/*
* Now add in the callback and get out of here
*/
XtAddCallback (smDD.newProfile, XmNokCallback,
SimpleOK, smDD.newProfile);
XmStringFree(newProfileString);
XtManageChild(smDD.newProfile);
return(0);
} /* END OF FUNCTION WarnNewProfile */
#endif
/*************************************<->*************************************
*
* ConfirmSessionCreation () -
*
* Description:
* -----------
*
* Inputs:
* ------
*
* Outputs:
* -------
*
* Returns True if the user says to continue the session; False otherwise
* or if malloc fails;
*
* Comments:
* --------
*
*************************************<->***********************************/
Boolean
ConfirmSessionCreation (
short session_type,
unsigned int _argc,
char **_argv)
{
int i, j;
XmString title_string;
XmString ok_string;
XmString cancel_string;
XmString help_string;
XmString msg_string;
Widget tmp_widget;
Arg args[20];
char *pch1;
char *pch2;
char *pch3;
Dimension width, height;
Position x, y;
XEvent next;
int argc = _argc;
char **argv = NULL;
/*
* Create temporary argv because the X toolkit may remove
* pieces of the command line options.
*/
if (_argc > 0) {
argv = (char **) XtMalloc (_argc * sizeof (char *));
for (i = 0; i < _argc; i++)
argv[i] = _argv[i];
}
if (session_type == HOME_SESSION)
pch1 = strdup ((char *) GETMESSAGE(18, 50, "Home"));
else
pch1 = strdup ((char *) GETMESSAGE(18, 51, "Current"));
if (!pch1) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
pch2 = strdup ((char *) GETMESSAGE(18, 52,
"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."));
if (!pch2) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
pch3 = XtMalloc (strlen (pch1) +
strlen (XDisplayName (getenv("DISPLAY"))) +
strlen (pch2) +
4);
if (!pch3) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
(void) sprintf (pch3, pch2, pch1, XDisplayName (getenv("DISPLAY")));
/*
* The X toolkit has not yet been initialized, so do it now.
*/
j = 0;
XtToolkitInitialize ();
smGD.appCon = XtCreateApplicationContext();
smGD.display = XtOpenDisplay(smGD.appCon, NULL, argv[0],
SM_RESOURCE_CLASS, NULL, 0, &argc, argv);
XtSetArg(args[j], XmNbackground,
XBlackPixel(smGD.display, XDefaultScreen(smGD.display))); j++;
XtSetArg(args[j], XmNmappedWhenManaged, False); j++;
XtSetArg (args[j], XmNwidth, 1); j++;
XtSetArg (args[j], XmNheight, 1); j++;
tmp_widget = XtAppCreateShell (
"foo", "foo",
applicationShellWidgetClass,
smGD.display, args, j);
XtRealizeWidget(tmp_widget);
/*
* Create the compound strings for the confirmation dialog
*/
msg_string = XmStringCreateLocalized (pch3);
title_string = XmStringCreateLocalized(pch3);
ok_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
cancel_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 40, "Cancel")));
help_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
free (pch1); free (pch2); XtFree (pch3);
/*
* Create the dialog box
*/
i = 0;
XtSetArg (uiArgs[i], XmNmessageString, msg_string); i++;
XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
XtSetArg (uiArgs[i], XmNtitle, title_string); i++;
XtSetArg (uiArgs[i], XmNokLabelString, ok_string); i++;
XtSetArg (uiArgs[i], XmNcancelLabelString, cancel_string); i++;
XtSetArg (uiArgs[i], XmNhelpLabelString, help_string); i++;
XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
smDD.confirmSession = XmCreateWarningDialog(
tmp_widget, "confirmDialog", uiArgs, i);
XtAddCallback (smDD.confirmSession, XmNokCallback,
ConfirmOKCB, NULL);
/*
* Some help state is not yet initialized and the help
* callback assumes it is so some initializations must
* be done now.
*/
smDD.smHelpDialog = NULL;
smDD.okString = ok_string;
smGD.topLevelWid = tmp_widget;
XtAddCallback (smDD.confirmSession, XmNhelpCallback,
TopicHelpRequested, HELP_CONFIRMATION_SESSION_STR);
XtAddCallback (smDD.confirmSession, XmNcancelCallback,
ConfirmCancelCB, NULL);
XtManageChild(smDD.confirmSession);
/*
* Center the dialog on the display
*/
i = 0;
XtSetArg(uiArgs[i], XmNwidth, &width); i++;
XtSetArg(uiArgs[i], XmNheight, &height); i++;
XtGetValues(smDD.confirmSession, uiArgs, i);
x = (DisplayWidth(smGD.display, XDefaultScreen(smGD.display)) / 2)
- (width / 2);
y = (DisplayHeight(smGD.display, XDefaultScreen(smGD.display)) / 2)
- (height / 2);
i = 0;
XtSetArg(uiArgs[i], XmNx, x); i++;
XtSetArg(uiArgs[i], XmNy, y); i++;
XtSetValues(smDD.confirmSession, uiArgs, i);
XmStringFree (msg_string);
XmStringFree (title_string);
XmStringFree (cancel_string);
XmStringFree (help_string);
/*
* Spin until the OK or Cancel CB is invoked
*/
confirmState = ConfirmationNone;
while(1) {
XtAppNextEvent(smGD.appCon, &next);
if (next.type != 0)
XtDispatchEvent(&next);
if (confirmState == ConfirmationOK) {
XtDestroyWidget (tmp_widget);
XmStringFree (ok_string);
return (True);
}
else if (confirmState == ConfirmationCancel) {
XtDestroyWidget (tmp_widget);
XmStringFree (ok_string);
return (False);
}
}
}
/*************************************<->*************************************
*
* ConfirmOKCB ()
*
*************************************<->***********************************/
static void
ConfirmOKCB(
Widget w,
XtPointer client_data,
XtPointer call_data )
{
XtUnmanageChild(smDD.confirmSession);
confirmState = ConfirmationOK;
}
/*************************************<->*************************************
*
* ConfirmCancelCB ()
*
*************************************<->***********************************/
static void
ConfirmCancelCB(
Widget w,
XtPointer client_data,
XtPointer call_data )
{
XtUnmanageChild(smDD.confirmSession);
confirmState = ConfirmationCancel;
}
/*************************************<->*************************************
*
* PostXSMPFailureDialog () -
*
* Description:
* -----------
*
* Inputs:
* ------
*
* Outputs:
* -------
*
* Returns True if the user says to continue the session; False otherwise
* or if malloc fails;
*
* Comments:
* --------
*
*************************************<->***********************************/
void
PostXSMPFailureDialog (
XSMPFailure failure_code,
Boolean check_errorlog)
{
int i, j;
XmString ok_string;
XmString help_string;
XmString msg_string;
Arg args[20];
char *pch1;
char *pch2 = "";
char *pch3;
char *pch4;
char *pch5;
char *error_file;
Dimension width, height;
Position x, y;
XEvent next;
int len;
pch1 = strdup ((char *) GETMESSAGE(40, 1,
"A session cannot be started because of the\nfollowing error:"));
if (!pch1) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
switch (failure_code) {
case XSMP_FAILURE_SMS_INITIALIZE:
pch2 = strdup ((char *) GETMESSAGE (40, 2,
"SmsInitialize failed."));
break;
case XSMP_FAILURE_ICE_LISTEN:
pch2 = strdup ((char *) GETMESSAGE (40, 3,
"IceListenForConnections failed."));
break;
case XSMP_FAILURE_AUTHENTICATION:
pch2 = strdup ((char *) GETMESSAGE (40, 4,
"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."));
break;
case XSMP_FAILURE_ICE_ADD_WATCH:
pch2 = strdup ((char *) GETMESSAGE (40, 5,
"IceAddConnectionWatch failed."));
break;
case XSMP_FAILURE_ICE_COMPOSE_IDS:
pch2 = strdup ((char *) GETMESSAGE (40, 6,
"IceComposeNetworkIds failed."));
break;
case XSMP_FAILURE_MALLOC:
pch2 = strdup ((char *) GETMESSAGE (40, 7,
"Could not create the SESSION_MANAGER environment variable."));
break;
}
if (!pch2) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
pch3 = strdup ((char *) GETMESSAGE(18, 70,
"See the following for more information:"));
if (!pch3) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
pch4 = strdup ((char *) GETMESSAGE(18, 71,
"CDE Advanced Users and System's Administration Guide"));
if (!pch4) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
error_file = XtMalloc(MAXPATHLEN+1);
strcpy (error_file, "");
/* JET - VU#497553 */
if (check_errorlog)
{
char *home;
if (home = getenv ("HOME"))
{
len = strlen(home) +
strlen(DtPERSONAL_CONFIG_DIRECTORY) +
strlen(DtERRORLOG_FILE);
if (len > MAXPATHLEN)
error_file = XtRealloc(error_file, len + 1);
sprintf (error_file, "%s/%s/%s", home,
DtPERSONAL_CONFIG_DIRECTORY,
DtERRORLOG_FILE);
}
}
pch5 = XtMalloc (strlen (pch1) + strlen (pch2) + strlen (pch3) + strlen (pch4) +
strlen (error_file) + 15);
if (!pch5) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
(void) sprintf (pch5, "%s\n\n %s\n\n%s\n\n %s\n %s\n",
pch1, pch2, pch3, pch4, error_file);
XtFree(error_file);
/*
* No top level widget has been created so must create one now.
*/
j = 0;
XtSetArg (args[j], XmNbackground, XBlackPixel(smGD.display,
XDefaultScreen(smGD.display))); j++;
XtSetArg (args[j], XmNmappedWhenManaged, False); j++;
XtSetArg (args[j], XmNwidth, 1); j++;
XtSetArg (args[j], XmNheight, 1); j++;
smGD.topLevelWid = XtAppCreateShell (SM_RESOURCE_NAME,
SM_RESOURCE_CLASS, applicationShellWidgetClass,
smGD.display, args, j);
XtRealizeWidget(smGD.topLevelWid);
/*
* Create the compound strings for the confirmation dialog
*/
msg_string = XmStringCreateLocalized (pch5);
ok_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
help_string = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
free (pch1); free (pch2); free (pch3); free (pch4); XtFree (pch5);
/*
* Create the dialog box
*/
i = 0;
XtSetArg (uiArgs[i], XmNmessageString, msg_string); i++;
XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
XtSetArg (uiArgs[i], XmNokLabelString, ok_string); i++;
XtSetArg (uiArgs[i], XmNhelpLabelString, help_string); i++;
XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
smDD.confirmSession = XmCreateWarningDialog(
smGD.topLevelWid, "confirmDialog", uiArgs, i);
XtAddCallback (smDD.confirmSession, XmNokCallback,
XSMPFailureOKCB, NULL);
/*
* Some help state is not yet initialized and the help
* callback assumes it is so some initializations must
* be done now.
*/
smDD.smHelpDialog = NULL;
smDD.okString = ok_string;
XtAddCallback (smDD.confirmSession, XmNhelpCallback,
TopicHelpRequested, HELP_XSMP_INIT_FAILURE_STR);
XtUnmanageChild(XmMessageBoxGetChild(smDD.confirmSession,
XmDIALOG_CANCEL_BUTTON));
XtManageChild(smDD.confirmSession);
/*
* Center the dialog on the display
*/
i = 0;
XtSetArg(uiArgs[i], XmNwidth, &width); i++;
XtSetArg(uiArgs[i], XmNheight, &height); i++;
XtGetValues(smDD.confirmSession, uiArgs, i);
x = (DisplayWidth(smGD.display, XDefaultScreen(smGD.display)) / 2)
- (width / 2);
y = (DisplayHeight(smGD.display, XDefaultScreen(smGD.display)) / 2)
- (height / 2);
i = 0;
XtSetArg(uiArgs[i], XmNx, x); i++;
XtSetArg(uiArgs[i], XmNy, y); i++;
XtSetValues(smDD.confirmSession, uiArgs, i);
XmStringFree (msg_string);
XmStringFree (help_string);
/*
* Spin until the OK CB is invoked
*/
while(1) {
XtAppNextEvent(smGD.appCon, &next);
if (next.type != 0)
XtDispatchEvent(&next);
}
}
/*************************************<->*************************************
*
* XSMPFailureOKCB ()
*
*************************************<->***********************************/
static void
XSMPFailureOKCB(
Widget w,
XtPointer client_data,
XtPointer call_data )
{
XtUnmanageChild(smDD.confirmSession);
SM_EXIT(1);
}
/*************************************<->*************************************
*
* PostSaveSessionErrorDialog
*
* Description:
* -----------
* Let the user know that the Save_Session message does not have the
* required data and the session will not be saved.
*
* Inputs:
* ------
*
* Outputs:
* -------
*
*************************************<->***********************************/
void
PostSaveSessionErrorDialog ( void )
{
int i;
XmString messageString;
String titleString;
if(smDD.saveSession == NULL)
{
messageString = XmStringCreateLocalized (((char *) GETMESSAGE(18, 56,
"The session cannot be saved because the required\n\
'save_type' parameter was not in the message.\n\n\
The session will not be saved.")));
titleString = GETMESSAGE(18, 55, "Save Session Failure");
i = 0;
XtSetArg (uiArgs[i], XmNmessageString, messageString); i++;
XtSetArg (uiArgs[i], XmNallowShellResize, True); i++;
XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
XtSetArg (uiArgs[i], XmNtitle, titleString); i++;
XtSetArg (uiArgs[i], XmNokLabelString, smDD.okString); i++;
XtSetArg (uiArgs[i], XmNhelpLabelString, smDD.helpString); i++;
XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
smDD.saveSession = XmCreateErrorDialog(smGD.topLevelWid,
"sessionSaveDialog", uiArgs, i);
i = 0;
XtSetArg (uiArgs[i], XmNuseAsyncGeometry, True);i++;
XtSetArg (uiArgs[i], XmNmwmFunctions, 0);i++;
XtSetArg (uiArgs[i], XmNmwmDecorations,
(MWM_DECOR_TITLE | MWM_DECOR_BORDER)); i++;
XtSetArg (uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
XtSetValues(XtParent(smDD.saveSession), uiArgs, i);
XtAddCallback (XtParent(smDD.saveSession),
XmNpopupCallback, DialogUp, NULL);
XtUnmanageChild (XmMessageBoxGetChild(smDD.saveSession,
XmDIALOG_CANCEL_BUTTON));
XtAddCallback (smDD.saveSession, XmNokCallback,
SimpleOK, (XtPointer) smDD.saveSession);
#ifndef NO_XVH
XtAddCallback (smDD.saveSession, XmNhelpCallback,
TopicHelpRequested, HELP_SESSION_SAVE_ERROR_STR);
#endif
XmStringFree(messageString);
}
XtManageChild(smDD.saveSession);
return;
}
/*************************************<->*************************************
*
* PostReasonsDialog - posts a Warning dialog on behalf of a client
* that supplied a "reason" when it closed its connection
*
* Inputs:
* ------
*
* Outputs: void
* -------
*
*************************************<->***********************************/
void
PostReasonsDialog (
char * progName,
int numMsgs,
char ** message,
Boolean waitForResponse)
{
XmString msgString;
XmString okString;
XmString helpString;
Arg args[20];
char * titleString;
char * str1;
char * str2;
char * str3;
int i;
int len;
XEvent next;
str1 = strdup ((char *) GETMESSAGE(40, 28,
"Application '%s'\nexited for the following reason:\n\n%s"));
if (!str1) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
for (i = 0, len = 0; i < numMsgs; i++)
len += strlen (message[i]);
str2 = XtMalloc (len + (numMsgs * 3) + 1);
if (!str2) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
str2[0] = '\000';
for (i = 0; i < numMsgs; i++) {
strcat (str2, message[i]);
strcat (str2, "\n");
}
str3 = XtMalloc (strlen (str1) + strlen (str2) + strlen (progName) + 4);
if (!str3) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
(void) sprintf (str3, str1, progName, str2);
DtMsgLogMessage (smGD.programName, DtMsgLogWarning, str3);
free (str1);
str1 = strdup ((char *) GETMESSAGE(40, 29,
"Application Close Reasons"));
if (!str1) {
PrintError(DtError, smNLS.cantMallocErrorString);
SM_EXIT(1);
}
msgString = XmStringCreateLocalized (str3);
okString = XmStringCreateLocalized(((char *) GETMESSAGE(18, 39, "OK")));
helpString = XmStringCreateLocalized(((char *) GETMESSAGE(18, 41, "Help")));
/*
* Create the dialog box
*/
i = 0;
XtSetArg (uiArgs[i], XmNmessageString, msgString); i++;
XtSetArg (uiArgs[i], XmNallowShellResize, False); i++;
XtSetArg (uiArgs[i], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); i++;
XtSetArg (uiArgs[i], XmNmessageAlignment, XmALIGNMENT_BEGINNING); i++;
XtSetArg (uiArgs[i], XmNmappedWhenManaged, True); i++;
XtSetArg (uiArgs[i], XmNtitle, str1); i++;
XtSetArg (uiArgs[i], XmNokLabelString, okString); i++;
XtSetArg (uiArgs[i], XmNhelpLabelString, helpString); i++;
XtSetArg (uiArgs[i], XmNautoUnmanage, False); i++;
smDD.clientReasons = XmCreateWarningDialog(smGD.topLevelWid,
"clientReasons", uiArgs, i);
i = 0;
XtSetArg(uiArgs[i], XmNuseAsyncGeometry, True);i++;
XtSetArg(uiArgs[i], XmNmwmFunctions, 0);i++;
XtSetArg(uiArgs[i], XmNmwmDecorations,
(MWM_DECOR_TITLE | MWM_DECOR_BORDER));i++;
XtSetArg(uiArgs[i], XmNmwmInputMode, MWM_INPUT_SYSTEM_MODAL);i++;
XtSetValues(XtParent(smDD.clientReasons), uiArgs, i);
XtAddCallback (XtParent(smDD.clientReasons),
XmNpopupCallback, DialogUp, NULL);
XtUnmanageChild (XmMessageBoxGetChild (smDD.clientReasons,
XmDIALOG_CANCEL_BUTTON));
/*
* Now add in the callback and get out of here
*/
XtAddCallback (smDD.clientReasons, XmNokCallback,
SimpleOK, (XtPointer) smDD.clientReasons);
#ifndef NO_XVH
XtAddCallback (smDD.clientReasons, XmNhelpCallback,
TopicHelpRequested, HELP_APP_CLOSE_REASONS_STR);
#endif
free (str1);
XtFree (str2);
XtFree (str3);
XmStringFree (msgString);
XmStringFree (okString);
XmStringFree (helpString);
XtManageChild (smDD.clientReasons);
/*
* Spin until the OK callback is invoked. If a shutdown
* is in progress, we don't want to return until the
* user has acknowledged this message.
*/
reasonsDialogOK = False;
if (waitForResponse) {
while (1) {
XtAppNextEvent (smGD.appCon, &next);
if (next.type != 0)
XtDispatchEvent(&next);
if (reasonsDialogOK == True)
break;
}
}
}
/*************************************<->*************************************
*
* SaveTimeout
*
* Description:
* -----------
* Timeout procedure that is invoked when a save timer expires.
*
* Inputs:
* ------
*
* Outputs: None
* -------
*
*************************************<->***********************************/
static void
SaveTimeout (
XtPointer client_data,
XtIntervalId *id)
{
saveTimeout = True;
if (smXSMP.saveState.shutdownCanceled == False) {
/*
* Run the user's exit script if there is one
*/
if (smGD.compatMode == False)
StartEtc(True); /* run sessionexit */
_DtReleaseLock(smGD.display, SM_RUNNING_LOCK);
SM_EXIT(0);
}
}