Отображение структуры соединения JNA - PullRequest
2 голосов
/ 23 июня 2010

В JNA, как вы отображаете структуру объединения, как следующий XEvent из Xlib

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;

Я хочу иметь возможность позже привести XEvent в JNA к другим событиям (таким как XKeyEvent, XButtonEvent,XMotionEvent ... и т. Д.) В зависимости от типа полученного события.

Я не прошу полного сопоставления для всех вышеперечисленных структур.Достаточно четкого объяснения с небольшим примером того, как это сделать.

Спасибо

Ответы [ 2 ]

2 голосов
/ 25 июня 2010

Используйте сопоставления, определенные в contrib JNA (com.sun.jna.platform.X11), затем выполните следующие действия:

  1. Получите XEvent, используя тот метод, который вы предпочитаете (например, XNextEvent).
  2. Определите тип события, используя поле типа.
  3. В зависимости от типа вызовите метод readFiled с именем поля (в строке) и приведите возвращенное значение к типу события имени поля.

Пример:

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
}
1 голос
/ 24 июня 2010

Источники для JNA уже предоставляют примеры для xlib.

Это описано здесь. здесь

Реализацию можно найти в источниках jna в папке contrib.

Специально для XEvent это определяется как:

    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];
}

Я все еще изучаю JNA, но думаю, что идея состоит в том, чтобы проверить значение типа, а затем обратиться только к соответствующему полю события. Остальные должны быть нулевыми. Я не думаю, что это возможно сделать через актерский состав.

...