I have two snippets, in C and Nim which _supposed_ to be exact copies of 
eachother. 
    
    
    #include <stdio.h>
    #include <X11/Xlib.h>
    #include <X11/XKBlib.h>
    
    typedef struct keymap {
      int keycode_high;
      int keycode_low;
    } keymap_t;
    
    keymap_t keymap_new(Display *dpy) {
      keymap_t result;
      XDisplayKeycodes(dpy, &(result.keycode_low), &(result.keycode_high));
      XkbDescPtr desc = XkbGetMap(dpy, XkbAllClientInfoMask, XkbUseCoreKbd);
      for (int keycode = result.keycode_low; keycode <= result.keycode_high; 
keycode++) {
        int groups = XkbKeyNumGroups(desc, keycode);
        printf("%d\n", groups);
      }
      XkbFreeClientMap(desc, 0, 1);
      return result;
    }
    
    int main(){
        Display *dpy = XOpenDisplay(NULL);
        keymap_t x = keymap_new(dpy);
        XCloseDisplay(dpy);
    }
    
    
    Run
    
    
    import x11/[xlib, xkblib]
    import x11/xkb except X_kbGetMap
    
    type Keymap = object
      keycodeHigh, keycodeLow: cint
    
    proc newKeymap(display: PDisplay): Keymap =
      discard XDisplayKeycodes(display, addr result.keycodeLow, addr 
result.keycodeHigh)
      let desc = XkbGetMap(display, XkbAllClientInfoMask, XkbUseCoreKbd)
      for keycode in result.keycodeLow..result.keycodeHigh:
        let groups = XkbKeyNumGroups(desc, keycode.int16)
        echo groups
      XkbFreeClientMap(desc, 0, true)
    
    let
      display = XOpenDisplay(nil)
      keymap = newKeymap(display)
    
    discard XCloseDisplay display
    
    
    Run

They are supposed to have same output, but it differs, which in nim version can 
lead to segfaults in further usage of returned data. I looked at structure 
definitions in bindings and they seem correct, so im out of ideas now.

Reply via email to