Ich versuche, über eine Zeigerbewegung benachrichtigt zu werden. Da ich nicht als Fenster-Manager ausführen möchte, muss ich für alle Fenster festlegen, die ich sowohl beim Start als auch beim Erstellen eines Benachrichtigungsereignisses erstelle.XCB - Ich erhalte keine Benachrichtigung über Bewegungsereignisse in allen Fenstern
Dies scheint im Allgemeinen gut zu funktionieren, und ich erhalte Bewegung benachrichtigen Ereignisse in allen Fenstern. Dies gilt jedoch nicht für Google Chrome-Fenster. Ich habe die Ereignismaske überprüft, indem ich sie explizit danach abgefragt habe und sie korrekt gesetzt wurde. Ich sehe in der Ausbreitungsmaske auch nichts Ungewöhnliches.
Was könnte dazu führen, dass Google Chrome keine Benachrichtigungsereignisse meldet? AFAIK, das X-Protokoll erlaubt das nicht, außer für aktive Pointergreifer, die Chrome sicher nicht hat.
So registriere ich mich in allen vorhandenen Fenstern. Ich nenne register_events
auf den Root-Fenstern und wenn ich auch eine erstellen benachrichtigt Veranstaltung erhalten:
static void register_events(xcb_window_t window) {
xcb_void_cookie_t cookie = xcb_change_window_attributes_checked(connection,
window, XCB_CW_EVENT_MASK, (uint32_t[]) { XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_LEAVE_WINDOW });
xcb_generic_error_t *error = xcb_request_check(connection, cookie);
if (error != NULL) {
xcb_disconnect(connection);
errx(EXIT_FAILURE, "could not subscribe to events on a window, bailing out");
}
}
static void register_existing_windows(void) {
xcb_query_tree_reply_t *reply;
if ((reply = xcb_query_tree_reply(connection, xcb_query_tree(connection, root), 0)) == NULL) {
return;
}
int len = xcb_query_tree_children_length(reply);
xcb_window_t *children = xcb_query_tree_children(reply);
for (int i = 0; i < len; i++) {
register_events(children[i]);
}
xcb_flush(connection);
free(reply);
}
Was bekommen Sie von 'xev', wenn Sie es an ein Chome-Fenster anhängen? –
@AndrewHenle Wenn ich es anschließe und meine Maus dorthin bewege, es umherbewege, es ruhen lasse und das Fenster wieder verlasse, bekomme ich nur Enter/LeaveNotify, KeymapNotify und FocusIn/Out (http://pastebin.com/XQ3ZkVhW) –
sollte ich auch weisen darauf hin, dass die gleiche Beobachtung mit Chrom auf einer anderen Maschine gemacht werden kann. –