# ワークスペース・マネージャとの統合

ワークスペース・マネージャは、デスクトップの複数のワークスペース環境の中でアプリケーションがウィンドウを管理するための手段を提供します。 アプリケーションは、ワークスペース・マネージャと通信することによって 、おもに４つのタスクを実行することができます。

- アプリケーションのウィンドウを１つ以上のワークスペースに置く。

- アプリケーションのウィンドウが位置するワークスペースを識別する。

- アプリケーションのウィンドウが別のワークスペースに移動するのを防止する。

- ユーザが別のワークスペースに切り替えるなど、ワークスペースに対する変更を監視する。

通常セッション・マネージャはプログラマに干渉されることなく、アプリケーションのメイン・ウィンドウを正しいワークスペースに取り出します。 ただし、アプリケーションが複数のトップレベル・ウィンドウを持つ場合には、ワークスペース・マネージャのAPIを使用してウィンドウの位置を特定し、このデータをセッション状態の一部として保存しなければなりません。

セッション間のアプリケーション関連情報の保存についての詳細は、 PG.smgr.mkr.1を参照してください。

PG.wsmgr.mkr.2
PG.wsmgr.mkr.3
PG.wsmgr.mkr.4
PG.wsmgr.mkr.5
PG.wsmgr.mkr.6

## ワークスペース・マネージャとの
通信

アプリケーションは、デスクトップが提供する 関数を使用して、ワークスペース・マネージャと通信します。 これらの関数を使用すると、ワークスペースの管理に関するさまざまなタスクをすばやく簡単に実行できます。 次に、これらの関数のリストを示します。

- `DtWsmAddCurrentWorkspaceCallback`

- `DtWsmAddWorkspaceFunctions`

- `DtWsmAddWorkspaceModifiedCallback`

- `DtWsmFreeWorkspaceInfo`

- `DtWsmGetCurrentBackdropWindows`

- `DtWsmGetCurrentWorkspace`

- `DtWsmGetWorkspaceInfo`

- `DtWsmGetWorkspaceList`

- `DtWsmGetWorkspacesOccupied`

- `DtWsmOccupyAllWorkspaces`

- `DtWsmRemoveWorkspaceCallback`

- `DtWsmRemoveWorkspaceFunctions`

- `DtWsmSetCurrentWorkspace`

- `DtWsmSetWorkspacesOccupied`

２つのデモ・プログラム(`occupy.c`と`wsinfo.c`)のコードの一部分が、これらの関数の使用方法を示しています。`occupy.c、wsinfo.c`、 およびいくつかのブランドのワークステーションのmakefileをリストしたものが、 ディレクトリ`/usr/dt/examples/dtwsm`にあります。 各関数の詳細については、該当するマニュアル・ページを参照してください。

## アプリケーション・ウィンドウを
ワークスペースに置く

アプリケーションは、ウィンドウを任意のまたは全部の既存のワークスペースに置くことができます。`DtWsmOccupyAllWorkspaces`は、現在定義されているすべてのワークスペースにウィンドウを置きます。 一方、`DtWsmSetWorkspacesOccupied`は、 関数に渡されたリストの中で指定されているすべてのワークスペースに ウィンドウを置きます。

### アプリケーション・ウィンドウをすべてのワークスペースに置くには

1. `
   DtWsmOccupyAllWorkspaces`を使用します。

   `occupy.c`では、[すべてのワークスペースに配置]プッシュ・ボタンのコールバック`allWsCB`が、 この関数を呼び出します。

       DtWsmOccupyAllWorkspaces (XtDisplay(toplevel),
                                 XtWindow(toplevel));

   - `XtDisplay(toplevel)`は、Xのディスプレイです。

   - `XtWindow(toplevel)`は、すべてのワークスペースに置かれるウィンドウです。

この関数に関する詳細は、`DtWsmOccupyAllWorkspaces`のマニュアル・ページを参照してください。

### アプリケーション・ウィンドウを指定されたワークスペースに置くには

1. `
   DtWsmSetWorkspacesOccupied`を使用します。

   `occupy.c`では、[配置するワークスペース]プッシュ・ボタンのコールバック`setCB`が、この関数を呼び出します。

       DtWsmSetWorkSpacesOccupied (XtDisplay(toplevel),
                                   XtWindow(toplevel), paWsSet, numSet);

   - `XtDisplay(toplevel)`は、Xのディスプレイです。

   - `XtWindow(toplevel)`は、ワークスペースに置かれるウィンドウです。

   - `paWsSet`は、Xのアトムに変換されたワークスペース名のリストを指すポインタです。

   - `numSet`は、リスト内のワークスペースの番号です。

この関数についての詳細は、`DtWsmSetWorkspacesOccupied`のマニュアル・ページを参照してください。

## アプリケーション・ウィンドウがあるワークスペースの
識別

関数`DtWsmGetWorkspacesOccupied`は、指定されたアプリケーション・ウィンドウがあるワークスペースのリストを返します。`occupy.c`では、 プロシージャ`ShowWorkspaceOccupancy`がこの関数を呼び出します。 この呼び出しの結果に基づいて、`ShowWorkspaceOccupancy`は ワークスペースを表すトグル・ボタンの外観を変更します。 アプリケーション・ウィンドウがあるワークスペースの各トグル・ボタンには、チェック・マークが表示されます。

### アプリケーション・ウィンドウがあるワークスペースを識別するには

1. `
   DtWsmGetWorkspacesOccupied`を使用します。

    rval = DtWsmGetWorkspacesOccupied(XtDisplay(toplevel)
                 XtWindow(toplevel), &paWsIn, &numWsIn);

`where:`

- `XtDisplay(toplevel)`は、Xのディスプレイです。

- `XtWindow(toplevel)`は、ワークスペースで検索されるウィンドウです。

- `paWsIn`は、Xのアトムに変換されたワークスペース名のリストを指すポインタのアドレスです。

- `numWsIn`は、リスト内のワークスペースの番号を表す整数のアドレスです。

この呼び出しの後、ループがセットされ、ワークスペースのリスト（`DtWsmGetWorkspaceList`によって プロシージャ`SetUpWorkspaceButtons`内で検索された）と、 アプリケーション・ウィンドウが検索されたワークスペースのリストとを比較します。 各トグル・ボタンがアプリケーション・ウィンドウがあるワークスペースを表す場合には、 トグル・ボタン・リソース `XmNset`にTrueが設定されます。

## ワークスペース間の
アプリケーションの移動防止

関数`
DtWsmRemoveWorkspaceFunctions`は、アプリケーションに対して次のことを防止します。

- 他のワークスペースへの切り替え

- すべてのワークスペースの占有

- 現在のワークスペースからの削除

`DtWsmRemoveWorkspaceFunctions`が上記のことを行う場合は、 デスクトップ・ワークスペース・マネージャ (`dtwm`)のウィンドウ・メニューの一部分をアクティブにしないようにします。 `dtwm`はアプリケーションのトップレベル・ウィンドウを管理するときにワークスペース情報をチェックするだけなので、 アプリケーションはトップレベル・ウィンドウがマップされる前に`DtWsmRemoveWorkspaceFunctions`を 呼び出さなければなりません。 アプリケーションのトップレベル・ウィンドウが管理された後で`DtWsmRemoveWorkspaceFunctions`を 呼び出す必要がある場合には、 最初にXlib関数`XWithdrawWindow`を 呼び出してから`DtWsmRemoveWorkspaceFunctions`を呼び出し、 次に`XMapWindow`を呼び出してトップレベル・ウィンドウを再マップしなければなりません。

### 別のワークスペースへの移動を防止するには

1. `
   DtWsmRemoveWorkspaceFunctions`を使用します。

       DtWsmRemoveWorkspaceFunctions(XtDisplay(toplevel),
                                     XtWindow(toplevel));

   - `XtDisplay(toplevel)`は、Xのディスプレイです。

   - `XtWindow(toplevel)`は、ワークスペースの移動を防止するウィンドウです。

## ワークスペースの
変更の監視

次の関数の１つまたは両方を使用して、ワークスペースの変更を監視することができます。

- `
  DtWsmAddCurrentWorkspaceCallback`

- `
  DtWsmWorkspaceModifiedCallback`

`DtWsmAddCurrentWorkspaceCallback`は、ワークスペース・マネージャが 新しいワークスペースに切り替えられたときに必ず呼び出される アプリケーション・コールバックを登録します。 詳細は、`DtWsmAddCurrentWorkspaceCallback`(3)のマニュアル・ページを参照してください。

`DtWsmWorkspaceModifiedCallback`は、ワークスペースが追加、削除、または変更されたときに必ず呼び出される アプリケーション・コールバックを登録します。 詳細は、`DtWsmWorkspaceModifiedCallback`(3) のマニュアル・ページを参照してください。

### ワークスペースの切り替えを監視するには

1. `
   DtWsmAddCurrentWorkspaceCallback`を使用します。

デモ・プログラム`wsinfo.c`では、この関数はトップレベル・ウィジェットが実体化された後で呼び出されます。

    DtWsmAddCurrentWorkspaceCallback (toplevel, wschangecb, NULL);

- `toplevel`は、アプリケーションのトップレベル ・ウィジェットです。

- `wschangecb`は、呼び出される関数の名前です。

- `NULL`は、コールバックに渡されるクライアント・データのパラメータです。 この場合、データは渡されません。

### 他のワークスペースの変更を監視するには

1. `
   DtWsmWorkspaceModifiedCallback`を使用します。

       DtWsmWorkspaceModifiedCallback (toplevel, wschangecb, NULL);

   - `toplevel`は、アプリケーションのトップレベル・ウィジェットです。

   - `wschangecb`は、呼び出される関数の名前です。

   - `NULL`は、コールバックに渡されるクライアント・データのパラメータです。 この場合、データは渡されません。