XCBのリクエスト処理 `xcb-requests(3)`を読んでまとめただけ。 Xクライアントがサーバに対して送るリクエストは2種類ある。 * リプライを要求しないもの * 単純に要求のみを行うもの。例えば`MapRequest` * リクエストの結果は、それが成功したか失敗したかのみ * リプライを要求するもの * 「何かを取得する」リクエストがこれにあたる。例えば`InternAtom` * リクエスト成功時はリプライが来る * 複数のリクエストを連続して行う場合、最初に全てのリクエストを送ってからリプライを取得すると効率がよい * 理由は[[http://xcb.freedesktop.org/tutorial/|ここ]]に書いてある * 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