セッション・マネージャは、ユーザが現在のセッションを終了する時の状態をアプリケーションに保存させます。これによって、アプリケーションは、ユーザがセッションを再起動した時に、前回終了時の状態へ戻ることができます。
dtksh でこれを行うには、クローズ通知を処理する場合と同様の方法でハンドラを設定します。ハンドラを設定しないと、新規セッションでアプリケーションを手動で再起動しなければなりません。その場合、アプリケーションはいかなる状態も保持しません。
ハンドラを設定して現在の状態を保存するためには、アプリケーションで次のことを行います。
セッションの終わりの状態を保存し、起動時にそれを復元するための関数を定義する
セッション・マネージャの通知の配信対象を登録する
状態を保存する関数を登録する
起動時に、保存した状態を復元するか否かを決定する
次のコードは、この処理を説明しています。
#! /usr/dt/bin/dtksh # Function invoked when the session is being ended by the user SessionCallback() { # Get the name of the file into which we should save our # session information if DtSessionSavePath $TOPLEVEL PATH SAVEFILE; then exec 9>$PATH # Save off whether we are currently in an iconified state if DtShellIsIconified $TOPLEVEL ; then print -u9 `Iconified' else print -u9 `Deiconified' fi # Save off the list of workspaces we currently reside in if DtWsmGetWorkspacesOccupied $(XtDisplay "-" $TOPLEVEL) ¥ $(XtWindow "-" $TOPLEVEL) ¥ CURRENT_WS_LIST ; then # Map the comma-separated list of atoms into # their string representation oldIFS=$IFS IFS="," for item in $CURRENT_WS_LIST; do XmGetAtomName NAME $(XtDisplay "-" $TOPLEVEL) ¥ $item print -u9 $NAME done IFS=$oldIFS fi exec 9<&- # Let the session manager know how to invoke us when # the session is restored DtSetStartupCommand $TOPLEVEL ¥ "/usr/dt/contrib/dtksh/SessionTest $SAVEFILE" else echo "DtSessionSavePath FAILED!!" exit -3 fi } # Function invoked during a restore session; restores the # application to its previous state RestoreSession() { # Retrieve the path where our session file resides if DtSessionRestorePath $TOPLEVEL PATH $1; then exec 9<$PATH read -u9 ICONIFY # Extract and restore our iconified state case $ICONIFY in Iconified) DtSetIconifyHint $TOPLEVEL True;; *) DtSetIconifyHint $TOPLEVEL False; esac # Extract the list of workspaces we belong in, convert # them to atoms, and ask the Workspace Manager to relocate # us to those workspaces WS_LIST="" while read -u9 NAME do XmInternAtom ATOM $(XtDisplay "-" $TOPLEVEL) ¥ $NAME False if [ ${#WS_LIST} -gt 0 ]; then WS_LIST=$WS_LIST,$ATOM else WS_LIST=$ATOM fi done DtWsmSetWorkspacesOccupied $(XtDisplay "-" $TOPLEVEL) ¥ $(XtWindow "-" $TOPLEVEL) $WS_LIST exec 9<&- else echo "DtSessionRestorePath FAILED!!" exit -3 fi } ################## Create the Main UI ####################### XtInitialize TOPLEVEL wmProtTest Dtksh $0 "$@" XtCreateManagedWidget DA da XmDrawingArea $TOPLEVEL ¥ height:200 width:200 XmInternAtom SAVE_SESSION_ATOM $(XtDisplay "-" $TOPLEVEL) ¥ "WM_SAVE_YOURSELF" False # If a command-line argument was supplied, then treat it as the # name of the session file if (( $# > 0)) then # Restore to the state specified in the passed-in session file XtSetValues $TOPLEVEL mappedWhenManaged:False XtRealizeWidget $TOPLEVEL XSync $(XtDisplay "-" $TOPLEVEL) False RestoreSession $1 XtSetValues $TOPLEVEL mappedWhenManaged:True XtPopup $TOPLEVEL GrabNone else # This is not a session restore, so come up in the default state XtRealizeWidget $TOPLEVEL XSync $(XtDisplay "-" $TOPLEVEL) False fi # Register the fact that we are interested in participating in # session management XmAddWMProtocols $TOPLEVEL $SAVE_SESSION_ATOM XmAddWMProtocolCallback $TOPLEVEL $SAVE_SESSION_ATOM ¥ SessionCallback XtMainLoop