diff --git a/kernel/trunk/drivers/usbhid/mouse.inc b/kernel/trunk/drivers/usbhid/mouse.inc index 78d9e82bb7..2e43993e64 100644 --- a/kernel/trunk/drivers/usbhid/mouse.inc +++ b/kernel/trunk/drivers/usbhid/mouse.inc @@ -32,6 +32,13 @@ ends ; in: ebx -> device_data from USB layer, edi -> collection ; out: eax = device-specific data or NULL on error proc mouse_driver_add_device +; Get screen resolution so we can calculate absolute coordinates. + mov eax, 14 + int 0x40 + mov [screen_y], eax + and [screen_y], 0xffff + shr eax, 16 + mov [screen_x], eax ; Just allocate memory; no initialization needed. movi eax, sizeof.mouse_device_data call Kmalloc @@ -111,7 +118,7 @@ end if ; 3. This is x moving. For relative fields, store the value in the state. ; Pass absolute field to the default handler. test byte [esi+report_field_group.flags], HID_FIELD_RELATIVE - jz .unclaimed + jz .relative_x mov [edi+mouse_device_data.dx], edx ret .y: @@ -121,7 +128,7 @@ end if ; increasing from top to bottom. ; Pass absolute fields to the default handler. test byte [esi+report_field_group.flags], HID_FIELD_RELATIVE - jz .unclaimed + jz .relative_y neg edx mov [edi+mouse_device_data.dy], edx ret @@ -138,6 +145,26 @@ end if jz .unclaimed mov [edi+mouse_device_data.hwheel], edx ret +.relative_x: + push ebx + mov eax, [screen_x] + mul edx + mov ebx, 0x8000 + div ebx + mov [edi+mouse_device_data.dx], eax + or [edi+mouse_device_data.buttons], 0x80000000 + pop ebx + ret +.relative_y: + push ebx + mov eax, [screen_y] + mul edx + mov ebx, 0x8000 + div ebx + mov [edi+mouse_device_data.dy], eax + or [edi+mouse_device_data.buttons], 0x40000000 + pop ebx + ret endp ; This procedure is called when HID layer ends processing a new input packet diff --git a/kernel/trunk/drivers/usbhid/usbhid.asm b/kernel/trunk/drivers/usbhid/usbhid.asm index 0c4227131a..29ef502b02 100644 --- a/kernel/trunk/drivers/usbhid/usbhid.asm +++ b/kernel/trunk/drivers/usbhid/usbhid.asm @@ -534,6 +534,9 @@ disconnectmsg db 'K : USB HID device disconnected',13,10,0 invalid_report_msg db 'K : report descriptor is invalid',13,10,0 delimiter_note db 'K : note: alternate usage ignored',13,10,0 +screen_x dd ? +screen_y dd ? + ; Exported variable: kernel API version. align 4 version dd 50005h diff --git a/kernel/trunk/hid/mousedrv.inc b/kernel/trunk/hid/mousedrv.inc index 74eb7eec60..eb39227e22 100644 --- a/kernel/trunk/hid/mousedrv.inc +++ b/kernel/trunk/hid/mousedrv.inc @@ -482,9 +482,12 @@ align 4 proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScroll:dword, HScroll:dword mov eax, [BtnState] + and eax, 0x3FFFFFFF ; Top 2 bits are used to flag absolute movements mov [BTN_DOWN], eax mov eax, [XMoving] + test [BtnState], 0x80000000 + jnz @@M1 call mouse_acceleration add ax, [MOUSE_X];[XCoordinate] cmp ax, 0 @@ -503,6 +506,8 @@ align 4 mov [MOUSE_X], ax;[XCoordinate] mov eax, [YMoving] + test [BtnState], 0x40000000 + jnz @@M3 neg eax call mouse_acceleration