diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-10-12 10:45:21 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-10-12 10:45:21 +0200 |
| commit | efd103004c770e8ec4646c11c24b92a5d8d49e54 (patch) | |
| tree | 354c6e648b293ca8bd02a7ced16202ebc41ebaa9 /src/libtools | |
| parent | 18e033cdd8520840110222e00da0c16d51f69fe0 (diff) | |
| download | box64-efd103004c770e8ec4646c11c24b92a5d8d49e54.tar.gz box64-efd103004c770e8ec4646c11c24b92a5d8d49e54.zip | |
[BOX32] Improved X11 event handling
Diffstat (limited to 'src/libtools')
| -rw-r--r-- | src/libtools/my_x11_conv.c | 549 | ||||
| -rw-r--r-- | src/libtools/my_x11_conv.h | 13 | ||||
| -rw-r--r-- | src/libtools/my_x11_defs.h | 270 | ||||
| -rw-r--r-- | src/libtools/my_x11_defs_32.h | 269 | ||||
| -rw-r--r-- | src/libtools/my_x11_xevent.c | 1351 | ||||
| -rwxr-xr-x | src/libtools/myalign32.c | 4 |
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; |