共通デスクトップ環境 Dtksh ユーザーズ・ガイド

セッション・マネージャの保存状態通知への応答

セッション・マネージャは、ユーザが現在のセッションを終了する時の状態をアプリケーションに保存させます。これによって、アプリケーションは、ユーザがセッションを再起動した時に、前回終了時の状態へ戻ることができます。

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