2016-09-22 10 views
1

私は、ルートウィンドウでタッチイベント(TOUCH_BEGIN、TOUCH_UPDATE、TOUCH_END、TOUCH_OWNERSHIP)を待ち受けようとしています。
タッチイベントはXCBに直接統合されていないため、入力拡張(libxcb-xinput)を使用する必要があります。libxcb-xinputを使ってイベントを登録するには

入力拡張機能からのイベントのイベントリスナーを既に設定していましたが、聞きたいイベントを登録する方法がわかりません。

私はxcb_input_xi_select_eventsを()イベントマスクを含むenumがxcb_input_ XI _event_mask_tのタイプがあり、それらをキャストする明白な方法はありませんが、しかし、その機能は、タイプxcb_input_event_mask_tのパラメータを取ります使用してみました。

私はxcb_input_xi_select_events()が間違った機能だと思っていますが、代わりに何の機能を使うべきか分かりません。

私の非作業コードは、現在のようになります(ヌル)、(ヌル:

xcb_input_event_mask_t mask[] = { 
    XCB_INPUT_XI_EVENT_MASK_TOUCH_BEGIN 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_END 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_UPDATE 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_OWNERSHIP 
}; 
xcb_input_xi_select_events(dpy, root, 4, mask); 

コアは、コンパイル時に警告「unsigned型に暗黙的に切り捨て大きな整数」とばかり」失敗したリクエストを投げます):0x000000D5 "エラーが発生しました。

(私はCと特にXCBにはかなり新しいですので、任意の明白な誤差はご容赦ください)

答えて

1

私はこれに対する解決策を見つけました。
https://github.com/eemikula/touchwmに大きな感謝します。

const uint32_t mask[] = { 
    XCB_INPUT_XI_EVENT_MASK_TOUCH_BEGIN 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_UPDATE 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_END 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_OWNERSHIP 
}; 
const uint32_t modifiers[] = {XCB_INPUT_MODIFIER_MASK_ANY}; 

xcb_input_xi_passive_grab_device(
    dpy, 
    XCB_CURRENT_TIME, 
    root, 
    XCB_CURSOR_NONE, 
    0, // detail - as used by XIPassiveGrab 
    XCB_INPUT_DEVICE_ALL_MASTER, 
    1, // num_modifiers 
    1, // mask_len 
    XCB_INPUT_GRAB_TYPE_TOUCH_BEGIN, 
    XCB_INPUT_GRAB_MODE_22_TOUCH, 
    XCB_INPUT_GRAB_MODE_22_ASYNC, 
    XCB_INPUT_GRAB_OWNER_NO_OWNER, 
    mask, 
    modifiers 
); 

それは少し不可解に見えるが、それは動作します。

1

あなたは次のように、一緒にxcb_input_event_mask_txcb_input_xi_event_mask_tを使用する必要があります。

struct { 
    xcb_input_event_mask_t head;  // describes the subsequent xcb_input_xi_event_mask_t (or an array thereof) 
    xcb_input_xi_event_mask_t mask; 
} mask; 

mask.head.deviceid = XCB_INPUT_DEVICE_ALL; 
mask.head.mask_len = sizeof(mask.mask)/sizeof(uint32_t); 

mask.mask = XCB_INPUT_XI_EVENT_MASK_TOUCH_BEGIN 
| XCB_INPUT_XI_EVENT_MASK_TOUCH_END 
| XCB_INPUT_XI_EVENT_MASK_TOUCH_UPDATE 
| XCB_INPUT_XI_EVENT_MASK_TOUCH_OWNERSHIP; 

xcb_input_xi_select_events(dpy, root, 1, &mask.head); 

免責事項:私はこれを使ったことがありません。私は 'net hereの1つの使用例を見つけました。私はxcb_input_xi_select_eventshereのソースに対してこの使用法を検証しようとしましたが、そのコードはで完全に削除されています。は読めません。私は、人々がこのライブラリをどのように使用できるべきかを少しは考えていません。

+0

リンクした例のコメント(「XInputを使用して非侵襲的に入力イベントを取得する」)から、私は目標がイベントを取得する間に、他のウィンドウを受信することを防ぐことなくタッチイベントを登録すると思います他のウィンドウはイベントを拒否したときにしか表示されません(申し訳ありませんが、私の質問ではそれを明確にしていません)。 今まで私は別の解決策を見つけました。 xcb-xinputのコードは読めません。私が知っている限り、何とかプロトコル仕様から自動生成されているからです)。 – freundTech

関連する問題