about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-10-12 10:45:21 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-10-12 10:45:21 +0200
commitefd103004c770e8ec4646c11c24b92a5d8d49e54 (patch)
tree354c6e648b293ca8bd02a7ced16202ebc41ebaa9 /src/libtools
parent18e033cdd8520840110222e00da0c16d51f69fe0 (diff)
downloadbox64-efd103004c770e8ec4646c11c24b92a5d8d49e54.tar.gz
box64-efd103004c770e8ec4646c11c24b92a5d8d49e54.zip
[BOX32] Improved X11 event handling
Diffstat (limited to 'src/libtools')
-rw-r--r--src/libtools/my_x11_conv.c549
-rw-r--r--src/libtools/my_x11_conv.h13
-rw-r--r--src/libtools/my_x11_defs.h270
-rw-r--r--src/libtools/my_x11_defs_32.h269
-rw-r--r--src/libtools/my_x11_xevent.c1351
-rwxr-xr-xsrc/libtools/myalign32.c4
6 files changed, 1981 insertions, 475 deletions
diff --git a/src/libtools/my_x11_conv.c b/src/libtools/my_x11_conv.c
index 6f8bd50d..b4f4b091 100644
--- a/src/libtools/my_x11_conv.c
+++ b/src/libtools/my_x11_conv.c
@@ -12,478 +12,6 @@
 #include "my_x11_defs_32.h"
 #include "my_x11_conv.h"
 
-void convertXEvent(my_XEvent_32_t* dst, my_XEvent_t* src)
-{
-    if(!src->type) {
-        // This is an XErrorEvent, and it's different!
-        dst->xerror.type = src->xerror.type;
-        dst->xerror.display = to_ptrv(FindDisplay(src->xerror.display));
-        dst->xerror.resourceid = to_ulong(src->xerror.resourceid);
-        dst->xerror.serial = to_ulong(src->xerror.serial);
-        dst->xerror.error_code = src->xerror.error_code;
-        dst->xerror.request_code = src->xerror.request_code;
-        dst->xerror.minor_code = src->xerror.minor_code;
-        return;
-    }
-    // convert the XAnyEvent first, as it's a common set
-    dst->type = src->type;
-    dst->xany.display = to_ptrv(FindDisplay(src->xany.display));
-    dst->xany.window = to_ulong(src->xany.window);
-    dst->xany.send_event = src->xany.serial;
-    dst->xany.serial = to_ulong(src->xany.serial);
-    switch(src->type) {
-        case XEVT_KeyPress:
-        case XEVT_KeyRelease:
-            dst->xkey.root = to_ulong(src->xkey.root);
-            dst->xkey.subwindow = to_ulong(src->xkey.subwindow);
-            dst->xkey.time = to_ulong(src->xkey.time);
-            dst->xkey.x = src->xkey.x;
-            dst->xkey.y = src->xkey.y;
-            dst->xkey.x_root = src->xkey.x_root;
-            dst->xkey.y_root = src->xkey.y_root;
-            dst->xkey.state = src->xkey.state;
-            dst->xkey.keycode = src->xkey.keycode;
-            dst->xkey.same_screen = src->xkey.same_screen;
-            break;
-        case XEVT_ButtonPress:
-        case XEVT_ButtonRelease:
-            dst->xbutton.root = to_ulong(src->xbutton.root);
-            dst->xbutton.subwindow = to_ulong(src->xbutton.subwindow);
-            dst->xbutton.time = to_ulong(src->xbutton.time);
-            dst->xbutton.x = src->xbutton.x;
-            dst->xbutton.y = src->xbutton.y;
-            dst->xbutton.x_root = src->xbutton.x_root;
-            dst->xbutton.y_root = src->xbutton.y_root;
-            dst->xbutton.state = src->xbutton.state;
-            dst->xbutton.button = src->xbutton.button;
-            dst->xbutton.same_screen = src->xbutton.same_screen;
-            break;
-        case XEVT_MotionNotify:
-            dst->xmotion.root = to_ulong(src->xmotion.root);
-            dst->xmotion.subwindow = to_ulong(src->xmotion.subwindow);
-            dst->xmotion.time = to_ulong(src->xmotion.time);
-            dst->xmotion.x = src->xmotion.x;
-            dst->xmotion.y = src->xmotion.y;
-            dst->xmotion.x_root = src->xmotion.x_root;
-            dst->xmotion.y_root = src->xmotion.y_root;
-            dst->xmotion.state = src->xmotion.state;
-            dst->xmotion.is_hint = src->xmotion.is_hint;
-            dst->xmotion.same_screen = src->xmotion.same_screen;
-            break;
-        case XEVT_EnterNotify:
-        case XEVT_LeaveNotify:
-            dst->xcrossing.root = to_ulong(src->xcrossing.root);
-            dst->xcrossing.subwindow = to_ulong(src->xcrossing.subwindow);
-            dst->xcrossing.time = to_ulong(src->xcrossing.time);
-            dst->xcrossing.x = src->xcrossing.x;
-            dst->xcrossing.y = src->xcrossing.y;
-            dst->xcrossing.x_root = src->xcrossing.x_root;
-            dst->xcrossing.y_root = src->xcrossing.y_root;
-            dst->xcrossing.mode = src->xcrossing.mode;
-            dst->xcrossing.detail = src->xcrossing.detail;
-            dst->xcrossing.same_screen = src->xcrossing.same_screen;
-            dst->xcrossing.focus = src->xcrossing.focus;
-            dst->xcrossing.state = src->xcrossing.state;
-            break;
-        case XEVT_FocusIn:
-        case XEVT_FocusOut:
-            dst->xfocus.mode = src->xfocus.mode;
-            dst->xfocus.detail = src->xfocus.detail;
-            break;
-        case XEVT_KeymapNotify:
-            memcpy(dst->xkeymap.key_vector, src->xkeymap.key_vector, 32);
-            break;
-        case XEVT_Expose:
-            dst->xexpose.x = src->xexpose.x;
-            dst->xexpose.y = src->xexpose.y;
-            dst->xexpose.width = src->xexpose.width;
-            dst->xexpose.height = src->xexpose.height;
-            dst->xexpose.count = src->xexpose.count;
-            break;
-        case XEVT_GraphicsExpose:
-            dst->xgraphicsexpose.x = src->xgraphicsexpose.x;
-            dst->xgraphicsexpose.y = src->xgraphicsexpose.y;
-            dst->xgraphicsexpose.width = src->xgraphicsexpose.width;
-            dst->xgraphicsexpose.height = src->xgraphicsexpose.height;
-            dst->xgraphicsexpose.count = src->xgraphicsexpose.count;
-            dst->xgraphicsexpose.major_code = src->xgraphicsexpose.major_code;
-            dst->xgraphicsexpose.minor_code = src->xgraphicsexpose.minor_code;
-            break;
-        case XEVT_NoExpose:
-            dst->xnoexpose.major_code = src->xnoexpose.major_code;
-            dst->xnoexpose.minor_code = src->xnoexpose.minor_code;
-            break;
-        case XEVT_VisibilityNotify:
-            dst->xvisibility.state = src->xvisibility.state;
-            break;
-        case XEVT_CreateNotify:
-            dst->xcreatewindow.window = to_ulong(src->xcreatewindow.window);
-            dst->xcreatewindow.x = src->xcreatewindow.x;
-            dst->xcreatewindow.y = src->xcreatewindow.y;
-            dst->xcreatewindow.width = src->xcreatewindow.width;
-            dst->xcreatewindow.height = src->xcreatewindow.height;
-            dst->xcreatewindow.border_width = src->xcreatewindow.border_width;
-            dst->xcreatewindow.override_redirect = src->xcreatewindow.override_redirect;
-            break;
-        case XEVT_DestroyNotify:
-            dst->xdestroywindow.window = to_ulong(src->xdestroywindow.window);
-            break;
-        case XEVT_UnmapNotify:
-            dst->xunmap.window = to_ulong(src->xunmap.window);
-            dst->xunmap.from_configure = src->xunmap.from_configure;
-            break;
-        case XEVT_MapNotify:
-            dst->xmap.window = to_ulong(src->xmap.window);
-            dst->xmap.override_redirect = src->xmap.override_redirect;
-            break;
-        case XEVT_MapRequest:
-            dst->xmaprequest.window = to_ulong(src->xmaprequest.window);
-            break;
-        case XEVT_ReparentNotify:
-            dst->xreparent.window = to_ulong(src->xreparent.window);
-            dst->xreparent.parent = to_ulong(src->xreparent.parent);
-            dst->xreparent.x = src->xreparent.x;
-            dst->xreparent.y = src->xreparent.y;
-            dst->xreparent.override_redirect = src->xreparent.override_redirect;
-            break;
-        case XEVT_ConfigureNotify:
-            dst->xconfigure.window = to_ulong(src->xconfigure.window);
-            dst->xconfigure.x = src->xconfigure.x;
-            dst->xconfigure.y = src->xconfigure.y;
-            dst->xconfigure.width = src->xconfigure.width;
-            dst->xconfigure.height = src->xconfigure.height;
-            dst->xconfigure.border_width = src->xconfigure.border_width;
-            dst->xconfigure.above = to_ulong(src->xconfigure.above);
-            dst->xconfigure.override_redirect = src->xconfigure.override_redirect;
-            break;
-        case XEVT_ConfigureRequest:
-            dst->xconfigurerequest.window = to_ulong(src->xconfigurerequest.window);
-            dst->xconfigurerequest.x = src->xconfigurerequest.x;
-            dst->xconfigurerequest.y = src->xconfigurerequest.y;
-            dst->xconfigurerequest.width = src->xconfigurerequest.width;
-            dst->xconfigurerequest.height = src->xconfigurerequest.height;
-            dst->xconfigurerequest.border_width = src->xconfigurerequest.border_width;
-            dst->xconfigurerequest.above = to_ulong(src->xconfigurerequest.above);
-            dst->xconfigurerequest.detail = src->xconfigurerequest.detail;
-            dst->xconfigurerequest.value_mask = to_ulong(src->xconfigurerequest.value_mask);
-            break;
-        case XEVT_GravityNotify:
-            dst->xgravity.window = to_ulong(src->xgravity.window);
-            dst->xgravity.x = src->xgravity.x;
-            dst->xgravity.y = src->xgravity.y;
-            break;
-        case XEVT_ResizeRequest:
-            dst->xresizerequest.width = src->xresizerequest.width;
-            dst->xresizerequest.height = src->xresizerequest.height;
-            break;
-        case XEVT_CirculateNotify:
-            dst->xcirculate.window = to_ulong(src->xcirculate.window);
-            dst->xcirculate.place = src->xcirculate.place;
-            break;
-        case XEVT_CirculateRequest:
-            dst->xcirculaterequest.window = to_ulong(src->xcirculaterequest.window);
-            dst->xcirculaterequest.place = src->xcirculaterequest.place;
-            break;
-        case XEVT_PropertyNotify:
-            dst->xproperty.atom = to_ulong(src->xproperty.atom);
-            dst->xproperty.time = to_ulong(src->xproperty.time);
-            dst->xproperty.state = src->xproperty.state;
-            break;
-        case XEVT_SelectionClear:
-            dst->xselectionclear.selection = to_ulong(src->xselectionclear.selection);
-            dst->xselectionclear.time = to_ulong(src->xselectionclear.time);
-            break;
-        case XEVT_SelectionRequest:
-            dst->xselectionrequest.requestor = to_ulong(src->xselectionrequest.requestor);
-            dst->xselectionrequest.selection = to_ulong(src->xselectionrequest.selection);
-            dst->xselectionrequest.target = to_ulong(src->xselectionrequest.target);
-            dst->xselectionrequest.property = to_ulong(src->xselectionrequest.property);
-            dst->xselectionrequest.time = to_ulong(src->xselectionrequest.time);
-            break;
-        case XEVT_SelectionNotify:
-            dst->xselection.selection = to_ulong(src->xselection.selection);
-            dst->xselection.target = to_ulong(src->xselection.target);
-            dst->xselection.property = to_ulong(src->xselection.property);
-            dst->xselection.time = to_ulong(src->xselection.time);
-            break;
-        case XEVT_ColormapNotify:
-            dst->xcolormap.colormap = to_ulong(src->xcolormap.colormap);
-            dst->xcolormap.c_new = src->xcolormap.c_new;
-            dst->xcolormap.state = src->xcolormap.state;
-            break;
-        case XEVT_ClientMessage:
-            dst->xclient.message_type = to_ulong(src->xclient.message_type);
-            dst->xclient.format = src->xclient.format;
-            if(src->xclient.format==32)
-                for(int i=0; i<5; ++i) {
-                    if(((src->xclient.data.l[i]&0xffffffff80000000LL))==0xffffffff80000000LL)
-                        dst->xclient.data.l[i] = to_ulong(src->xclient.data.l[i]&0xffffffff);   // negative value...
-                    else
-                        dst->xclient.data.l[i] = to_ulong(src->xclient.data.l[i]);
-                }
-            else
-                memcpy(dst->xclient.data.b, src->xclient.data.b, 20);
-            break;
-        case XEVT_MappingNotify:
-            dst->xmapping.request = src->xmapping.request;
-            dst->xmapping.first_keycode = src->xmapping.first_keycode;
-            dst->xmapping.count = src->xmapping.count;
-            break;
-        case XEVT_GenericEvent:
-            dst->xgeneric.extension = src->xgeneric.extension;
-            dst->xgeneric.evtype = src->xgeneric.evtype;
-            break;
-        default:
-            printf_log(LOG_INFO, "Warning, unsupported 32bits XEvent type=%d\n", src->type);
-    }
-}
-void unconvertXEvent(my_XEvent_t* dst, my_XEvent_32_t* src)
-{
-    if(!src->type) {
-        // This is an XErrorEvent, and it's different!
-        dst->xerror.type = src->xerror.type;
-        dst->xerror.display = getDisplay(from_ptrv(src->xerror.display));
-        dst->xerror.resourceid = from_ulong(src->xerror.resourceid);
-        dst->xerror.serial = from_ulong(src->xerror.serial);
-        dst->xerror.error_code = src->xerror.error_code;
-        dst->xerror.request_code = src->xerror.request_code;
-        dst->xerror.minor_code = src->xerror.minor_code;
-        return;
-    }
-    // convert the XAnyEvent first, as it's a common set
-    dst->type = src->type;
-    dst->xany.display = getDisplay(from_ptrv(src->xany.display));
-    dst->xany.window = from_ulong(src->xany.window);
-    dst->xany.send_event = src->xany.serial;
-    dst->xany.serial = from_ulong(src->xany.serial);
-    switch(src->type) {
-        case XEVT_KeyPress:
-        case XEVT_KeyRelease:
-            dst->xkey.root = from_ulong(src->xkey.root);
-            dst->xkey.subwindow = from_ulong(src->xkey.subwindow);
-            dst->xkey.time = from_ulong(src->xkey.time);
-            dst->xkey.x = src->xkey.x;
-            dst->xkey.y = src->xkey.y;
-            dst->xkey.x_root = src->xkey.x_root;
-            dst->xkey.y_root = src->xkey.y_root;
-            dst->xkey.state = src->xkey.state;
-            dst->xkey.keycode = src->xkey.keycode;
-            dst->xkey.same_screen = src->xkey.same_screen;
-            break;
-        case XEVT_ButtonPress:
-        case XEVT_ButtonRelease:
-            dst->xbutton.root = from_ulong(src->xbutton.root);
-            dst->xbutton.subwindow = from_ulong(src->xbutton.subwindow);
-            dst->xbutton.time = from_ulong(src->xbutton.time);
-            dst->xbutton.x = src->xbutton.x;
-            dst->xbutton.y = src->xbutton.y;
-            dst->xbutton.x_root = src->xbutton.x_root;
-            dst->xbutton.y_root = src->xbutton.y_root;
-            dst->xbutton.state = src->xbutton.state;
-            dst->xbutton.button = src->xbutton.button;
-            dst->xbutton.same_screen = src->xbutton.same_screen;
-            break;
-        case XEVT_MotionNotify:
-            dst->xmotion.root = from_ulong(src->xmotion.root);
-            dst->xmotion.subwindow = from_ulong(src->xmotion.subwindow);
-            dst->xmotion.time = from_ulong(src->xmotion.time);
-            dst->xmotion.x = src->xmotion.x;
-            dst->xmotion.y = src->xmotion.y;
-            dst->xmotion.x_root = src->xmotion.x_root;
-            dst->xmotion.y_root = src->xmotion.y_root;
-            dst->xmotion.state = src->xmotion.state;
-            dst->xmotion.is_hint = src->xmotion.is_hint;
-            dst->xmotion.same_screen = src->xmotion.same_screen;
-            break;
-        case XEVT_EnterNotify:
-        case XEVT_LeaveNotify:
-            dst->xcrossing.root = from_ulong(src->xcrossing.root);
-            dst->xcrossing.subwindow = from_ulong(src->xcrossing.subwindow);
-            dst->xcrossing.time = from_ulong(src->xcrossing.time);
-            dst->xcrossing.x = src->xcrossing.x;
-            dst->xcrossing.y = src->xcrossing.y;
-            dst->xcrossing.x_root = src->xcrossing.x_root;
-            dst->xcrossing.y_root = src->xcrossing.y_root;
-            dst->xcrossing.mode = src->xcrossing.mode;
-            dst->xcrossing.detail = src->xcrossing.detail;
-            dst->xcrossing.same_screen = src->xcrossing.same_screen;
-            dst->xcrossing.focus = src->xcrossing.focus;
-            dst->xcrossing.state = src->xcrossing.state;
-            break;
-        case XEVT_FocusIn:
-        case XEVT_FocusOut:
-            dst->xfocus.mode = src->xfocus.mode;
-            dst->xfocus.detail = src->xfocus.detail;
-            break;
-        case XEVT_KeymapNotify:
-            memcpy(dst->xkeymap.key_vector, src->xkeymap.key_vector, 32);
-            break;
-        case XEVT_Expose:
-            dst->xexpose.x = src->xexpose.x;
-            dst->xexpose.y = src->xexpose.y;
-            dst->xexpose.width = src->xexpose.width;
-            dst->xexpose.height = src->xexpose.height;
-            dst->xexpose.count = src->xexpose.count;
-            break;
-        case XEVT_GraphicsExpose:
-            dst->xgraphicsexpose.x = src->xgraphicsexpose.x;
-            dst->xgraphicsexpose.y = src->xgraphicsexpose.y;
-            dst->xgraphicsexpose.width = src->xgraphicsexpose.width;
-            dst->xgraphicsexpose.height = src->xgraphicsexpose.height;
-            dst->xgraphicsexpose.count = src->xgraphicsexpose.count;
-            dst->xgraphicsexpose.major_code = src->xgraphicsexpose.major_code;
-            dst->xgraphicsexpose.minor_code = src->xgraphicsexpose.minor_code;
-            break;
-        case XEVT_NoExpose:
-            dst->xnoexpose.major_code = src->xnoexpose.major_code;
-            dst->xnoexpose.minor_code = src->xnoexpose.minor_code;
-            break;
-        case XEVT_VisibilityNotify:
-            dst->xvisibility.state = src->xvisibility.state;
-            break;
-        case XEVT_CreateNotify:
-            dst->xcreatewindow.window = from_ulong(src->xcreatewindow.window);
-            dst->xcreatewindow.x = src->xcreatewindow.x;
-            dst->xcreatewindow.y = src->xcreatewindow.y;
-            dst->xcreatewindow.width = src->xcreatewindow.width;
-            dst->xcreatewindow.height = src->xcreatewindow.height;
-            dst->xcreatewindow.border_width = src->xcreatewindow.border_width;
-            dst->xcreatewindow.override_redirect = src->xcreatewindow.override_redirect;
-            break;
-        case XEVT_DestroyNotify:
-            dst->xdestroywindow.window = from_ulong(src->xdestroywindow.window);
-            break;
-        case XEVT_UnmapNotify:
-            dst->xunmap.window = from_ulong(src->xunmap.window);
-            dst->xunmap.from_configure = src->xunmap.from_configure;
-            break;
-        case XEVT_MapNotify:
-            dst->xmap.window = from_ulong(src->xmap.window);
-            dst->xmap.override_redirect = src->xmap.override_redirect;
-            break;
-        case XEVT_MapRequest:
-            dst->xmaprequest.window = from_ulong(src->xmaprequest.window);
-            break;
-        case XEVT_ReparentNotify:
-            dst->xreparent.window = from_ulong(src->xreparent.window);
-            dst->xreparent.parent = from_ulong(src->xreparent.parent);
-            dst->xreparent.x = src->xreparent.x;
-            dst->xreparent.y = src->xreparent.y;
-            dst->xreparent.override_redirect = src->xreparent.override_redirect;
-            break;
-        case XEVT_ConfigureNotify:
-            dst->xconfigure.window = from_ulong(src->xconfigure.window);
-            dst->xconfigure.x = src->xconfigure.x;
-            dst->xconfigure.y = src->xconfigure.y;
-            dst->xconfigure.width = src->xconfigure.width;
-            dst->xconfigure.height = src->xconfigure.height;
-            dst->xconfigure.border_width = src->xconfigure.border_width;
-            dst->xconfigure.above = from_ulong(src->xconfigure.above);
-            dst->xconfigure.override_redirect = src->xconfigure.override_redirect;
-            break;
-        case XEVT_ConfigureRequest:
-            dst->xconfigurerequest.window = from_ulong(src->xconfigurerequest.window);
-            dst->xconfigurerequest.x = src->xconfigurerequest.x;
-            dst->xconfigurerequest.y = src->xconfigurerequest.y;
-            dst->xconfigurerequest.width = src->xconfigurerequest.width;
-            dst->xconfigurerequest.height = src->xconfigurerequest.height;
-            dst->xconfigurerequest.border_width = src->xconfigurerequest.border_width;
-            dst->xconfigurerequest.above = from_ulong(src->xconfigurerequest.above);
-            dst->xconfigurerequest.detail = src->xconfigurerequest.detail;
-            dst->xconfigurerequest.value_mask = from_ulong(src->xconfigurerequest.value_mask);
-            break;
-        case XEVT_GravityNotify:
-            dst->xgravity.window = from_ulong(src->xgravity.window);
-            dst->xgravity.x = src->xgravity.x;
-            dst->xgravity.y = src->xgravity.y;
-            break;
-        case XEVT_ResizeRequest:
-            dst->xresizerequest.width = src->xresizerequest.width;
-            dst->xresizerequest.height = src->xresizerequest.height;
-            break;
-        case XEVT_CirculateNotify:
-            dst->xcirculate.window = from_ulong(src->xcirculate.window);
-            dst->xcirculate.place = src->xcirculate.place;
-            break;
-        case XEVT_CirculateRequest:
-            dst->xcirculaterequest.window = from_ulong(src->xcirculaterequest.window);
-            dst->xcirculaterequest.place = src->xcirculaterequest.place;
-            break;
-        case XEVT_PropertyNotify:
-            dst->xproperty.atom = from_ulong(src->xproperty.atom);
-            dst->xproperty.time = from_ulong(src->xproperty.time);
-            dst->xproperty.state = src->xproperty.state;
-            break;
-        case XEVT_SelectionClear:
-            dst->xselectionclear.selection = from_ulong(src->xselectionclear.selection);
-            dst->xselectionclear.time = from_ulong(src->xselectionclear.time);
-            break;
-        case XEVT_SelectionRequest:
-            dst->xselectionrequest.requestor = from_ulong(src->xselectionrequest.requestor);
-            dst->xselectionrequest.selection = from_ulong(src->xselectionrequest.selection);
-            dst->xselectionrequest.target = from_ulong(src->xselectionrequest.target);
-            dst->xselectionrequest.property = from_ulong(src->xselectionrequest.property);
-            dst->xselectionrequest.time = from_ulong(src->xselectionrequest.time);
-            break;
-        case XEVT_SelectionNotify:
-            dst->xselection.selection = from_ulong(src->xselection.selection);
-            dst->xselection.target = from_ulong(src->xselection.target);
-            dst->xselection.property = from_ulong(src->xselection.property);
-            dst->xselection.time = from_ulong(src->xselection.time);
-            break;
-        case XEVT_ColormapNotify:
-            dst->xcolormap.colormap = from_ulong(src->xcolormap.colormap);
-            dst->xcolormap.c_new = src->xcolormap.c_new;
-            dst->xcolormap.state = src->xcolormap.state;
-            break;
-        case XEVT_ClientMessage:
-            dst->xclient.message_type = from_ulong(src->xclient.message_type);
-            dst->xclient.format = src->xclient.format;
-            if(src->xclient.format==32)
-                for(int i=0; i<5; ++i) dst->xclient.data.l[i] = from_ulong(src->xclient.data.l[i]);
-            else
-                memcpy(dst->xclient.data.b, src->xclient.data.b, 20);
-            break;
-        case XEVT_MappingNotify:
-            dst->xmapping.request = src->xmapping.request;
-            dst->xmapping.first_keycode = src->xmapping.first_keycode;
-            dst->xmapping.count = src->xmapping.count;
-            break;
-        case XEVT_GenericEvent:
-            dst->xgeneric.extension = src->xgeneric.extension;
-            dst->xgeneric.evtype = src->xgeneric.evtype;
-            break;
-
-        default:
-            printf_log(LOG_INFO, "Warning, unsupported 32bits (un)XEvent type=%d\n", src->type);
-    }
-}
-
-void convert_XErrorEvent_to_32(void* d, void* s)
-{
-    my_XErrorEvent_t* src = s;
-    my_XErrorEvent_32_t* dst = d;
-    dst->type = src->type;
-    dst->display = to_ptrv(FindDisplay(src->display));
-    dst->resourceid = to_ulong(src->resourceid);
-    dst->serial = to_ulong(src->serial);
-    dst->error_code = src->error_code;
-    dst->request_code = src->request_code;
-    dst->minor_code = src->minor_code;
-}
-void convert_XErrorEvent_to_64(void* d, void* s)
-{
-    my_XErrorEvent_32_t* src = s;
-    my_XErrorEvent_t* dst = d;
-    dst->minor_code = src->minor_code;
-    dst->request_code = src->request_code;
-    dst->error_code = src->error_code;
-    dst->serial = from_ulong(src->serial);
-    dst->resourceid = from_ulong(src->resourceid);
-    dst->display = getDisplay(from_ptrv(src->display));
-    dst->type = src->type;
-}
-
 #define N_DISPLAY 4
 my_XDisplay_t* my32_Displays_64[N_DISPLAY] = {0};
 struct my_XFreeFuncs_32 my32_free_funcs_32[N_DISPLAY] = {0};
@@ -531,6 +59,7 @@ void convert_Screen_to_32(void* d, void* s)
     dst->white_pixel = to_ulong(src->white_pixel);
     dst->black_pixel = to_ulong(src->black_pixel);
     dst->max_maps = src->max_maps;
+    dst->min_maps = src->min_maps;
     dst->backing_store = src->backing_store;
     dst->save_unders = src->save_unders;
     dst->root_input_mask = to_long(src->root_input_mask);
@@ -589,7 +118,15 @@ void* addDisplay(void* d)
     ret->conn_checker = dpy->conn_checker;
     ret->proto_major_version = dpy->proto_major_version;
     ret->proto_minor_version = dpy->proto_minor_version;
+    ret->resource_base = to_ulong(dpy->resource_base);
+    ret->resource_mask = to_ulong(dpy->resource_mask);
+    ret->resource_id = to_ulong(dpy->resource_id);
     ret->xdefaults = to_cstring(dpy->xdefaults);
+    ret->resource_shift = dpy->resource_shift;
+    ret->byte_order = dpy->byte_order;
+    ret->bitmap_unit = dpy->bitmap_unit;
+    ret->bitmap_pad = dpy->bitmap_pad;
+    ret->bitmap_bit_order = dpy->bitmap_bit_order;
     ret->display_name = to_cstring(dpy->display_name);
     ret->default_screen = dpy->default_screen;
     ret->nscreens = dpy->nscreens;
@@ -1264,4 +801,70 @@ void* inplace_XRRPropertyInfo_shrink(void* a)
     dst->values = to_ptrv(src->values);
 
     return a;
-}
\ No newline at end of file
+}
+
+void inplace_XIDeviceInfo_shrink(void* a, int n)
+{
+    if(!a || !n) return;
+    my_XIDeviceInfo_32_t* dst = a;
+    my_XIDeviceInfo_t* src = a;
+
+    for(int i=0; i<n; ++i, ++src, ++dst) {
+        dst->deviceid = src->deviceid;
+        dst->name = to_ptrv(src->name);
+        dst->use = src->use;
+        dst->attachment = src->attachment;
+        dst->enabled = src->enabled;
+        for(int j=0; j<src->num_classes; ++j)
+            ((ptr_t*)src->classes)[j] = to_ptrv(src->classes[j]);
+        dst->num_classes = src->num_classes;
+        dst->classes = to_ptrv(src->classes);
+    }
+    // mark last record, even on only 1 record, thos last 2 uint32_t are free
+    dst->deviceid = 0;
+    dst->name = 0;
+}
+
+int inplace_XIDeviceInfo_enlarge(void* a)
+{
+    if(!a) return 0;
+    my_XIDeviceInfo_t* dst = a;
+    my_XIDeviceInfo_32_t* src = a;
+    int n = 0;
+    while(src[n].deviceid && src[n].name) ++n;
+    src+=n-1;
+    dst+=n-1;
+    for(int i=n-1; i>=0; --i, --src, --dst) {
+        dst->classes = from_ptrv(src->classes);
+        dst->num_classes = src->num_classes;
+        dst->enabled = src->enabled;
+        dst->attachment = src->attachment;
+        dst->use = src->use;
+        dst->name = from_ptrv(src->name);
+        dst->deviceid = src->deviceid;
+        for(int j=dst->num_classes-1; j>=0; --j)
+            dst->classes[j] = from_ptrv(((ptr_t*)dst->classes)[j]);
+    }
+    return n;
+}
+
+void inplace_XDevice_shrink(void* a)
+{
+    if(!a) return;
+    my_XDevice_t* src = a;
+    my_XDevice_32_t* dst = a;
+
+    dst->device_id = src->device_id;
+    dst->num_classes = src->num_classes;
+    dst->classes = to_ptrv(src->classes);
+}
+void inplace_XDevice_enlarge(void* a)
+{
+    if(!a) return;
+    my_XDevice_32_t* src = a;
+    my_XDevice_t* dst = a;
+
+    dst->classes = from_ptrv(src->classes);
+    dst->num_classes = src->num_classes;
+    dst->device_id = src->device_id;
+}
diff --git a/src/libtools/my_x11_conv.h b/src/libtools/my_x11_conv.h
index 254c58bb..9a39fe4e 100644
--- a/src/libtools/my_x11_conv.h
+++ b/src/libtools/my_x11_conv.h
@@ -78,4 +78,17 @@ void inplace_XRRProviderResources_shrink(void* a);
 void inplace_XRRProviderResources_enlarge(void* a);
 void* inplace_XRRPropertyInfo_shrink(void* a);
 
+void inplace_XIDeviceInfo_shrink(void* a, int n);
+int inplace_XIDeviceInfo_enlarge(void* a);
+
+void inplace_XDevice_shrink(void* a);
+void inplace_XDevice_enlarge(void* a);
+
+void register_XDevice_events(my_XDevice_t* a);
+void unregister_XDevice_events(my_XDevice_t* a);
+void register_XFixes_events(int event_base);
+void unregister_XFixes_events();
+void register_XRandR_events(int event_base);
+void unregister_XRandR_events();
+
 #endif//MY_X11_CONV
\ No newline at end of file
diff --git a/src/libtools/my_x11_defs.h b/src/libtools/my_x11_defs.h
index 2c104307..ad1e2de3 100644
--- a/src/libtools/my_x11_defs.h
+++ b/src/libtools/my_x11_defs.h
@@ -954,6 +954,276 @@ typedef struct my_XDevice_s {
      my_XInputClassInfo_t*  classes;
 } my_XDevice_t;
 
+typedef struct my_XDeviceKeyEvent_s
+{
+    int            type;
+    unsigned long  serial;
+    int            send_event;
+    void*          display; //Display*
+    XID            window;
+    XID            deviceid;
+    XID            root;
+    XID            subwindow;
+    unsigned long  time;
+    int            x, y;
+    int            x_root;
+    int            y_root;
+    unsigned int   state;
+    unsigned int   keycode;
+    int            same_screen;
+    unsigned int   device_state;
+    unsigned char  axes_count;
+    unsigned char  first_axis;
+    int            axis_data[6];
+} my_XDeviceKeyEvent_t;
+typedef my_XDeviceKeyEvent_t my_XDeviceButtonEvent_t;
+typedef struct my_XDeviceMotionEvent_s
+{
+    int            type;
+    unsigned long  serial;
+    int            send_event;
+    void*          display; //Display*
+    XID            window;
+    XID            deviceid;
+    XID            root;
+    XID            subwindow;
+    unsigned long  time;
+    int            x, y;
+    int            x_root;
+    int            y_root;
+    unsigned int   state;
+    char           is_hint;
+    int            same_screen;
+    unsigned int   device_state;
+    unsigned char  axes_count;
+    unsigned char  first_axis;
+    int            axis_data[6];
+} my_XDeviceMotionEvent_t;
+typedef struct my_XDeviceFocusChangeEvent_s
+{
+    int           type;
+    unsigned long serial;
+    int           send_event;
+    void*         display;  //Display*
+    XID           window;
+    XID           deviceid;
+    int           mode;
+    int           detail;
+    unsigned long time;
+} my_XDeviceFocusChangeEvent_t;
+typedef struct my_XProximityNotifyEvent_s
+{
+    int            type;
+    unsigned long  serial;
+    int            send_event;
+    void*          display; //Display*
+    XID            window;
+    XID            deviceid;
+    XID            root;
+    XID            subwindow;
+    unsigned long  time;
+    int            x, y;
+    int            x_root;
+    int            y_root;
+    unsigned int   state;
+    int            same_screen;
+    unsigned int   device_state;
+    unsigned char  axes_count;
+    unsigned char  first_axis;
+    int            axis_data[6];
+} my_XProximityNotifyEvent_t;
+typedef struct my_XDeviceStateNotifyEvent_s
+{
+    int           type;
+    unsigned long serial;
+    int           send_event;
+    void*         display;  //Display*
+    XID           window;
+    XID           deviceid;
+    unsigned long time;
+    int           num_classes;
+    char	      data[64];
+} my_XDeviceStateNotifyEvent_t;
+typedef struct my_XDeviceMappingEvent_s
+{
+    int           type;
+    unsigned long serial;
+    int           send_event;
+    void*         display;
+    XID           window;
+    XID           deviceid;
+    unsigned long time;
+    int           request;
+    int           first_keycode;
+    int           count;
+} my_XDeviceMappingEvent_t;
+typedef struct my_XChangeDeviceNotifyEvent_s
+{
+    int           type;
+    unsigned long serial;
+    int           send_event;
+    void*         display;
+    XID           window;
+    XID           deviceid;
+    unsigned long time;
+    int           request;
+} my_XChangeDeviceNotifyEvent_t;
+typedef struct my_XDevicePresenceNotifyEvent_s
+{
+    int           type;
+    unsigned long serial;
+    int           send_event;
+    void*         display;
+    XID           window;
+    unsigned long time;
+    int           devchange;
+    XID           deviceid;
+    XID           control;
+} my_XDevicePresenceNotifyEvent_t;
+typedef struct my_XDevicePropertyNotifyEvent_s
+{
+    int           type;
+    unsigned long serial;
+    int           send_event;
+    void*         display;
+    XID           window;
+    unsigned long time;
+    XID           deviceid;
+    XID           atom;
+    int           state;
+} my_XDevicePropertyNotifyEvent_t;
+
+typedef struct my_XFixesSelectionNotifyEvent_s
+{
+    int type;
+    unsigned long serial;
+    int send_event;
+    void* display;
+    XID window;
+    int subtype;
+    XID owner;
+    XID selection;
+    unsigned long timestamp;
+    unsigned long selection_timestamp;
+} my_XFixesSelectionNotifyEvent_t;
+typedef struct my_XFixesCursorNotifyEvent_s
+{
+    int type;
+    unsigned long serial;
+    int send_event;
+    void* display;
+    XID window;
+    int subtype;
+    unsigned long cursor_serial;
+    unsigned long timestamp;
+    XID cursor_name;
+} my_XFixesCursorNotifyEvent_t;
+
+typedef struct my_XRRScreenChangeNotifyEvent_s
+{
+    int type;
+    unsigned long serial;
+    int send_event;
+    void* display;
+    XID window;
+    XID root;
+    unsigned long timestamp;
+    unsigned long config_timestamp;
+    uint16_t size_index;
+    uint16_t subpixel_order;
+    uint16_t rotation;
+    int width;
+    int height;
+    int mwidth;
+    int mheight;
+} my_XRRScreenChangeNotifyEvent_t;
+typedef struct my_XRRNotifyEvent_s
+{
+    int type;
+    unsigned long serial;
+    int send_event;
+    void* display;
+    XID window;
+    int subtype;
+} my_XRRNotifyEvent_t;
+typedef struct my_XRROutputChangeNotifyEvent_s
+{
+    int type;
+    unsigned long serial;
+    int send_event;
+    void* display;
+    XID window;
+    int subtype;
+    XID output;
+    XID crtc;
+    XID mode;
+    uint16_t rotation;
+    uint16_t connection;
+    uint16_t subpixel_order;
+} my_XRROutputChangeNotifyEvent_t;
+typedef struct my_XRRCrtcChangeNotifyEvent_s
+{
+    int type;
+    unsigned long serial;
+    int send_event;
+    void* display;
+    XID window;
+    int subtype;
+    XID crtc;
+    XID mode;
+    uint16_t rotation;
+    int x, y;
+    unsigned int width, height;
+} my_XRRCrtcChangeNotifyEvent_t;
+typedef struct my_XRROutputPropertyNotifyEvent_s
+{
+    int type;
+    unsigned long serial;
+    int send_event;
+    void* display;
+    XID window;
+    int subtype;
+    XID output;
+    XID property;
+    unsigned long timestamp;
+    int state;
+} my_XRROutputPropertyNotifyEvent_t;
+typedef struct my_XRRProviderChangeNotifyEvent_s
+{
+    int type;
+    unsigned long serial;
+    int send_event;
+    void* display;
+    XID window;
+    int subtype;
+    XID provider;
+    unsigned long timestamp;
+    unsigned int current_role;
+} my_XRRProviderChangeNotifyEvent_t;
+typedef struct my_XRRProviderPropertyNotifyEvent_s
+{
+    int type;
+    unsigned long serial;
+    int send_event;
+    void* display;
+    XID window;
+    int subtype;
+    XID provider;
+    XID property;
+    unsigned long timestamp;
+    int state;
+} my_XRRProviderPropertyNotifyEvent_t;
+typedef struct my_XRRResourceChangeNotifyEvent_s
+{
+    int type;
+    unsigned long serial;
+    int send_event;
+    void* display;
+    XID window;
+    int subtype;
+    unsigned long timestamp;
+} my_XRRResourceChangeNotifyEvent_t;
+
 typedef struct my_XcursorCursors_s {
     void*      dpy;     //Display*
     int        ref;
diff --git a/src/libtools/my_x11_defs_32.h b/src/libtools/my_x11_defs_32.h
index f12c75c1..289ad764 100644
--- a/src/libtools/my_x11_defs_32.h
+++ b/src/libtools/my_x11_defs_32.h
@@ -887,6 +887,275 @@ typedef struct my_XDevice_32_s {
      ptr_t  classes;    //my_XInputClassInfo_t*
 } my_XDevice_32_t;
 
+typedef struct my_XDeviceKeyEvent_32_s
+{
+    int            type;
+    ulong_t        serial;
+    int            send_event;
+    ptr_t          display; //Display*
+    XID_32         window;
+    XID_32         deviceid;
+    XID_32         root;
+    XID_32         subwindow;
+    ulong_t        time;
+    int            x, y;
+    int            x_root;
+    int            y_root;
+    unsigned int   state;
+    unsigned int   keycode;
+    int            same_screen;
+    unsigned int   device_state;
+    unsigned char  axes_count;
+    unsigned char  first_axis;
+    int            axis_data[6];
+} my_XDeviceKeyEvent_32_t;
+typedef my_XDeviceKeyEvent_32_t my_XDeviceButtonEvent_32_t;
+typedef struct my_XDeviceMotionEvent_32_s
+{
+    int            type;
+    ulong_t        serial;
+    int            send_event;
+    ptr_t          display; //Display*
+    XID_32         window;
+    XID_32         deviceid;
+    XID_32         root;
+    XID_32         subwindow;
+    ulong_t        time;
+    int            x, y;
+    int            x_root;
+    int            y_root;
+    unsigned int   state;
+    char           is_hint;
+    int            same_screen;
+    unsigned int   device_state;
+    unsigned char  axes_count;
+    unsigned char  first_axis;
+    int            axis_data[6];
+} my_XDeviceMotionEvent_32_t;
+typedef struct my_XDeviceFocusChangeEvent_32_s
+{
+    int           type;
+    ulong_t       serial;
+    int           send_event;
+    ptr_t         display;  //Display*
+    XID_32        window;
+    XID_32        deviceid;
+    int           mode;
+    int           detail;
+    ulong_t       time;
+} my_XDeviceFocusChangeEvent_32_t;
+typedef struct my_XProximityNotifyEvent_32_s
+{
+    int            type;
+    ulong_t        serial;
+    int            send_event;
+    ptr_t          display; //Display*
+    XID_32         window;
+    XID_32         deviceid;
+    XID_32         root;
+    XID_32         subwindow;
+    ulong_t        time;
+    int            x, y;
+    int            x_root;
+    int            y_root;
+    unsigned int   state;
+    int            same_screen;
+    unsigned int   device_state;
+    unsigned char  axes_count;
+    unsigned char  first_axis;
+    int            axis_data[6];
+} my_XProximityNotifyEvent_32_t;
+typedef struct my_XDeviceStateNotifyEvent_32_s
+{
+    int           type;
+    ulong_t       serial;
+    int           send_event;
+    ptr_t         display;  //Display*
+    XID_32        window;
+    XID_32        deviceid;
+    ulong_t       time;
+    int           num_classes;
+    char	      data[64];
+} my_XDeviceStateNotifyEvent_32_t;
+typedef struct my_XDeviceMappingEvent_32_s
+{
+    int           type;
+    ulong_t       serial;
+    int           send_event;
+    ptr_t         display;
+    XID_32        window;
+    XID_32        deviceid;
+    ulong_t       time;
+    int           request;
+    int           first_keycode;
+    int           count;
+} my_XDeviceMappingEvent_32_t;
+typedef struct my_XChangeDeviceNotifyEvent_32_s
+{
+    int           type;
+    ulong_t       serial;
+    int           send_event;
+    ptr_t         display;
+    XID_32        window;
+    XID_32        deviceid;
+    ulong_t       time;
+    int           request;
+} my_XChangeDeviceNotifyEvent_32_t;
+typedef struct my_XDevicePresenceNotifyEvent_32_s
+{
+    int           type;
+    ulong_t       serial;
+    int           send_event;
+    ptr_t         display;
+    XID_32        window;
+    ulong_t       time;
+    int           devchange;
+    XID_32        deviceid;
+    XID_32        control;
+} my_XDevicePresenceNotifyEvent_32_t;
+typedef struct my_XDevicePropertyNotifyEvent_32_s
+{
+    int           type;
+    ulong_t       serial;
+    int           send_event;
+    ptr_t         display;
+    XID_32        window;
+    ulong_t       time;
+    XID_32        deviceid;
+    XID_32        atom;
+    int           state;
+} my_XDevicePropertyNotifyEvent_32_t;
+typedef struct my_XFixesSelectionNotifyEvent_32_s
+{
+    int     type;
+    ulong_t serial;
+    int     send_event;
+    ptr_t   display;
+    XID_32  window;
+    int     subtype;
+    ulong_t selection_timestamp;
+    XID_32  owner;
+    XID_32  selection;
+    ulong_t timestamp;
+} my_XFixesSelectionNotifyEvent_32_t;
+typedef struct my_XFixesCursorNotifyEvent_32_s
+{
+    int     type;
+    ulong_t serial;
+    int     send_event;
+    ptr_t   display;
+    XID_32  window;
+    int     subtype;
+    ulong_t cursor_serial;
+    ulong_t timestamp;
+    XID_32  cursor_name;
+} my_XFixesCursorNotifyEvent_32_t;
+
+typedef struct my_XRRScreenChangeNotifyEvent_32_s
+{
+    int         type;
+    ulong_t     serial;
+    int         send_event;
+    ptr_t       display;
+    XID_32      window;
+    XID_32      root;
+    ulong_t     timestamp;
+    ulong_t     config_timestamp;
+    uint16_t    size_index;
+    uint16_t    subpixel_order;
+    uint16_t    rotation;
+    int         width;
+    int         height;
+    int         mwidth;
+    int         mheight;
+} my_XRRScreenChangeNotifyEvent_32_t;
+typedef struct my_XRRNotifyEvent_32_s
+{
+    int     type;
+    ulong_t serial;
+    int     send_event;
+    ptr_t   display;
+    XID_32  window;
+    int     subtype;
+} my_XRRNotifyEvent_32_t;
+typedef struct my_XRROutputChangeNotifyEvent_32_s
+{
+    int         type;
+    ulong_t     serial;
+    int         send_event;
+    ptr_t       display;
+    XID_32      window;
+    int         subtype;
+    XID_32      output;
+    XID_32      crtc;
+    XID_32      mode;
+    uint16_t    rotation;
+    uint16_t    connection;
+    uint16_t    subpixel_order;
+} my_XRROutputChangeNotifyEvent_32_t;
+typedef struct my_XRRCrtcChangeNotifyEvent_32_s
+{
+    int             type;
+    ulong_t         serial;
+    int             send_event;
+    ptr_t           display;
+    XID_32          window;
+    int             subtype;
+    XID_32          crtc;
+    XID_32          mode;
+    uint16_t        rotation;
+    int             x, y;
+    unsigned int    width, height;
+} my_XRRCrtcChangeNotifyEvent_32_t;
+typedef struct my_XRROutputPropertyNotifyEvent_32_s
+{
+    int     type;
+    ulong_t serial;
+    int     send_event;
+    ptr_t   display;
+    XID_32  window;
+    int     subtype;
+    XID_32  output;
+    XID_32  property;
+    ulong_t timestamp;
+    int     state;
+} my_XRROutputPropertyNotifyEvent_32_t;
+typedef struct my_XRRProviderChangeNotifyEvent_32_s
+{
+    int             type;
+    ulong_t         serial;
+    int             send_event;
+    ptr_t           display;
+    XID_32          window;
+    int             subtype;
+    XID_32          provider;
+    ulong_t         timestamp;
+    unsigned int    current_role;
+} my_XRRProviderChangeNotifyEvent_32_t;
+typedef struct my_XRRProviderPropertyNotifyEvent_32_s
+{
+    int     type;
+    ulong_t serial;
+    int     send_event;
+    ptr_t   display;
+    XID_32  window;
+    int     subtype;
+    XID_32  provider;
+    XID_32  property;
+    ulong_t timestamp;
+    int     state;
+} my_XRRProviderPropertyNotifyEvent_32_t;
+typedef struct my_XRRResourceChangeNotifyEvent_32_s
+{
+    int     type;
+    ulong_t serial;
+    int     send_event;
+    ptr_t   display;
+    XID_32  window;
+    int     subtype;
+    ulong_t timestamp;
+} my_XRRResourceChangeNotifyEvent_32_t;
+
 typedef struct my_XcursorCursors_32_s {
     ptr_t      dpy;     //Display*
     int        ref;
diff --git a/src/libtools/my_x11_xevent.c b/src/libtools/my_x11_xevent.c
new file mode 100644
index 00000000..71cadc52
--- /dev/null
+++ b/src/libtools/my_x11_xevent.c
@@ -0,0 +1,1351 @@
+#include <stdint.h>
+#include <dlfcn.h>
+
+#include "debug.h"
+#include "box32context.h"
+#include "wrapper32.h"
+#include "library.h"
+#include "bridge.h"
+#include "librarian/library_private.h"
+#include "converter32.h"
+#include "my_x11_defs.h"
+#include "my_x11_defs_32.h"
+#include "my_x11_conv.h"
+
+typedef void(*convertXEvent_to_32)(my_XEvent_32_t* dst, my_XEvent_t* src);
+typedef void(*convertXEvent_to_64)(my_XEvent_t* dst, my_XEvent_32_t* src);
+
+typedef struct reg_event_s {
+    uint32_t event;
+    convertXEvent_to_32 to32;
+    convertXEvent_to_64 to64;
+} reg_event_t;
+typedef struct register_events_s {
+    void* id;
+    uint32_t start_event;
+    uint32_t end_event;
+    size_t n;
+    reg_event_t* events;
+    struct register_events_s* next;
+} register_events_t;
+
+static register_events_t* register_events_head = NULL;
+
+void convertXEvent(my_XEvent_32_t* dst, my_XEvent_t* src)
+{
+    if(!src->type) {
+        // This is an XErrorEvent, and it's different!
+        dst->xerror.type = src->xerror.type;
+        dst->xerror.display = to_ptrv(FindDisplay(src->xerror.display));
+        dst->xerror.resourceid = to_ulong(src->xerror.resourceid);
+        dst->xerror.serial = to_ulong(src->xerror.serial);
+        dst->xerror.error_code = src->xerror.error_code;
+        dst->xerror.request_code = src->xerror.request_code;
+        dst->xerror.minor_code = src->xerror.minor_code;
+        return;
+    }
+    // convert the XAnyEvent first, as it's a common set
+    int type = src->type;
+    dst->type = src->type;
+    dst->xany.serial = to_ulong(src->xany.serial);
+    dst->xany.send_event = src->xany.serial;
+    dst->xany.display = to_ptrv(FindDisplay(src->xany.display));
+    if(type!=XEVT_GenericEvent)
+        dst->xany.window = to_ulong(src->xany.window);
+    switch(type) {
+        case XEVT_KeyPress:
+        case XEVT_KeyRelease:
+            dst->xkey.root = to_ulong(src->xkey.root);
+            dst->xkey.subwindow = to_ulong(src->xkey.subwindow);
+            dst->xkey.time = to_ulong(src->xkey.time);
+            dst->xkey.x = src->xkey.x;
+            dst->xkey.y = src->xkey.y;
+            dst->xkey.x_root = src->xkey.x_root;
+            dst->xkey.y_root = src->xkey.y_root;
+            dst->xkey.state = src->xkey.state;
+            dst->xkey.keycode = src->xkey.keycode;
+            dst->xkey.same_screen = src->xkey.same_screen;
+            break;
+        case XEVT_ButtonPress:
+        case XEVT_ButtonRelease:
+            dst->xbutton.root = to_ulong(src->xbutton.root);
+            dst->xbutton.subwindow = to_ulong(src->xbutton.subwindow);
+            dst->xbutton.time = to_ulong(src->xbutton.time);
+            dst->xbutton.x = src->xbutton.x;
+            dst->xbutton.y = src->xbutton.y;
+            dst->xbutton.x_root = src->xbutton.x_root;
+            dst->xbutton.y_root = src->xbutton.y_root;
+            dst->xbutton.state = src->xbutton.state;
+            dst->xbutton.button = src->xbutton.button;
+            dst->xbutton.same_screen = src->xbutton.same_screen;
+            break;
+        case XEVT_MotionNotify:
+            dst->xmotion.root = to_ulong(src->xmotion.root);
+            dst->xmotion.subwindow = to_ulong(src->xmotion.subwindow);
+            dst->xmotion.time = to_ulong(src->xmotion.time);
+            dst->xmotion.x = src->xmotion.x;
+            dst->xmotion.y = src->xmotion.y;
+            dst->xmotion.x_root = src->xmotion.x_root;
+            dst->xmotion.y_root = src->xmotion.y_root;
+            dst->xmotion.state = src->xmotion.state;
+            dst->xmotion.is_hint = src->xmotion.is_hint;
+            dst->xmotion.same_screen = src->xmotion.same_screen;
+            break;
+        case XEVT_EnterNotify:
+        case XEVT_LeaveNotify:
+            dst->xcrossing.root = to_ulong(src->xcrossing.root);
+            dst->xcrossing.subwindow = to_ulong(src->xcrossing.subwindow);
+            dst->xcrossing.time = to_ulong(src->xcrossing.time);
+            dst->xcrossing.x = src->xcrossing.x;
+            dst->xcrossing.y = src->xcrossing.y;
+            dst->xcrossing.x_root = src->xcrossing.x_root;
+            dst->xcrossing.y_root = src->xcrossing.y_root;
+            dst->xcrossing.mode = src->xcrossing.mode;
+            dst->xcrossing.detail = src->xcrossing.detail;
+            dst->xcrossing.same_screen = src->xcrossing.same_screen;
+            dst->xcrossing.focus = src->xcrossing.focus;
+            dst->xcrossing.state = src->xcrossing.state;
+            break;
+        case XEVT_FocusIn:
+        case XEVT_FocusOut:
+            dst->xfocus.mode = src->xfocus.mode;
+            dst->xfocus.detail = src->xfocus.detail;
+            break;
+        case XEVT_KeymapNotify:
+            memcpy(dst->xkeymap.key_vector, src->xkeymap.key_vector, 32);
+            break;
+        case XEVT_Expose:
+            dst->xexpose.x = src->xexpose.x;
+            dst->xexpose.y = src->xexpose.y;
+            dst->xexpose.width = src->xexpose.width;
+            dst->xexpose.height = src->xexpose.height;
+            dst->xexpose.count = src->xexpose.count;
+            break;
+        case XEVT_GraphicsExpose:
+            dst->xgraphicsexpose.x = src->xgraphicsexpose.x;
+            dst->xgraphicsexpose.y = src->xgraphicsexpose.y;
+            dst->xgraphicsexpose.width = src->xgraphicsexpose.width;
+            dst->xgraphicsexpose.height = src->xgraphicsexpose.height;
+            dst->xgraphicsexpose.count = src->xgraphicsexpose.count;
+            dst->xgraphicsexpose.major_code = src->xgraphicsexpose.major_code;
+            dst->xgraphicsexpose.minor_code = src->xgraphicsexpose.minor_code;
+            break;
+        case XEVT_NoExpose:
+            dst->xnoexpose.major_code = src->xnoexpose.major_code;
+            dst->xnoexpose.minor_code = src->xnoexpose.minor_code;
+            break;
+        case XEVT_VisibilityNotify:
+            dst->xvisibility.state = src->xvisibility.state;
+            break;
+        case XEVT_CreateNotify:
+            dst->xcreatewindow.window = to_ulong(src->xcreatewindow.window);
+            dst->xcreatewindow.x = src->xcreatewindow.x;
+            dst->xcreatewindow.y = src->xcreatewindow.y;
+            dst->xcreatewindow.width = src->xcreatewindow.width;
+            dst->xcreatewindow.height = src->xcreatewindow.height;
+            dst->xcreatewindow.border_width = src->xcreatewindow.border_width;
+            dst->xcreatewindow.override_redirect = src->xcreatewindow.override_redirect;
+            break;
+        case XEVT_DestroyNotify:
+            dst->xdestroywindow.window = to_ulong(src->xdestroywindow.window);
+            break;
+        case XEVT_UnmapNotify:
+            dst->xunmap.window = to_ulong(src->xunmap.window);
+            dst->xunmap.from_configure = src->xunmap.from_configure;
+            break;
+        case XEVT_MapNotify:
+            dst->xmap.window = to_ulong(src->xmap.window);
+            dst->xmap.override_redirect = src->xmap.override_redirect;
+            break;
+        case XEVT_MapRequest:
+            dst->xmaprequest.window = to_ulong(src->xmaprequest.window);
+            break;
+        case XEVT_ReparentNotify:
+            dst->xreparent.window = to_ulong(src->xreparent.window);
+            dst->xreparent.parent = to_ulong(src->xreparent.parent);
+            dst->xreparent.x = src->xreparent.x;
+            dst->xreparent.y = src->xreparent.y;
+            dst->xreparent.override_redirect = src->xreparent.override_redirect;
+            break;
+        case XEVT_ConfigureNotify:
+            dst->xconfigure.window = to_ulong(src->xconfigure.window);
+            dst->xconfigure.x = src->xconfigure.x;
+            dst->xconfigure.y = src->xconfigure.y;
+            dst->xconfigure.width = src->xconfigure.width;
+            dst->xconfigure.height = src->xconfigure.height;
+            dst->xconfigure.border_width = src->xconfigure.border_width;
+            dst->xconfigure.above = to_ulong(src->xconfigure.above);
+            dst->xconfigure.override_redirect = src->xconfigure.override_redirect;
+            break;
+        case XEVT_ConfigureRequest:
+            dst->xconfigurerequest.window = to_ulong(src->xconfigurerequest.window);
+            dst->xconfigurerequest.x = src->xconfigurerequest.x;
+            dst->xconfigurerequest.y = src->xconfigurerequest.y;
+            dst->xconfigurerequest.width = src->xconfigurerequest.width;
+            dst->xconfigurerequest.height = src->xconfigurerequest.height;
+            dst->xconfigurerequest.border_width = src->xconfigurerequest.border_width;
+            dst->xconfigurerequest.above = to_ulong(src->xconfigurerequest.above);
+            dst->xconfigurerequest.detail = src->xconfigurerequest.detail;
+            dst->xconfigurerequest.value_mask = to_ulong(src->xconfigurerequest.value_mask);
+            break;
+        case XEVT_GravityNotify:
+            dst->xgravity.window = to_ulong(src->xgravity.window);
+            dst->xgravity.x = src->xgravity.x;
+            dst->xgravity.y = src->xgravity.y;
+            break;
+        case XEVT_ResizeRequest:
+            dst->xresizerequest.width = src->xresizerequest.width;
+            dst->xresizerequest.height = src->xresizerequest.height;
+            break;
+        case XEVT_CirculateNotify:
+            dst->xcirculate.window = to_ulong(src->xcirculate.window);
+            dst->xcirculate.place = src->xcirculate.place;
+            break;
+        case XEVT_CirculateRequest:
+            dst->xcirculaterequest.window = to_ulong(src->xcirculaterequest.window);
+            dst->xcirculaterequest.place = src->xcirculaterequest.place;
+            break;
+        case XEVT_PropertyNotify:
+            dst->xproperty.atom = to_ulong(src->xproperty.atom);
+            dst->xproperty.time = to_ulong(src->xproperty.time);
+            dst->xproperty.state = src->xproperty.state;
+            break;
+        case XEVT_SelectionClear:
+            dst->xselectionclear.selection = to_ulong(src->xselectionclear.selection);
+            dst->xselectionclear.time = to_ulong(src->xselectionclear.time);
+            break;
+        case XEVT_SelectionRequest:
+            dst->xselectionrequest.requestor = to_ulong(src->xselectionrequest.requestor);
+            dst->xselectionrequest.selection = to_ulong(src->xselectionrequest.selection);
+            dst->xselectionrequest.target = to_ulong(src->xselectionrequest.target);
+            dst->xselectionrequest.property = to_ulong(src->xselectionrequest.property);
+            dst->xselectionrequest.time = to_ulong(src->xselectionrequest.time);
+            break;
+        case XEVT_SelectionNotify:
+            dst->xselection.selection = to_ulong(src->xselection.selection);
+            dst->xselection.target = to_ulong(src->xselection.target);
+            dst->xselection.property = to_ulong(src->xselection.property);
+            dst->xselection.time = to_ulong(src->xselection.time);
+            break;
+        case XEVT_ColormapNotify:
+            dst->xcolormap.colormap = to_ulong(src->xcolormap.colormap);
+            dst->xcolormap.c_new = src->xcolormap.c_new;
+            dst->xcolormap.state = src->xcolormap.state;
+            break;
+        case XEVT_ClientMessage:
+            dst->xclient.message_type = to_ulong(src->xclient.message_type);
+            dst->xclient.format = src->xclient.format;
+            if(src->xclient.format==32)
+                for(int i=0; i<5; ++i) {
+                    if(((src->xclient.data.l[i]&0xffffffff80000000LL))==0xffffffff80000000LL)
+                        dst->xclient.data.l[i] = to_ulong(src->xclient.data.l[i]&0xffffffff);   // negative value...
+                    else
+                        dst->xclient.data.l[i] = to_ulong(src->xclient.data.l[i]);
+                }
+            else
+                memcpy(dst->xclient.data.b, src->xclient.data.b, 20);
+            break;
+        case XEVT_MappingNotify:
+            dst->xmapping.request = src->xmapping.request;
+            dst->xmapping.first_keycode = src->xmapping.first_keycode;
+            dst->xmapping.count = src->xmapping.count;
+            break;
+        case XEVT_GenericEvent:
+            dst->xcookie.extension = src->xcookie.extension;
+            dst->xcookie.evtype = src->xcookie.evtype;
+            dst->xcookie.cookie = src->xcookie.cookie;
+            dst->xcookie.data = to_ptrv_silent(src->xcookie.data);  // in case data are not initialized
+            break;
+        default:
+            register_events_t* head = register_events_head;
+            while(head) {
+                if(type>=head->start_event && type<=head->end_event) {
+                    for(int i=0; i<head->n; ++i)
+                        if(type==head->events[i].event) {
+                            head->events[i].to32(dst, src);
+                            return;
+                        }
+                }
+                head = head->next;
+            }
+            printf_log(LOG_INFO, "Warning, unsupported 32bits XEvent type=%d\n", type);
+    }
+}
+void unconvertXEvent(my_XEvent_t* dst, my_XEvent_32_t* src)
+{
+    if(!src->type) {
+        // This is an XErrorEvent, and it's different!
+        dst->xerror.type = src->xerror.type;
+        dst->xerror.display = getDisplay(from_ptrv(src->xerror.display));
+        dst->xerror.resourceid = from_ulong(src->xerror.resourceid);
+        dst->xerror.serial = from_ulong(src->xerror.serial);
+        dst->xerror.error_code = src->xerror.error_code;
+        dst->xerror.request_code = src->xerror.request_code;
+        dst->xerror.minor_code = src->xerror.minor_code;
+        return;
+    }
+    // convert the XAnyEvent first, as it's a common set
+    int type = src->type;
+    dst->type = src->type;
+    if(type!=XEVT_GenericEvent)
+        dst->xany.window = from_ulong(src->xany.window);
+    dst->xany.display = getDisplay(from_ptrv(src->xany.display));
+    dst->xany.send_event = src->xany.serial;
+    dst->xany.serial = from_ulong(src->xany.serial);
+    switch(type) {
+        case XEVT_KeyPress:
+        case XEVT_KeyRelease:
+            dst->xkey.root = from_ulong(src->xkey.root);
+            dst->xkey.subwindow = from_ulong(src->xkey.subwindow);
+            dst->xkey.time = from_ulong(src->xkey.time);
+            dst->xkey.x = src->xkey.x;
+            dst->xkey.y = src->xkey.y;
+            dst->xkey.x_root = src->xkey.x_root;
+            dst->xkey.y_root = src->xkey.y_root;
+            dst->xkey.state = src->xkey.state;
+            dst->xkey.keycode = src->xkey.keycode;
+            dst->xkey.same_screen = src->xkey.same_screen;
+            break;
+        case XEVT_ButtonPress:
+        case XEVT_ButtonRelease:
+            dst->xbutton.root = from_ulong(src->xbutton.root);
+            dst->xbutton.subwindow = from_ulong(src->xbutton.subwindow);
+            dst->xbutton.time = from_ulong(src->xbutton.time);
+            dst->xbutton.x = src->xbutton.x;
+            dst->xbutton.y = src->xbutton.y;
+            dst->xbutton.x_root = src->xbutton.x_root;
+            dst->xbutton.y_root = src->xbutton.y_root;
+            dst->xbutton.state = src->xbutton.state;
+            dst->xbutton.button = src->xbutton.button;
+            dst->xbutton.same_screen = src->xbutton.same_screen;
+            break;
+        case XEVT_MotionNotify:
+            dst->xmotion.root = from_ulong(src->xmotion.root);
+            dst->xmotion.subwindow = from_ulong(src->xmotion.subwindow);
+            dst->xmotion.time = from_ulong(src->xmotion.time);
+            dst->xmotion.x = src->xmotion.x;
+            dst->xmotion.y = src->xmotion.y;
+            dst->xmotion.x_root = src->xmotion.x_root;
+            dst->xmotion.y_root = src->xmotion.y_root;
+            dst->xmotion.state = src->xmotion.state;
+            dst->xmotion.is_hint = src->xmotion.is_hint;
+            dst->xmotion.same_screen = src->xmotion.same_screen;
+            break;
+        case XEVT_EnterNotify:
+        case XEVT_LeaveNotify:
+            dst->xcrossing.root = from_ulong(src->xcrossing.root);
+            dst->xcrossing.subwindow = from_ulong(src->xcrossing.subwindow);
+            dst->xcrossing.time = from_ulong(src->xcrossing.time);
+            dst->xcrossing.x = src->xcrossing.x;
+            dst->xcrossing.y = src->xcrossing.y;
+            dst->xcrossing.x_root = src->xcrossing.x_root;
+            dst->xcrossing.y_root = src->xcrossing.y_root;
+            dst->xcrossing.mode = src->xcrossing.mode;
+            dst->xcrossing.detail = src->xcrossing.detail;
+            dst->xcrossing.same_screen = src->xcrossing.same_screen;
+            dst->xcrossing.focus = src->xcrossing.focus;
+            dst->xcrossing.state = src->xcrossing.state;
+            break;
+        case XEVT_FocusIn:
+        case XEVT_FocusOut:
+            dst->xfocus.mode = src->xfocus.mode;
+            dst->xfocus.detail = src->xfocus.detail;
+            break;
+        case XEVT_KeymapNotify:
+            memcpy(dst->xkeymap.key_vector, src->xkeymap.key_vector, 32);
+            break;
+        case XEVT_Expose:
+            dst->xexpose.x = src->xexpose.x;
+            dst->xexpose.y = src->xexpose.y;
+            dst->xexpose.width = src->xexpose.width;
+            dst->xexpose.height = src->xexpose.height;
+            dst->xexpose.count = src->xexpose.count;
+            break;
+        case XEVT_GraphicsExpose:
+            dst->xgraphicsexpose.x = src->xgraphicsexpose.x;
+            dst->xgraphicsexpose.y = src->xgraphicsexpose.y;
+            dst->xgraphicsexpose.width = src->xgraphicsexpose.width;
+            dst->xgraphicsexpose.height = src->xgraphicsexpose.height;
+            dst->xgraphicsexpose.count = src->xgraphicsexpose.count;
+            dst->xgraphicsexpose.major_code = src->xgraphicsexpose.major_code;
+            dst->xgraphicsexpose.minor_code = src->xgraphicsexpose.minor_code;
+            break;
+        case XEVT_NoExpose:
+            dst->xnoexpose.major_code = src->xnoexpose.major_code;
+            dst->xnoexpose.minor_code = src->xnoexpose.minor_code;
+            break;
+        case XEVT_VisibilityNotify:
+            dst->xvisibility.state = src->xvisibility.state;
+            break;
+        case XEVT_CreateNotify:
+            dst->xcreatewindow.window = from_ulong(src->xcreatewindow.window);
+            dst->xcreatewindow.x = src->xcreatewindow.x;
+            dst->xcreatewindow.y = src->xcreatewindow.y;
+            dst->xcreatewindow.width = src->xcreatewindow.width;
+            dst->xcreatewindow.height = src->xcreatewindow.height;
+            dst->xcreatewindow.border_width = src->xcreatewindow.border_width;
+            dst->xcreatewindow.override_redirect = src->xcreatewindow.override_redirect;
+            break;
+        case XEVT_DestroyNotify:
+            dst->xdestroywindow.window = from_ulong(src->xdestroywindow.window);
+            break;
+        case XEVT_UnmapNotify:
+            dst->xunmap.window = from_ulong(src->xunmap.window);
+            dst->xunmap.from_configure = src->xunmap.from_configure;
+            break;
+        case XEVT_MapNotify:
+            dst->xmap.window = from_ulong(src->xmap.window);
+            dst->xmap.override_redirect = src->xmap.override_redirect;
+            break;
+        case XEVT_MapRequest:
+            dst->xmaprequest.window = from_ulong(src->xmaprequest.window);
+            break;
+        case XEVT_ReparentNotify:
+            dst->xreparent.window = from_ulong(src->xreparent.window);
+            dst->xreparent.parent = from_ulong(src->xreparent.parent);
+            dst->xreparent.x = src->xreparent.x;
+            dst->xreparent.y = src->xreparent.y;
+            dst->xreparent.override_redirect = src->xreparent.override_redirect;
+            break;
+        case XEVT_ConfigureNotify:
+            dst->xconfigure.window = from_ulong(src->xconfigure.window);
+            dst->xconfigure.x = src->xconfigure.x;
+            dst->xconfigure.y = src->xconfigure.y;
+            dst->xconfigure.width = src->xconfigure.width;
+            dst->xconfigure.height = src->xconfigure.height;
+            dst->xconfigure.border_width = src->xconfigure.border_width;
+            dst->xconfigure.above = from_ulong(src->xconfigure.above);
+            dst->xconfigure.override_redirect = src->xconfigure.override_redirect;
+            break;
+        case XEVT_ConfigureRequest:
+            dst->xconfigurerequest.window = from_ulong(src->xconfigurerequest.window);
+            dst->xconfigurerequest.x = src->xconfigurerequest.x;
+            dst->xconfigurerequest.y = src->xconfigurerequest.y;
+            dst->xconfigurerequest.width = src->xconfigurerequest.width;
+            dst->xconfigurerequest.height = src->xconfigurerequest.height;
+            dst->xconfigurerequest.border_width = src->xconfigurerequest.border_width;
+            dst->xconfigurerequest.above = from_ulong(src->xconfigurerequest.above);
+            dst->xconfigurerequest.detail = src->xconfigurerequest.detail;
+            dst->xconfigurerequest.value_mask = from_ulong(src->xconfigurerequest.value_mask);
+            break;
+        case XEVT_GravityNotify:
+            dst->xgravity.window = from_ulong(src->xgravity.window);
+            dst->xgravity.x = src->xgravity.x;
+            dst->xgravity.y = src->xgravity.y;
+            break;
+        case XEVT_ResizeRequest:
+            dst->xresizerequest.width = src->xresizerequest.width;
+            dst->xresizerequest.height = src->xresizerequest.height;
+            break;
+        case XEVT_CirculateNotify:
+            dst->xcirculate.window = from_ulong(src->xcirculate.window);
+            dst->xcirculate.place = src->xcirculate.place;
+            break;
+        case XEVT_CirculateRequest:
+            dst->xcirculaterequest.window = from_ulong(src->xcirculaterequest.window);
+            dst->xcirculaterequest.place = src->xcirculaterequest.place;
+            break;
+        case XEVT_PropertyNotify:
+            dst->xproperty.atom = from_ulong(src->xproperty.atom);
+            dst->xproperty.time = from_ulong(src->xproperty.time);
+            dst->xproperty.state = src->xproperty.state;
+            break;
+        case XEVT_SelectionClear:
+            dst->xselectionclear.selection = from_ulong(src->xselectionclear.selection);
+            dst->xselectionclear.time = from_ulong(src->xselectionclear.time);
+            break;
+        case XEVT_SelectionRequest:
+            dst->xselectionrequest.requestor = from_ulong(src->xselectionrequest.requestor);
+            dst->xselectionrequest.selection = from_ulong(src->xselectionrequest.selection);
+            dst->xselectionrequest.target = from_ulong(src->xselectionrequest.target);
+            dst->xselectionrequest.property = from_ulong(src->xselectionrequest.property);
+            dst->xselectionrequest.time = from_ulong(src->xselectionrequest.time);
+            break;
+        case XEVT_SelectionNotify:
+            dst->xselection.selection = from_ulong(src->xselection.selection);
+            dst->xselection.target = from_ulong(src->xselection.target);
+            dst->xselection.property = from_ulong(src->xselection.property);
+            dst->xselection.time = from_ulong(src->xselection.time);
+            break;
+        case XEVT_ColormapNotify:
+            dst->xcolormap.colormap = from_ulong(src->xcolormap.colormap);
+            dst->xcolormap.c_new = src->xcolormap.c_new;
+            dst->xcolormap.state = src->xcolormap.state;
+            break;
+        case XEVT_ClientMessage:
+            dst->xclient.message_type = from_ulong(src->xclient.message_type);
+            dst->xclient.format = src->xclient.format;
+            if(src->xclient.format==32)
+                for(int i=0; i<5; ++i) dst->xclient.data.l[i] = from_ulong(src->xclient.data.l[i]);
+            else
+                memcpy(dst->xclient.data.b, src->xclient.data.b, 20);
+            break;
+        case XEVT_MappingNotify:
+            dst->xmapping.request = src->xmapping.request;
+            dst->xmapping.first_keycode = src->xmapping.first_keycode;
+            dst->xmapping.count = src->xmapping.count;
+            break;
+        case XEVT_GenericEvent:
+            dst->xcookie.extension = src->xcookie.extension;
+            dst->xcookie.evtype = src->xcookie.evtype;
+            dst->xcookie.cookie = src->xcookie.cookie;
+            dst->xcookie.data = from_ptrv(src->xcookie.data);
+            break;
+
+        default:
+            register_events_t* head = register_events_head;
+            while(head) {
+                if(type>=head->start_event && type<=head->end_event) {
+                    for(int i=0; i<head->n; ++i)
+                        if(type==head->events[i].event) {
+                            head->events[i].to64(dst, src);
+                            return;
+                        }
+                }
+                head = head->next;
+            }
+            printf_log(LOG_INFO, "Warning, unsupported 32bits (un)XEvent type=%d\n", type);
+    }
+}
+
+void convert_XErrorEvent_to_32(void* d, void* s)
+{
+    my_XErrorEvent_t* src = s;
+    my_XErrorEvent_32_t* dst = d;
+    dst->type = src->type;
+    dst->display = to_ptrv(FindDisplay(src->display));
+    dst->resourceid = to_ulong(src->resourceid);
+    dst->serial = to_ulong(src->serial);
+    dst->error_code = src->error_code;
+    dst->request_code = src->request_code;
+    dst->minor_code = src->minor_code;
+}
+void convert_XErrorEvent_to_64(void* d, void* s)
+{
+    my_XErrorEvent_32_t* src = s;
+    my_XErrorEvent_t* dst = d;
+    dst->minor_code = src->minor_code;
+    dst->request_code = src->request_code;
+    dst->error_code = src->error_code;
+    dst->serial = from_ulong(src->serial);
+    dst->resourceid = from_ulong(src->resourceid);
+    dst->display = getDisplay(from_ptrv(src->display));
+    dst->type = src->type;
+}
+
+void convert_XDeviceKeyEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XDeviceKeyEvent_t* src = (my_XDeviceKeyEvent_t*)s;
+    my_XDeviceKeyEvent_32_t* dst = (my_XDeviceKeyEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->deviceid = to_ulong(src->deviceid);
+    dst->root = to_ulong(src->root);
+    dst->subwindow = to_ulong(src->subwindow);
+    dst->time = to_ulong(src->time);
+    dst->x = src->x;
+    dst->y = src->y;
+    dst->x_root = src->x_root;
+    dst->y_root = src->y_root;
+    dst->state = src->state;
+    dst->keycode = src->keycode;
+    dst->same_screen = src->same_screen;
+    dst->device_state = src->device_state;
+    dst->axes_count = src->axes_count;
+    dst->first_axis = src->first_axis;
+    dst->axis_data[0] = src->axis_data[0];
+    dst->axis_data[1] = src->axis_data[1];
+    dst->axis_data[2] = src->axis_data[2];
+    dst->axis_data[3] = src->axis_data[3];
+    dst->axis_data[4] = src->axis_data[4];
+    dst->axis_data[5] = src->axis_data[5];
+}
+void convert_XDeviceKeyEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XDeviceKeyEvent_32_t* src = (my_XDeviceKeyEvent_32_t*)s;
+    my_XDeviceKeyEvent_t* dst = (my_XDeviceKeyEvent_t*)d;
+
+    dst->axis_data[5] = src->axis_data[5];
+    dst->axis_data[4] = src->axis_data[4];
+    dst->axis_data[3] = src->axis_data[3];
+    dst->axis_data[2] = src->axis_data[2];
+    dst->axis_data[1] = src->axis_data[1];
+    dst->axis_data[0] = src->axis_data[0];
+    dst->first_axis = src->first_axis;
+    dst->axes_count = src->axes_count;
+    dst->device_state = src->device_state;
+    dst->same_screen = src->same_screen;
+    dst->keycode = src->keycode;
+    dst->state = src->state;
+    dst->y_root = src->y_root;
+    dst->x_root = src->x_root;
+    dst->y = src->y;
+    dst->x = src->x;
+    dst->time = from_ulong(src->time);
+    dst->subwindow = from_ulong(src->subwindow);
+    dst->root = from_ulong(src->root);
+    dst->deviceid = from_ulong(src->deviceid);
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+void convert_XDeviceMotionEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XDeviceMotionEvent_t* src = (my_XDeviceMotionEvent_t*)s;
+    my_XDeviceMotionEvent_32_t* dst = (my_XDeviceMotionEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->deviceid = to_ulong(src->deviceid);
+    dst->root = to_ulong(src->root);
+    dst->subwindow = to_ulong(src->subwindow);
+    dst->time = to_ulong(src->time);
+    dst->x = src->x;
+    dst->y = src->y;
+    dst->x_root = src->x_root;
+    dst->y_root = src->y_root;
+    dst->state = src->state;
+    dst->is_hint = src->is_hint;
+    dst->same_screen = src->same_screen;
+    dst->device_state = src->device_state;
+    dst->axes_count = src->axes_count;
+    dst->first_axis = src->first_axis;
+    dst->axis_data[0] = src->axis_data[0];
+    dst->axis_data[1] = src->axis_data[1];
+    dst->axis_data[2] = src->axis_data[2];
+    dst->axis_data[3] = src->axis_data[3];
+    dst->axis_data[4] = src->axis_data[4];
+    dst->axis_data[5] = src->axis_data[5];
+}
+void convert_XDeviceMotionEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XDeviceMotionEvent_32_t* src = (my_XDeviceMotionEvent_32_t*)s;
+    my_XDeviceMotionEvent_t* dst = (my_XDeviceMotionEvent_t*)d;
+
+    dst->axis_data[5] = src->axis_data[5];
+    dst->axis_data[4] = src->axis_data[4];
+    dst->axis_data[3] = src->axis_data[3];
+    dst->axis_data[2] = src->axis_data[2];
+    dst->axis_data[1] = src->axis_data[1];
+    dst->axis_data[0] = src->axis_data[0];
+    dst->first_axis = src->first_axis;
+    dst->axes_count = src->axes_count;
+    dst->device_state = src->device_state;
+    dst->same_screen = src->same_screen;
+    dst->is_hint = src->is_hint;
+    dst->state = src->state;
+    dst->y_root = src->y_root;
+    dst->x_root = src->x_root;
+    dst->y = src->y;
+    dst->x = src->x;
+    dst->time = from_ulong(src->time);
+    dst->subwindow = from_ulong(src->subwindow);
+    dst->root = from_ulong(src->root);
+    dst->deviceid = from_ulong(src->deviceid);
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+void convert_XDeviceFocusEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XDeviceFocusChangeEvent_t* src = (my_XDeviceFocusChangeEvent_t*)s;
+    my_XDeviceFocusChangeEvent_32_t* dst = (my_XDeviceFocusChangeEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->deviceid = to_ulong(src->deviceid);
+    dst->mode = src->mode;
+    dst->detail = src->detail;
+    dst->time = to_ulong(src->time);
+}
+void convert_XDeviceFocusEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XDeviceFocusChangeEvent_32_t* src = (my_XDeviceFocusChangeEvent_32_t*)s;
+    my_XDeviceFocusChangeEvent_t* dst = (my_XDeviceFocusChangeEvent_t*)d;
+
+    dst->time = from_ulong(src->time);
+    dst->detail = src->detail;
+    dst->mode = src->mode;
+    dst->deviceid = from_ulong(src->deviceid);
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+void convert_XProximityNotifyEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XProximityNotifyEvent_t* src = (my_XProximityNotifyEvent_t*)s;
+    my_XProximityNotifyEvent_32_t* dst = (my_XProximityNotifyEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->deviceid = to_ulong(src->deviceid);
+    dst->root = to_ulong(src->root);
+    dst->subwindow = to_ulong(src->subwindow);
+    dst->time = to_ulong(src->time);
+    dst->x = src->x;
+    dst->y = src->y;
+    dst->x_root = src->x_root;
+    dst->y_root = src->y_root;
+    dst->state = src->state;
+    dst->same_screen = src->same_screen;
+    dst->device_state = src->device_state;
+    dst->axes_count = src->axes_count;
+    dst->first_axis = src->first_axis;
+    dst->axis_data[0] = src->axis_data[0];
+    dst->axis_data[1] = src->axis_data[1];
+    dst->axis_data[2] = src->axis_data[2];
+    dst->axis_data[3] = src->axis_data[3];
+    dst->axis_data[4] = src->axis_data[4];
+    dst->axis_data[5] = src->axis_data[5];
+}
+void convert_XProximityNotifyEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XProximityNotifyEvent_32_t* src = (my_XProximityNotifyEvent_32_t*)s;
+    my_XProximityNotifyEvent_t* dst = (my_XProximityNotifyEvent_t*)d;
+
+    dst->axis_data[5] = src->axis_data[5];
+    dst->axis_data[4] = src->axis_data[4];
+    dst->axis_data[3] = src->axis_data[3];
+    dst->axis_data[2] = src->axis_data[2];
+    dst->axis_data[1] = src->axis_data[1];
+    dst->axis_data[0] = src->axis_data[0];
+    dst->first_axis = src->first_axis;
+    dst->axes_count = src->axes_count;
+    dst->device_state = src->device_state;
+    dst->same_screen = src->same_screen;
+    dst->state = src->state;
+    dst->y_root = src->y_root;
+    dst->x_root = src->x_root;
+    dst->y = src->y;
+    dst->x = src->x;
+    dst->time = from_ulong(src->time);
+    dst->subwindow = from_ulong(src->subwindow);
+    dst->root = from_ulong(src->root);
+    dst->deviceid = from_ulong(src->deviceid);
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+void convert_XDeviceStateNotifyEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XDeviceStateNotifyEvent_t* src = (my_XDeviceStateNotifyEvent_t*)s;
+    my_XDeviceStateNotifyEvent_32_t* dst = (my_XDeviceStateNotifyEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->deviceid = to_ulong(src->deviceid);
+    dst->time = to_ulong(src->time);
+    memmove(dst->data, src->data, 64);
+}
+void convert_XDeviceStateNotifyEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XDeviceStateNotifyEvent_32_t* src = (my_XDeviceStateNotifyEvent_32_t*)s;
+    my_XDeviceStateNotifyEvent_t* dst = (my_XDeviceStateNotifyEvent_t*)d;
+
+    memmove(dst->data, src->data, 64);
+    dst->time = from_ulong(src->time);
+    dst->deviceid = from_ulong(src->deviceid);
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+void convert_XDeviceMappingEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XDeviceMappingEvent_t* src = (my_XDeviceMappingEvent_t*)s;
+    my_XDeviceMappingEvent_32_t* dst = (my_XDeviceMappingEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->deviceid = to_ulong(src->deviceid);
+    dst->time = to_ulong(src->time);
+    dst->request = src->request;
+    dst->first_keycode = src->first_keycode;
+    dst->count = src->count;
+}
+void convert_XDeviceMappingEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XDeviceMappingEvent_32_t* src = (my_XDeviceMappingEvent_32_t*)s;
+    my_XDeviceMappingEvent_t* dst = (my_XDeviceMappingEvent_t*)d;
+
+    dst->count = src->count;
+    dst->first_keycode = src->first_keycode;
+    dst->request = src->request;
+    dst->time = from_ulong(src->time);
+    dst->deviceid = from_ulong(src->deviceid);
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+void convert_XChangeDeviceNotifyEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XChangeDeviceNotifyEvent_t* src = (my_XChangeDeviceNotifyEvent_t*)s;
+    my_XChangeDeviceNotifyEvent_32_t* dst = (my_XChangeDeviceNotifyEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->deviceid = to_ulong(src->deviceid);
+    dst->time = to_ulong(src->time);
+    dst->request = src->request;
+}
+void convert_XChangeDeviceNotifyEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XChangeDeviceNotifyEvent_32_t* src = (my_XChangeDeviceNotifyEvent_32_t*)s;
+    my_XChangeDeviceNotifyEvent_t* dst = (my_XChangeDeviceNotifyEvent_t*)d;
+
+    dst->request = src->request;
+    dst->time = from_ulong(src->time);
+    dst->deviceid = from_ulong(src->deviceid);
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+void convert_XDevicePresenceNotifyEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XDevicePresenceNotifyEvent_t* src = (my_XDevicePresenceNotifyEvent_t*)s;
+    my_XDevicePresenceNotifyEvent_32_t* dst = (my_XDevicePresenceNotifyEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->time = to_ulong(src->time);
+    dst->devchange = src->devchange;
+    dst->deviceid = to_ulong(src->deviceid);
+    dst->control = to_ulong(src->control);
+}
+void convert_XDevicePresenceNotifyEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XDevicePresenceNotifyEvent_32_t* src = (my_XDevicePresenceNotifyEvent_32_t*)s;
+    my_XDevicePresenceNotifyEvent_t* dst = (my_XDevicePresenceNotifyEvent_t*)d;
+
+    dst->control = from_ulong(src->control);
+    dst->deviceid = from_ulong(src->deviceid);
+    dst->devchange = src->devchange;
+    dst->time = from_ulong(src->time);
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+void convert_XDevicePropertyNotifyEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XDevicePropertyNotifyEvent_t* src = (my_XDevicePropertyNotifyEvent_t*)s;
+    my_XDevicePropertyNotifyEvent_32_t* dst = (my_XDevicePropertyNotifyEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->time = to_ulong(src->time);
+    dst->deviceid = to_ulong(src->deviceid);
+    dst->atom = to_ulong(src->atom);
+    dst->state = src->state;
+}
+void convert_XDevicePropertyNotifyEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XDevicePropertyNotifyEvent_32_t* src = (my_XDevicePropertyNotifyEvent_32_t*)s;
+    my_XDevicePropertyNotifyEvent_t* dst = (my_XDevicePropertyNotifyEvent_t*)d;
+
+    dst->state = src->state;
+    dst->atom = from_ulong(src->atom);
+    dst->deviceid = from_ulong(src->deviceid);
+    dst->time = from_ulong(src->time);
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+void register_XDevice_events(my_XDevice_t* a)
+{
+    if(!a) return;
+    // search if device is already in list
+    register_events_t* head = register_events_head;
+    while(head) {
+        if(head->id == a)
+            return; // found, nothing to do....
+        head = head->next;
+    }
+    // counts events
+    int n=0;
+    for(int i=0; i<a->num_classes; ++i)
+        switch(a->classes[i].input_class) {
+            case 0: n+=2; break; //KeyClass
+            case 1: n+=2; break; //ButtonClass
+            case 2: n+=1; break; //ValuatorClass
+            case 5: n+=2; break; //FocusClass
+            case 4: n+=2; break; //ProximityClass
+            case 6: n+=4; break; //OtherClass
+        }
+    // check if there is something to notify
+    if(!n) return;
+    // create a new event list
+    register_events_t* events = box_malloc(sizeof(register_events_t)+n*sizeof(reg_event_t));
+    events->id = a;
+    events->n = n;
+    events->events = (reg_event_t*)(events+1);
+    n = 0;
+    for(int i=0; i<a->num_classes; ++i) {
+        switch(a->classes[i].input_class) {
+            case 0: //KeyClass
+                events->events[n].event = a->classes[i].event_type_base+0;
+                events->events[n].to32 = convert_XDeviceKeyEvent_to_32;
+                events->events[n].to64 = convert_XDeviceKeyEvent_to_64;
+                ++n;
+                events->events[n].event = a->classes[i].event_type_base+1;
+                events->events[n].to32 = convert_XDeviceKeyEvent_to_32;
+                events->events[n].to64 = convert_XDeviceKeyEvent_to_64;
+                ++n;
+                break;  
+            case 1: //ButtonClass
+                events->events[n].event = a->classes[i].event_type_base+0;
+                events->events[n].to32 = convert_XDeviceKeyEvent_to_32;
+                events->events[n].to64 = convert_XDeviceKeyEvent_to_64;
+                ++n;
+                events->events[n].event = a->classes[i].event_type_base+1;
+                events->events[n].to32 = convert_XDeviceKeyEvent_to_32;
+                events->events[n].to64 = convert_XDeviceKeyEvent_to_64;
+                ++n;
+                break;
+            case 2: //ValuatorClass
+                events->events[n].event = a->classes[i].event_type_base+0;
+                events->events[n].to32 = convert_XDeviceMotionEvent_to_32;
+                events->events[n].to64 = convert_XDeviceMotionEvent_to_64;
+                ++n;
+                break;
+            case 5: //FocusClass
+                events->events[n].event = a->classes[i].event_type_base+0;
+                events->events[n].to32 = convert_XDeviceFocusEvent_to_32;
+                events->events[n].to64 = convert_XDeviceFocusEvent_to_64;
+                ++n;
+                events->events[n].event = a->classes[i].event_type_base+1;
+                events->events[n].to32 = convert_XDeviceFocusEvent_to_32;
+                events->events[n].to64 = convert_XDeviceFocusEvent_to_64;
+                ++n;
+                break;
+            case 4: //ProximityClass
+                events->events[n].event = a->classes[i].event_type_base+0;
+                events->events[n].to32 = convert_XProximityNotifyEvent_to_32;
+                events->events[n].to64 = convert_XProximityNotifyEvent_to_64;
+                ++n;
+                events->events[n].event = a->classes[i].event_type_base+1;
+                events->events[n].to32 = convert_XProximityNotifyEvent_to_32;
+                events->events[n].to64 = convert_XProximityNotifyEvent_to_64;
+                ++n;
+                break;
+            case 6: //OtherClass
+                events->events[n].event = a->classes[i].event_type_base+0;
+                events->events[n].to32 = convert_XDeviceStateNotifyEvent_to_32;
+                events->events[n].to64 = convert_XDeviceStateNotifyEvent_to_64;
+                ++n;
+                events->events[n].event = a->classes[i].event_type_base+1;
+                events->events[n].to32 = convert_XDeviceMappingEvent_to_32;
+                events->events[n].to64 = convert_XDeviceMappingEvent_to_64;
+                ++n;
+                events->events[n].event = a->classes[i].event_type_base+2;
+                events->events[n].to32 = convert_XChangeDeviceNotifyEvent_to_32;
+                events->events[n].to64 = convert_XChangeDeviceNotifyEvent_to_64;
+                ++n;
+                //+3 would be DeviceKeyStateNotify
+                //+4 wpuld be DeviceButtonStateNotify
+                //+5 would be DevicePresenceNotify
+                events->events[n].event = a->classes[i].event_type_base+6;
+                events->events[n].to32 = convert_XDevicePropertyNotifyEvent_to_32;
+                events->events[n].to64 = convert_XDevicePropertyNotifyEvent_to_64;
+                ++n;
+                break;
+        }
+    }
+    events->start_event = events->end_event = events->events[0].event;
+    for(int i=1; i<n; ++i) {
+        if(events->start_event>events->events[i].event) events->start_event = events->events[i].event;
+        if(events->end_event<events->events[i].event) events->end_event = events->events[i].event;
+    }
+    events->next = register_events_head;
+    register_events_head = events;
+}
+void unregister_XDevice_events(my_XDevice_t* a)
+{
+    if(!a) return;
+    register_events_t* prev = NULL;
+    register_events_t* head = register_events_head;
+    while(head) {
+        if(head->id == a) {
+            if(!prev)
+                register_events_head = head->next;
+            else
+                prev->next = head->next;
+            box_free(head);
+            return;
+        }
+        prev = head;
+        head = head->next;
+    }
+}
+
+void convert_XFixesSelectionNotifyEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XFixesSelectionNotifyEvent_t* src = (my_XFixesSelectionNotifyEvent_t*)s;
+    my_XFixesSelectionNotifyEvent_32_t* dst = (my_XFixesSelectionNotifyEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->subtype = src->subtype;
+    dst->owner = to_ulong(src->owner);
+    dst->selection = to_ulong(src->selection);
+    dst->timestamp = to_ulong(src->timestamp);
+    dst->selection_timestamp = to_ulong(src->selection_timestamp);
+}
+void convert_XFixesSelectionNotifyEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XFixesSelectionNotifyEvent_32_t* src = (my_XFixesSelectionNotifyEvent_32_t*)s;
+    my_XFixesSelectionNotifyEvent_t* dst = (my_XFixesSelectionNotifyEvent_t*)d;
+
+    dst->selection_timestamp = from_ulong(src->selection_timestamp);
+    dst->timestamp = from_ulong(src->timestamp);
+    dst->selection = from_ulong(src->selection);
+    dst->owner = from_ulong(src->owner);
+    dst->subtype = src->subtype;
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+void convert_XFixesCursorNotifyEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XFixesCursorNotifyEvent_t* src = (my_XFixesCursorNotifyEvent_t*)s;
+    my_XFixesCursorNotifyEvent_32_t* dst = (my_XFixesCursorNotifyEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->subtype = src->subtype;
+    dst->cursor_serial = to_ulong(src->cursor_serial);
+    dst->timestamp = to_ulong(src->timestamp);
+    dst->cursor_name = to_ulong(src->cursor_name);
+}
+void convert_XFixesCursorNotifyEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XFixesCursorNotifyEvent_32_t* src = (my_XFixesCursorNotifyEvent_32_t*)s;
+    my_XFixesCursorNotifyEvent_t* dst = (my_XFixesCursorNotifyEvent_t*)d;
+
+    dst->cursor_serial = from_ulong(src->cursor_serial);
+    dst->timestamp = from_ulong(src->timestamp);
+    dst->cursor_name = from_ulong(src->cursor_name);
+    dst->subtype = src->subtype;
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+
+void register_XFixes_events(int event_base)
+{
+    void* a = (void*)1LL;
+    // search if device is already in list
+    register_events_t* head = register_events_head;
+    while(head) {
+        if(head->id == a)
+            return; // found, nothing to do....
+        head = head->next;
+    }
+    int n = 2;  // 2 events to register!
+    // create a new event list
+    register_events_t* events = box_malloc(sizeof(register_events_t)+n*sizeof(reg_event_t));
+    events->id = a;
+    events->n = n;
+    events->events = (reg_event_t*)(events+1);
+
+    events->events[0].event = event_base+0;
+    events->events[0].to32 = convert_XFixesSelectionNotifyEvent_to_32;
+    events->events[0].to64 = convert_XFixesSelectionNotifyEvent_to_64;
+    events->events[1].event = event_base+1;
+    events->events[1].to32 = convert_XFixesCursorNotifyEvent_to_32;
+    events->events[1].to64 = convert_XFixesCursorNotifyEvent_to_64;
+
+    events->start_event = events->end_event = events->events[0].event;
+    events->next = register_events_head;
+    register_events_head = events;
+}
+void unregister_XFixes_events()
+{
+    void* a = (void*)1LL;
+    register_events_t* prev = NULL;
+    register_events_t* head = register_events_head;
+    while(head) {
+        if(head->id == a) {
+            if(!prev)
+                register_events_head = head->next;
+            else
+                prev->next = head->next;
+            box_free(head);
+            return;
+        }
+        prev = head;
+        head = head->next;
+    }
+}
+
+void convert_XRRScreenChangeNotifyEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XRRScreenChangeNotifyEvent_t* src = (my_XRRScreenChangeNotifyEvent_t*)s;
+    my_XRRScreenChangeNotifyEvent_32_t* dst = (my_XRRScreenChangeNotifyEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    dst->root = to_ulong(src->root);
+    dst->timestamp = to_ulong(src->timestamp);
+    dst->config_timestamp = to_ulong(src->config_timestamp);
+    dst->size_index = src->size_index;
+    dst->subpixel_order = src->subpixel_order;
+    dst->rotation = src->rotation;
+    dst->width = src->width;
+    dst->height = src->height;
+    dst->mwidth = src->mwidth;
+    dst->mheight = src->mheight;
+}
+void convert_XRRScreenChangeNotifyEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XRRScreenChangeNotifyEvent_32_t* src = (my_XRRScreenChangeNotifyEvent_32_t*)s;
+    my_XRRScreenChangeNotifyEvent_t* dst = (my_XRRScreenChangeNotifyEvent_t*)d;
+
+    dst->mheight = src->mheight;
+    dst->mwidth = src->mwidth;
+    dst->height = src->height;
+    dst->width = src->width;
+    dst->rotation = src->rotation;
+    dst->subpixel_order = src->subpixel_order;
+    dst->size_index = src->size_index;
+    dst->config_timestamp = from_ulong(src->config_timestamp);
+    dst->timestamp = from_ulong(src->timestamp);
+    dst->root = from_ulong(src->root);
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+void convert_XRRNotifyEvent_to_32(my_XEvent_32_t* d, my_XEvent_t* s)
+{
+    my_XRRNotifyEvent_t* src = (my_XRRNotifyEvent_t*)s;
+    my_XRRNotifyEvent_32_t* dst = (my_XRRNotifyEvent_32_t*)d;
+
+    //dst->type = src->type;
+    //dst->serial = src->serial;
+    //dst->send_event = src->send_event;
+    //dst->display = src->display;
+    //dst->window = src->window;
+    int subtype = src->subtype;
+    dst->subtype = src->subtype;
+    switch (subtype) {
+        case 0: {
+            my_XRROutputChangeNotifyEvent_t* src = (my_XRROutputChangeNotifyEvent_t*)s;
+            my_XRROutputChangeNotifyEvent_32_t* dst = (my_XRROutputChangeNotifyEvent_32_t*)d;
+            dst->output = to_long(src->output);
+            dst->crtc = to_long(src->crtc);
+            dst->mode = to_long(src->mode);
+            dst->rotation = src->rotation;
+            dst->connection = src->connection;
+            dst->subpixel_order = src->subpixel_order;
+        } break;
+        case 1: {
+            my_XRRCrtcChangeNotifyEvent_t* src = (my_XRRCrtcChangeNotifyEvent_t*)s;
+            my_XRRCrtcChangeNotifyEvent_32_t* dst = (my_XRRCrtcChangeNotifyEvent_32_t*)d;
+            dst->crtc = to_ulong(src->crtc);
+            dst->mode = to_ulong(src->mode);
+            dst->rotation = src->rotation;
+            dst->x = src->x;
+            dst->y = src->y;
+            dst->width = src->width;
+            dst->height = src->height;
+        } break;
+        case 2: {
+            my_XRROutputPropertyNotifyEvent_t* src = (my_XRROutputPropertyNotifyEvent_t*)s;
+            my_XRROutputPropertyNotifyEvent_32_t* dst = (my_XRROutputPropertyNotifyEvent_32_t*)d;
+            dst->output = to_ulong(src->output);
+            dst->property = to_ulong(src->property);
+            dst->timestamp = to_ulong(src->timestamp);
+            dst->state = src->state;
+        } break;
+        case 3: {
+            my_XRRProviderChangeNotifyEvent_t* src = (my_XRRProviderChangeNotifyEvent_t*)s;
+            my_XRRProviderChangeNotifyEvent_32_t* dst = (my_XRRProviderChangeNotifyEvent_32_t*)d;
+            dst->provider = to_ulong(src->provider);
+            dst->timestamp = to_ulong(src->timestamp);
+            dst->current_role = src->current_role;
+        } break;
+        case 4: {
+            my_XRRProviderPropertyNotifyEvent_t* src = (my_XRRProviderPropertyNotifyEvent_t*)s;
+            my_XRRProviderPropertyNotifyEvent_32_t* dst = (my_XRRProviderPropertyNotifyEvent_32_t*)d;
+            dst->provider = to_ulong(src->provider);
+            dst->property = to_ulong(src->property);
+            dst->timestamp = to_ulong(src->timestamp);
+            dst->state = src->state;
+        } break;
+        case 5: {
+            my_XRRResourceChangeNotifyEvent_t* src = (my_XRRResourceChangeNotifyEvent_t*)s;
+            my_XRRResourceChangeNotifyEvent_32_t* dst = (my_XRRResourceChangeNotifyEvent_32_t*)d;
+            dst->timestamp = to_ulong(src->timestamp);
+        } break;
+    }
+}
+void convert_XRRNotifyEvent_to_64(my_XEvent_t* d, my_XEvent_32_t* s)
+{
+    my_XRRNotifyEvent_32_t* src = (my_XRRNotifyEvent_32_t*)s;
+    my_XRRNotifyEvent_t* dst = (my_XRRNotifyEvent_t*)d;
+    int subtype = src->subtype;
+    switch (subtype) {
+        case 0: {
+            my_XRROutputChangeNotifyEvent_32_t* src = (my_XRROutputChangeNotifyEvent_32_t*)s;
+            my_XRROutputChangeNotifyEvent_t* dst = (my_XRROutputChangeNotifyEvent_t*)d;
+            dst->output = from_long(src->output);
+            dst->crtc = from_long(src->crtc);
+            dst->mode = from_long(src->mode);
+            dst->rotation = src->rotation;
+            dst->connection = src->connection;
+            dst->subpixel_order = src->subpixel_order;
+        } break;
+        case 1: {
+            my_XRRCrtcChangeNotifyEvent_32_t* src = (my_XRRCrtcChangeNotifyEvent_32_t*)s;
+            my_XRRCrtcChangeNotifyEvent_t* dst = (my_XRRCrtcChangeNotifyEvent_t*)d;
+            dst->crtc = from_ulong(src->crtc);
+            dst->mode = from_ulong(src->mode);
+            dst->rotation = src->rotation;
+            dst->x = src->x;
+            dst->y = src->y;
+            dst->width = src->width;
+            dst->height = src->height;
+        } break;
+        case 2: {
+            my_XRROutputPropertyNotifyEvent_32_t* src = (my_XRROutputPropertyNotifyEvent_32_t*)s;
+            my_XRROutputPropertyNotifyEvent_t* dst = (my_XRROutputPropertyNotifyEvent_t*)d;
+            dst->output = from_ulong(src->output);
+            dst->property = from_ulong(src->property);
+            dst->timestamp = from_ulong(src->timestamp);
+            dst->state = src->state;
+        } break;
+        case 3: {
+            my_XRRProviderChangeNotifyEvent_32_t* src = (my_XRRProviderChangeNotifyEvent_32_t*)s;
+            my_XRRProviderChangeNotifyEvent_t* dst = (my_XRRProviderChangeNotifyEvent_t*)d;
+            dst->provider = from_ulong(src->provider);
+            dst->timestamp = from_ulong(src->timestamp);
+            dst->current_role = src->current_role;
+        } break;
+        case 4: {
+            my_XRRProviderPropertyNotifyEvent_32_t* src = (my_XRRProviderPropertyNotifyEvent_32_t*)s;
+            my_XRRProviderPropertyNotifyEvent_t* dst = (my_XRRProviderPropertyNotifyEvent_t*)d;
+            dst->provider = from_ulong(src->provider);
+            dst->property = from_ulong(src->property);
+            dst->timestamp = from_ulong(src->timestamp);
+            dst->state = src->state;
+        } break;
+        case 5: {
+            my_XRRResourceChangeNotifyEvent_32_t* src = (my_XRRResourceChangeNotifyEvent_32_t*)s;
+            my_XRRResourceChangeNotifyEvent_t* dst = (my_XRRResourceChangeNotifyEvent_t*)d;
+            dst->timestamp = from_ulong(src->timestamp);
+        } break;
+    }
+    dst->subtype = src->subtype;
+    //dst->window = src->window;
+    //dst->display = src->display;
+    //dst->send_event = src->send_event;
+    //dst->serial = src->serial;
+    //dst->type = src->type;
+}
+
+void register_XRandR_events(int event_base)
+{
+    void* a = (void*)2LL;
+    // search if device is already in list
+    register_events_t* head = register_events_head;
+    while(head) {
+        if(head->id == a)
+            return; // found, nothing to do....
+        head = head->next;
+    }
+    int n = 2;  // 2 events to register!, but second one as 6+1 subtypes
+    // create a new event list
+    register_events_t* events = box_malloc(sizeof(register_events_t)+n*sizeof(reg_event_t));
+    events->id = a;
+    events->n = n;
+    events->events = (reg_event_t*)(events+1);
+
+    events->events[0].event = event_base+0;
+    events->events[0].to32 = convert_XRRScreenChangeNotifyEvent_to_32;
+    events->events[0].to64 = convert_XRRScreenChangeNotifyEvent_to_64;
+    events->events[1].event = event_base+1;
+    events->events[1].to32 = convert_XRRNotifyEvent_to_32;
+    events->events[1].to64 = convert_XRRNotifyEvent_to_64;
+
+    events->start_event = events->events[0].event;
+    events->end_event = events->events[1].event;
+    events->next = register_events_head;
+    register_events_head = events;
+}
+void unregister_XRandR_events()
+{
+    void* a = (void*)2LL;
+    register_events_t* prev = NULL;
+    register_events_t* head = register_events_head;
+    while(head) {
+        if(head->id == a) {
+            if(!prev)
+                register_events_head = head->next;
+            else
+                prev->next = head->next;
+            box_free(head);
+            return;
+        }
+        prev = head;
+        head = head->next;
+    }
+}
diff --git a/src/libtools/myalign32.c b/src/libtools/myalign32.c
index e47167d9..d16b8f28 100755
--- a/src/libtools/myalign32.c
+++ b/src/libtools/myalign32.c
@@ -351,13 +351,13 @@ void myStackAlignScanf32_final(const char* fmt, uint32_t* st, uint64_t* mystack,
                     ++conv;
                     if((state==22) || (state==25)) {
                         long_t* dst = from_ptrv(*st);
-                        *dst = to_long(saved[nb_elem-conv]);
+                        *dst = saved[nb_elem-conv]; // not using to_long on purpose
                     } else if(state==30) {
                         ptr_t* dst = from_ptrv(*st);
                         *dst = to_ptr(saved[nb_elem-conv]);
                     } else {
                         ulong_t* dst = from_ptrv(*st);
-                        *dst = to_ulong(saved[nb_elem-conv]);
+                        *dst = saved[nb_elem-conv]; //not using to to_ulong on pupose
                     }
                     ++st;
                     ++mystack;