XCBのリクエスト処理
xcb-requests(3)を読んでまとめただけ。
Xクライアントがサーバに対して送るリクエストは2種類ある。
- リプライを要求しないもの
単純に要求のみを行うもの。例えばMapRequest
- リクエストの結果は、それが成功したか失敗したかのみ
- リプライを要求するもの
「何かを取得する」リクエストがこれにあたる。例えばInternAtom
- リクエスト成功時はリプライが来る
- 複数のリクエストを連続して行う場合、最初に全てのリクエストを送ってからリプライを取得すると効率がよい
理由はここに書いてある
- Xlibではリクエストの送信とリプライの取得が不可分なので、これができない
この2種類について、エラーハンドリングの方法が2つづつ(checkedとunchecked)あり、合計2*2=4通りの方法が存在する。
- リプライなし、unchecked(デフォルト)
- リクエストを投げるときは対応する関数を呼ぶだけ。リプライがないので本当にそれだけ
- エラーはイベントループで検出
- リプライなし、checked
XXX_checkedのように、関数名に_checkedというサフィックスがつく
帰ってきたcookieをxcb_request_checkに渡すとエラーの有無が分かる
- 成功/失敗の確定を待つので遅くなる。失敗した場合先に進んではいけない(エラー処理が必要な)場合に使う
- リプライあり、checked(デフォルト)
- checkedだがリプライなしの方とは違ってサフィックスはない
XXXという関数に対してXXX_replyという関数でリプライを取得する
エラーをその場で拾いたい場合はこちら。XXX_replyの第3引数でエラーを取得できる
- リプライあり、unchecked
今度は逆に_uncheckedというサフィックスがつく
- リプライの取得方法は同じ。エラーはイベントループで検出
エラーが発生しても気にせず処理を続ける場合はこちら。XXX_replyの第3引数はNULLにする
Xlibと違って、リクエストは対応する関数を実行しただけでは送信されない(バッファリングされる)。リクエストが送信される条件は以下の通り。
- リクエストに対応するリプライを取得する
- バッファが埋まる
xcb_flush()が呼ばれる
ソース: http://lists.freedesktop.org/archives/xcb/2008-December/004152.html