2016-03-17 1 views
0

Je crée un addon dans Firefox, j'ai donc un ChromeWorker - qui est un WebWorker privilégié. Ceci est juste un fil autre que le thread principal.La boucle d'événement XCB ne reçoit aucun événement

Ici j'ai pas de code mais (modifié pour ressembler pas js-ctypes [qui est la langue addons])

Au démarrage, je lance ce code, conn est une variable globale:

conn = xcb_connect(null, null); 

Puis je lance ceci dans un intervalle 200ms:

evt = xcb_poll_for_event(conn); 
console.log('evt:', evt); 

if (!evt.isNull()) { 
    console.log('good got an event!!'); 
    ostypes.API('free')(evt); 
} 

Cependant evt est toujours null, je ne suis jamais gettin g tous les événements. Mon but est d'obtenir tous les événements sur le système.

Quelqu'un sait ce qui peut causer quelque chose d'aussi simple à ne pas fonctionner?

J'ai essayé

xcb_change_window_attributes (conn, screens.data->root, XCB_CW_EVENT_MASK, values); 

Mais cela n'a pas résolu ce :(

La seule façon que je peux obtenir de travailler est en faisant xcb_create_windowxcb_map_window, mais je ne reçois que les événements qui se produisent dans cette fenêtre créée

Répondre

1

Vous ne recevez pas simplement tous les événements par magie en ouvrant une connexion.Il y a seulement très peu de messages tous les clients recevront, comme les messages des clients, la plupart des autres rs ne sera envoyé à un client que s'il s'est explicitement inscrit pour les recevoir. Et oui, cela signifie que vous devez les enregistrer sur chaque fenêtre, ce qui implique à la fois d'explorer l'arbre et d'écouter les fenêtres créées, mappées, non mappées et détruites et de s'enregistrer sur elles.

Cependant, je réexaminerait si

Mon but est d'obtenir tous les événements du système.

n'est pas un problème A-B. Pourquoi avez-vous besoin de tous les événements? Que veux-tu réellement faire?

+0

Merci beaucoup Ingo pour votre réponse Je suis toujours aux prises avec cela, j'essaie de dépanner et d'éteindre. À partir d'un thread engendré (non-thread principal), j'essaye de créer un raccourci global. J'ai créé un outil de capture d'écran - https://addons.mozilla.org/en-US/firefox/addon/nativeshot/ - c'est un addon pour firefox. Il utilise js-ctypes pour utiliser des méthodes natives. Les gens demandent que j'autorise une option pour que les utilisateurs définissent leur clé "PrtScn" comme raccourci global pour déclencher ma capture d'écran. Donc je me bats avec ça. – Noitidart

+1

Pour cela, tout ce que vous devez faire est de saisir la clé sur la fenêtre racine via xcb_grab_key. Bien sûr, vous ne pouvez le faire que si aucune autre application n'a attrapé la clé, voir la documentation pour cela (et peut-être l'équivalent Xlib, XGrabKey). –

+1

Addendum: si vous voulez que cela fonctionne sans saisir la clé, vous pouvez utiliser l'extension Xinput2, qui est un peu plus de travail et moins directe. Mais d'une manière générale, xcb_grab_key devrait suffire. C'est aussi la façon dont les gestionnaires de fenêtres le font, par exemple. –