2010-06-23 4 views
2

Dans la JNA, comment vous associez une structure syndicale comme le XEvent suivant de Xlibstructure syndicale JNA cartographie

typedef union _XEvent { 
    int type; /* must not be changed */ 
    XAnyEvent xany; 
    XKeyEvent xkey; 
    XButtonEvent xbutton; 
    XMotionEvent xmotion; 
    XCrossingEvent xcrossing; 
    XFocusChangeEvent xfocus; 
    XExposeEvent xexpose; 
    XGraphicsExposeEvent xgraphicsexpose; 
    XNoExposeEvent xnoexpose; 
    XVisibilityEvent xvisibility; 
    XCreateWindowEvent xcreatewindow; 
    XDestroyWindowEvent xdestroywindow; 
    XUnmapEvent xunmap; 
    XMapEvent xmap; 
    XMapRequestEvent xmaprequest; 
    XReparentEvent xreparent; 
    XConfigureEvent xconfigure; 
    XGravityEvent xgravity; 
    XResizeRequestEvent xresizerequest; 
    XConfigureRequestEvent xconfigurerequest; 
    XCirculateEvent xcirculate; 
    XCirculateRequestEvent xcirculaterequest; 
    XPropertyEvent xproperty; 
    XSelectionClearEvent xselectionclear; 
    XSelectionRequestEvent xselectionrequest; 
    XSelectionEvent xselection; 
    XColormapEvent xcolormap; 
    XClientMessageEvent xclient; 
    XMappingEvent xmapping; 
    XErrorEvent xerror; 
    XKeymapEvent xkeymap; 
    long pad[24]; 
} XEvent; 

Je veux être en mesure plus tard pour lancer la XEvent dans la JNA à d'autres événements (comme XKeyEvent, XButtonEvent, XMotionEvent ... etc) basé sur le type de l'événement reçu.

Je ne demande pas une cartographie complète pour toutes les structures ci-dessus. Une explication claire avec un petit exemple sur la façon de le faire sera suffisante.

Merci

Répondre

1

Les sources de la JNA fournissent déjà des exemples pour xlib.

Ceci est décrit ici. L'implémentation peut être trouvée dans les sources jna sous le dossier contrib. here

Plus précisément pour XEvent il est défini comme:

public static class XEvent extends Union { 
    public int type; 
    public XAnyEvent xany; 
    public XKeyEvent xkey; 
    public XButtonEvent xbutton; 
    public XMotionEvent xmotion; 
    public XCrossingEvent xcrossing; 
    public XFocusChangeEvent xfocus; 
    public XExposeEvent xexpose; 
    public XGraphicsExposeEvent xgraphicsexpose; 
    public XNoExposeEvent xnoexpose; 
    public XVisibilityEvent xvisibility; 
    public XCreateWindowEvent xcreatewindow; 
    public XDestroyWindowEvent xdestroywindow; 
    public XUnmapEvent xunmap; 
    public XMapEvent xmap; 
    public XMapRequestEvent xmaprequest; 
    public XReparentEvent xreparent; 
    public XConfigureEvent xconfigure; 
    public XGravityEvent xgravity; 
    public XResizeRequestEvent xresizerequest; 
    public XConfigureRequestEvent xconfigurerequest; 
    public XCirculateEvent xcirculate; 
    public XCirculateRequestEvent xcirculaterequest; 
    public XPropertyEvent xproperty; 
    public XSelectionClearEvent xselectionclear; 
    public XSelectionRequestEvent xselectionrequest; 
    public XSelectionEvent xselection; 
    public XColormapEvent xcolormap; 
    public XClientMessageEvent xclient; 
    public XMappingEvent xmapping; 
    public XErrorEvent xerror; 
    public XKeymapEvent xkeymap; 
    public NativeLong[] pad = new NativeLong[24]; 
} 

Je suis en train d'apprendre moi-même la JNA, mais je crois que l'idée est de vérifier la valeur de type et uniquement référence au champ d'événement correspondant. Les autres devraient être nuls. Je ne pense pas qu'il soit possible de le faire à travers un casting.

+0

Avez-vous essayé? J'ai essayé le code dans contrib avec XGrabKeyboard avec XNextEvent. Il renvoie le XEvent et le type est KeyPress/KeyRelease, cependant, quand j'accède au event.xkey.keycode, je reçois toujours zéro quelle que soit la touche enfoncée. Si vous avez essayé avec succès, alors je marquerai votre réponse comme correcte, comme peut-être le problème est ailleurs dans mon code. – Untitled

2

Utilisez les correspondances définies dans la contrib JNA (com.sun.jna.platform.X11), puis procédez comme suit:

  1. Obtenez le XEvent en utilisant les moyens yo préfèrent (par exemple XNextEvent).
  2. Déterminez le type de l'événement à l'aide du champ de type.
  3. En fonction du type, appelez la méthode readFiled avec le nom du champ (dans la chaîne) et transtypez la valeur renvoyée dans le type d'événement du nom du champ.

Exemple:

XEvent event = new XEvent(); 
X11.INSTANCE.XNextEvent(display, event); 
if(event.type == X11.KeyPress) { 
    XKeyEvent xKey = (XKeyEvent)event.readField("xkey"); 
    // you can now use xKey.keycode and other fields 
} 
+0

Yay! Bonne réponse, ça m'a beaucoup aidé avec mes mappages SDL2, merci. –