2016-09-22 5 views
1

Ich versuche Touch-Ereignisse (TOUCH_BEGIN, TOUCH_UPDATE, TOUCH_END und TOUCH_OWNERSHIP) im Stammfenster zu hören.
Berührungsereignisse sind nicht direkt in XCB integriert, daher muss ich die Eingabeerweiterung (libxcb-xinput) verwenden.So registrieren Sie Ereignisse mit libxcb-xinput

Ich habe bereits einen Ereignis-Listener für Ereignisse eingerichtet, die von der Eingabeerweiterung kommen, aber ich kann nicht herausfinden, wie ich Ereignisse, die ich hören möchte, registriere.

Ich versuchte xcb_input_xi_select_events(), aber diese Funktion nimmt einen Parameter vom Typ xcb_input_event_mask_t verwendet, während die Enumeration der Masken vom Typ Ereignis enthalten ist xcb_input_ xi _event_mask_t und es gibt keine offensichtliche Möglichkeit, sie zu werfen.

Aus diesem Grund denke ich, dass xcb_input_xi_select_events() die falsche Funktion ist, aber ich habe keine Ahnung, welche Funktion stattdessen verwendet werden soll.

Mein nicht funktionierenden Code sieht derzeit wie folgt aus:

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); 

Der Kern wirft eine „große Ganzzahl implizit in unsigned Typ abgeschnitten“ bei der Kompilierung Warnung und nur ein „Fehler Anfrage: (null) (null): 0x000000D5 "Fehler zur Laufzeit.

(Ich bin ziemlich neu in C und besonders XCB, also bitte keine offensichtlichen Fehler verzeihen)

Antwort

1

Ich habe eine Lösung gefunden.
Vielen Dank an 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 
); 

Es sieht ein wenig kryptisch, aber es funktioniert.

1

Sie müssen zusammen xcb_input_event_mask_t und xcb_input_xi_event_mask_t verwenden, auf folgende Weise:

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); 

Haftungsausschluss: Ich habe das nie benutzt. Ich habe ein einziges Anwendungsbeispiel auf dem Netz here gefunden. Ich habe versucht, diese Verwendung gegen die Quelle von xcb_input_xi_select_eventshere zu überprüfen, aber der Code ist expletive gelöscht unlesbar. Ich habe keine Ahnung, wie genau diese Bibliothek in der Lage sein soll.

+0

Aus dem Lesen des Kommentars zu dem Beispiel, das Sie verknüpft haben ("Greifen Sie die Eingabeereignisse nicht-invasiv mit XInput") würde ich vermuten, dass dies Berührungsereignisse registriert, ohne dass andere Fenster sie empfangen, während mein Ziel ist, die Ereignisse zu greifen , so dass andere Fenster sie nur bekommen, wenn ich die Ereignisse ablehne (Sorry, dass ich das in meiner Frage nicht klargestellt habe). Inzwischen habe ich eine andere Lösung gefunden, die ich gleich veröffentlichen werde. Auch xcb-xinput-Code ist nicht lesbar, weil, soweit ich weiß, es irgendwie automatisch aus den Protokoll-Spezifikationen erzeugt wird;) – freundTech

Verwandte Themen