セッション・マネージャは、ユーザが (現在のセッションから) ログアウトするときや、ユーザが (ホーム・セッションとして) 環境を保存するときに、デスクトップ環境と実行中のアプリケーションに関する情報を保存します。アプリケーションが現在のセッションまたはホーム・セッションの一部として保存され、次のセッションの一部として再起動されるためには、X クライアント間通信規約マニュアル (ICCCM) 1.1 のセッション管理プロトコルを理解できる必要があります。この章では、セッション・マネージャがセッションを保存して復元する方法を概説し、アプリケーションがセッション管理に関与するために必要な手順を詳しく述べます。
セッションを終了するときや、ホーム・セッションを保存するとき、セッション・マネージャは次の作業を実行します。
この節では、統合プロセスの一部としてアプリケーションを保存するために必要なプログラミングの手順を説明します。
プログラム環境を設定するには、次の手順に従います。
次のヘッダ・ファイルを組み込みます。
Xm/Xm.h
Xm/Protocols.h
Dt/Session.h
libXmと libDtSvcをリンクします。
ツールキットを初期化して、トップレベル・ウィジェットを作成します。
次の例に示すように、Motif の XmAddWMProtocol() 関数を使用して、アプリケーションのトップレベル・ウィンドウの WM_PROTOCOLS 属性の WM_SAVE_YOURSELF アトムを設定します。
Atom XaWmSaveYourself; Display *dsp; dsp = XtDisplay(toplevel); XaWmSaveYourself = XmInternAtom(dsp, "WM_SAVE_YOURSELF", False); XmAddWMProtocols(toplevel, &XaWmSaveYourself, 1);
複数のウィンドウに対して WM_SAVE_YOURSELF アトムを設定しないでください。
Motif の XmAddWMProtocolCallback() 関数を使用して、アプリケーションが WM_SAVE_YOURSELF クライアント・メッセージを受け取ったときに呼び出されるコールバック・プロシージャを設定します。
XmAddWMProtocolCallback(toplevel, XaWmSaveYourself, SaveYourselfProc, toplevel);
セッション・マネージャがこのアプリケーションのトップレベル・ウィンドウに WM_SAVE_YOURSELF クライアント・メッセージを送ると、SaveYourselfProc() コールバック・プロシージャが呼び出されます。このコールバックを使用して、アプリケーションの状態を保存します。アプリケーションはプログラマが選んだ任意の方法で状態を保存できますが、保存中はユーザと対話できません。
セッション・マネージャは、アプリケーションの状態を保存するための絶対パス名とベース・ファイル名を返す手段として、DtSessionSavePath() 関数を提供します。
アプリケーションが WM_SAVE_YOURSELF メッセージの処理 (状態を保存するか、メッセージを無視する) を終了した後、アプリケーションはトップレベル・ウィンドウの WM_COMMAND 属性を設定して、保存操作が完了したことをセッション・マネージャに知らせなければなりません。
アプリケーションのトップレベル・ウィンドウの WM_COMMAND 属性を設定するには、Xlib の XSetCommand() 関数を使用します。この属性を設定することによって、アプリケーションが WM_SAVE_YOURSELF メッセージの処理を終了したことをセッション・マネージャに知らせ、アプリケーションを再起動するために必要なコマンド行をセッション・マネージャに与えます。
XSetCommand() は、コマンド引き数の配列を受け入れます。アプリケーションが保存プロセスの一部として DtSessionSavePath() 関数を使用する場合には、XSetCommand() には追加のコマンド引き数 -session basename が必要です。basename は、DtSessionSavePath() によって返されるベース・ファイル名です。
セッション・マネージャは、次のようにしてセッションを復元します。
アプリケーションが、保存された状態のパスを見つけるために DtSessionSavePath() を使用した場合には、アプリケーションは、ベース・ファイル名を-session 引き数から DtSessionRestorePath() 関数に渡して、保存状態ファイルの絶対パス名を見つけることができます。