# セッション・マネージャとの統合

セッション・マネージャは、ユーザが（現在のセッションから）ログアウトするときや、ユーザが（ホーム・セッションとして）環境を保存するときに、デスクトップ環境と実行中のアプリケーションに関する情報を保存します。 アプリケーションが現在のセッッションまたはホーム・セッションの一部として保存され、次のセッションの一部として再起動されるためには、Xクライアント間通信規約マニュアル（ICCCM）1.1のセッション管理プロトコルに関与する必要があります。 この章では、セッション・マネージャがセッションを保存し、復元する方法を概説し、アプリケーションがセッション管理に関与するために必要な手順を詳しく述べます。

PG.smgr.mkr.2
PG.smgr.mkr.3
PG.smgr.mkr.4

## セッション・マネージャがセッション及びアプリケーションを保存する方法

セッションを終了するときや、ホーム・セッションを保存するとき、 セッション・マネージャは次のことを行います。

1. 選択されたリソース設定とXサーバ設定を保存する。

2. 各アプリケーションが状態を保存できるようにして、保存の完了を待つ。

3. アプリケーションの再起動に必要なコマンド行を獲得する。

## セッション管理のためのアプリケーションのプログラム方法

### プログラム環境の設定

この節では、統合プロセスの一部としてアプリケーションを保存するために必要なプログラミングの手順を説明します。

プログラム環境を設定するには、次の手順に従います。

1. 次のヘッダ・ファイルを組み込みます。

   - `Xm/Xm.h`

   - `Xm/Protocols.h`

   - `Dt/Session.h`

2. `libXm`と`libDtSvc`をリンクします。

3. ツールキットを初期化して、トップレベル・ウィジェットを作成します。

#### WM_SAVE_YOURSELFアトムの設定

次の例で示すように、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`アトムを設定しないでください。

#### WM_SAVE_YOURSELFメッセージを受け取るための準備

Motifの`XmAddWMProtocolCallback()`関数を使用して、アプリケーションが `WM_SAVE_YOURSELF`クライアント・メッセージを受け取ったときに呼び出されるコールバック・プロシージャを設定します。

    XmAddWMProtocolCallback(toplevel, XaWmSaveYourself,
    SaveYourselfProc,
       toplevel);

#### WM_SAVE_YOURSELFメッセージの処理

セッション・マネージャがこのアプリケーションのトップレベル・ウィンドウに`WM_SAVE_YOURSELF`クライアント・メッセージを送ると、 `SaveYourselfProc()`コールバック・プロシージャが呼び出されます。 このコールバックを使用して、アプリケーションの状態を保存します。 アプリケーションはプログラマが選んだ任意の方法で状態を保存できますが、保存中はユーザと対話できません。

セッション・マネージャは、アプリケーションの状態を保存するための絶対パス名とベース・ファイル名を返す手段として、`DtSessionSavePath()`関数を提供します。

#### WM_COMMAND属性の設定

アプリケーションが`WM_SAVE_YOURSELF`メッセージの処理 （状態を保存するか、メッセージを無視する）を終了した後、 アプリケーションはトップレベル・ウィンドウの`WM_COMMAND`属性を設定して、保存操作が完了したことをセッション・マネージャに知らせなければなりません。

アプリケーションのトップレベル・ウィンドウの`WM_COMMAND`属性を設定するには、Xlibの`XsetCommand()`関数を使います。 この属性を設定することによって、アプリケーションが`WM_SAVE_YOURSELF`メッセージの処理を終了したことを セッション・マネージャに知らせ、アプリケーションを再起動するために必要なコマンド行を セッション・マネージャに与えます。

`XsetCommand()`は、コマンド引数の配列を受け入れます。 アプリケーションが保存プロセスの一部として`DtSessionSavePath()`関数を使用する場合には、`XsetCommand()`には追加のコマンド引数`‐session` basenameが必要です。basenameは、`DtSessionSavePath()`によって返されるベース・ファイル名です。

## セッション・マネージャがセッションを復元する方法

セッション・マネージャは、次のようにしてセッションを復元します。

1. リソース・データベースとサーバ設定を復元する。

2. 保存されたコマンド行を使用して、アプリケーションを再起動する。

アプリケーションが、保存された状態のパスを見つけるために`DtSessionSavePath()`を使用した場合には、 アプリケーションはベース・ファイル名を`-session`引数から `DtSessionRestorePath()`関数に渡して、保存状態の絶対パス名を見つけることができます。