忍者ブログ

素人翻訳

適当に翻訳する。

X11、INCR プロパティを用いたセレクション・データの転送

 X11には、クライアント間通信の仕組みとして、セレクション機構が用意されている。

 セレクション機構を使ってクライアント間でデータを転送する時、転送するデータが大き過ぎるなら、分割して転送する。これは Incremental 転送と呼ばれる。INCR という型のプロパティを用いる。

 INCR プロパティを用いたセレクション・データの転送は、以下の手順で行う(図の後に説明がある)。

(1)要求者→Xサーバ[XConvertSelection]
  セレクションを要求するクライアント(要求者)が関数 XConvertSelection を呼び出す。これによって、セレクション・データが欲しいことを X サーバに伝える。(要求者が XSelectInput を使って SelectionNotify イベントの配信を依頼する必要はない。)
(2)Xサーバ→所有者[SelectionRequest]
  X サーバは、セレクション・データの要求があったことをセレクションの所有者に伝える為に SelectionRequest イベントを発行する。
(3)所有者→Xサーバ[XChangeProperty]
  セレクションの所有者は、通常、関数 XChangeProperty を用いて、指定されたウィンドウの指定されたプロパティに指定された型でセレクション・データを格納する。しかし、セレクションの中身のデータ量が一度に転送できる分量より多い場合、先ずセレクション・データの大きさを伝えるために、関数 XChangeProperty を用いて、指定されたウィンドウの指定されたプロパティに INCR 型で(int整数で)セレクション・データの大きさを格納する。
(4)所有者→Xサーバ[XSelectInput]
  同時にセレクションの所有者は XSelectInput を用いて、X サーバに PropertyNotify イベントの配信を依頼する。
(5)所有者→Xサーバ[XSendEvent]
  さらに、セレクションの所有者は、どこのウィンドウの何というプロパティに INCR 型のデータを格納したのかを XSelectionEvent 構造体に記述し、これを要求者へ届けるよう XSendEvent で X サーバに依頼する。
(6)Xサーバ→要求者[SelectionNotify]
  X サーバは、XSendEvent を受けて、SelectionNotify イベントを要求者に転送する。
(7)要求者→Xサーバ[XSelectInput]
  セレクションの要求者は、受け取った SelectionNotify イベントを見て、指定したプロパティに格納されているのが INCR 型の整数値であることを知る。そして、Incremental 転送(分割転送)を開始するべく、PropertyChangeMask を指定して XSelectInput を呼び出す。
(8)要求者→Xサーバ[XDeleteProperty]
  セレクションの要求者は次いで、XDeleteProperty を呼び出し、INCR 型データの入ったプロパティを削除するよう X サーバに依頼する。
(9)Xサーバ→所有者→Xサーバ[PropertyNotify、XChangeProperty]
  「state」に PropertyDelete が入った PropertyNotify イベントを初めて受け取った所有者は、引数 mode に PropModeReplace を指定して関数 XChangeProperty を呼び出し、最初の SelectionRequest で指定されたウィンドウ、プロパティ、型に従ってセレクション・データの一部を書き込む。
---以下繰り返し---
(10)Xサーバ→要求者→Xサーバ→要求者[PropertyNotify、XGetWindowProperty]
  「state」に PropertyNewValue が入った PropertyNotify イベントを受け取った要求者は、引数 delete に True を指定して関数 XGetWindowProperty を呼び出し、新たに書き込まれたデータを読み込む。この時、取得したデータの長さが 0 であれば、前回の転送でセレクション・データを全て取得し終えたということなので、この繰り返しから抜ける。
(11)Xサーバ→所有者→Xサーバ[PropertyNotify、XChangeProperty]
  「state」に PropertyDelete が入った PropertyNotify イベントを受け取った所有者は、引数 mode に PropModeAppend を指定して関数 XChangeProperty を呼び出し、データの続きの一部を上と同じプロパティに書き込む。但し、前回の転送で全データの引き渡しが済んでいた場合、同プロパティには長さ 0 のデータ(NULL)を書き込む。
---繰り返しここまで---
(12)要求者→Xサーバ[XDeleteProperty]
  長さ 0 のデータを受け取った要求者は、関数 XDeleteProperty を呼び出し、使用したプロパティを削除する。
(13)終わり。

 xsel-1.2.0 では、所有者は全データの転送完了後に property 部が None の XSelectionEvent 構造体を使用して SelectionNotify を送信している。多分、送信しなくても良い。分割転送が途中で失敗した場合は、SelectionNotify で通知する。

★★★

 INCR Property、Selection Mechanism、Incremental Transfer、セレクション・メカニズム、順次転送、分割転送

PR

X11 セレクション機構

 X11 には、アプリケーション間でデータを共有するための仕組みが備わっている。カット・バッファ、セレクション・メカニズムなど。

 カットバッファとセレクションは似たものだが、違いもある。カット・バッファのデータは、Xサーバが管理するものと考えて良い。一方、セレクションのデータは、アプリケーション側で管理しなければならない。このため、セレクション・データの「所有者」「要求者」といった概念が必要になり、やり取りも複雑。

 以下、セレクション・データの受け渡し方法の概略を述べる。

----------

(1)セレクションの内容を取得したいクライアント(要求者)は、同セレクションの所有者に対して、セレクション・データをクライアントが望む形式に変換し、変換後のセレクション・データを何処かのウィンドウのプロパティに格納するよう依頼する。

(2)セレクションの所有者は、セレクション・データの要求を受けたら、指定された形式にデータを変換し、何処かのウィンドウの適当なプロパティに同データを格納し、同ウィンドウと同プロパティの情報を要求者に通知する。指定された形式にデータを変換できなかった場合は、その旨を要求者に通知する

(3)要求者は、通知されたウィンドウ・プロパティからセレクション・データを取得する。

-----

 更に詳しく関数・Xイベントの流れを見ると、以下のようになる。

----------

(1)クライアント(要求者)が関数 XConvertSelection を呼び出して、セレクション・データを取得したいということを X サーバに伝える。

(2)X サーバは、セレクションを所有しているクライアント(所有者)に対して、イベント SelectionRequest を送信し、要求があったことと要求の内容とを伝える。

(3)イベント SelectionRequest を受け取ったセレクションの所有者は、指定された形式にセレクション・データを変換し、関数 XChangeProperty を呼び出して、適当なウィンドウの適当なプロパティに変換済みデータを格納する。

(4)セレクションの所有者は、次いで関数 XSendEvent を呼び出し、セレクション・データが何処のウィンドウの何というプロパティに格納されているのかを X サーバに通知する。

(5)X サーバは、関数 XSendEvent の呼び出しを受けて、イベント SelectionNotify を配信し、先の要求者に対して(4)の情報を伝達する。

(6)イベント SelectionNotify を受け取った要求者は、同イベントが運んできた情報を用いて関数 XGetWindowProperty を呼び出し、指定されたウィンドウの指定されたプロパティからセレクション・データを取り出したいと X サーバに伝える。

(7)X サーバは、関数 XGetWindowProperty の呼び出しを受けて、指定されたプロパティに格納されているデータを要求者に送信する。

(8)セレクション・データを受け取った要求者は、関数 XDeleteProperty を呼び出して、セレクション・データの運搬に利用したプロパティの削除を X サーバに要求する。

(9)X サーバは、使用済みプロパティを削除した上でイベント PropertyNotify を配信する。この PropertyNotify を受けて、セレクションの所有者はデータの受け渡しが完了したことを知る。

----------

 終わり。

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

最新コメント

[08/18 NONAME]
[05/18 NONAME]
[04/09 NONAME]
[03/21 NONAME]
[03/20 NONAME]

最新記事

ブログ内検索

広告

バーコード

広告