     [ "DIDEVICEOBJECTDATA" heap-size ] 2dip <uint>
     [ 0 IDirectInputDevice8W::GetDeviceData ole32-error ] 2keep *uint ;
 
-: (fill-mouse-state) ( state DIDEVICEOBJECTDATA -- )
-    [ DIDEVICEOBJECTDATA-dwData ] [ DIDEVICEOBJECTDATA-dwOfs ] bi {
-        { DIMOFS_X [ [ + ] curry change-dx drop ] }
-        { DIMOFS_Y [ [ + ] curry change-dy drop ] }
-        { DIMOFS_Z [ [ + ] curry change-scroll-dy drop ] }
-        [ [ c-bool> ] [ DIMOFS_BUTTON0 - ] bi* rot buttons>> set-nth ] 
+: (fill-mouse-state) ( state DIDEVICEOBJECTDATA -- state )
+    [ DIDEVICEOBJECTDATA-dwData 32 >signed ] [ DIDEVICEOBJECTDATA-dwOfs ] bi {
+        { DIMOFS_X [ [ + ] curry change-dx ] }
+        { DIMOFS_Y [ [ + ] curry change-dy ] }
+        { DIMOFS_Z [ [ + ] curry change-scroll-dy ] }
+        [ [ c-bool> ] [ DIMOFS_BUTTON0 - ] bi* rot [ buttons>> set-nth ] keep ]
     } case ;
 
-: fill-mouse-state ( buffer count -- )
+: fill-mouse-state ( buffer count -- state )
     [ +mouse-state+ get ] 2dip swap
-    [ DIDEVICEOBJECTDATA-nth (fill-mouse-state) ] curry each ;
+    [ "DIDEVICEOBJECTDATA" byte-array>struct-array nth (fill-mouse-state) ] curry each ;
 
 : get-device-state ( device byte-array -- )
     [ dup IDirectInputDevice8W::Poll ole32-error ] dip

math.rectangles accessors math alien alien.strings
io.encodings.utf16 io.encodings.utf16n continuations
byte-arrays game-input.dinput.keys-array game-input
ui.backend.windows windows.errors ;
IN: game-input.dinput

CONSTANT: MOUSE-BUFFER-SIZE 16

    GUID_SysMouse device-for-guid
    [ configure-mouse ]
    [ +mouse-device+ set-global ] bi
    0 0 0 0 8 f <array> mouse-state boa
    +mouse-state+ set-global
    MOUSE-BUFFER-SIZE "DIDEVICEOBJECTDATA" <c-array>
    +mouse-buffer+ set-global ;

