forked from KolibriOS/kolibrios
Absolute mouse coordinates are now calculated inside kernel instead of driver(s).
git-svn-id: svn://kolibrios.org@4592 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
6ba242ab84
commit
dc04bfc89f
@ -32,13 +32,6 @@ ends
|
|||||||
; in: ebx -> device_data from USB layer, edi -> collection
|
; in: ebx -> device_data from USB layer, edi -> collection
|
||||||
; out: eax = device-specific data or NULL on error
|
; out: eax = device-specific data or NULL on error
|
||||||
proc mouse_driver_add_device
|
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.
|
; Just allocate memory; no initialization needed.
|
||||||
movi eax, sizeof.mouse_device_data
|
movi eax, sizeof.mouse_device_data
|
||||||
call Kmalloc
|
call Kmalloc
|
||||||
@ -146,24 +139,12 @@ end if
|
|||||||
mov [edi+mouse_device_data.hwheel], edx
|
mov [edi+mouse_device_data.hwheel], edx
|
||||||
ret
|
ret
|
||||||
.absolute_x:
|
.absolute_x:
|
||||||
push ebx
|
mov [edi+mouse_device_data.dx], edx
|
||||||
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
|
or [edi+mouse_device_data.buttons], 0x80000000
|
||||||
pop ebx
|
|
||||||
ret
|
ret
|
||||||
.absolute_y:
|
.absolute_y:
|
||||||
push ebx
|
mov [edi+mouse_device_data.dy], edx
|
||||||
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
|
or [edi+mouse_device_data.buttons], 0x40000000
|
||||||
pop ebx
|
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
@ -534,9 +534,6 @@ disconnectmsg db 'K : USB HID device disconnected',13,10,0
|
|||||||
invalid_report_msg db 'K : report descriptor is invalid',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
|
delimiter_note db 'K : note: alternate usage ignored',13,10,0
|
||||||
|
|
||||||
screen_x dd ?
|
|
||||||
screen_y dd ?
|
|
||||||
|
|
||||||
; Exported variable: kernel API version.
|
; Exported variable: kernel API version.
|
||||||
align 4
|
align 4
|
||||||
version dd 50005h
|
version dd 50005h
|
||||||
|
@ -479,54 +479,53 @@ nodmp:
|
|||||||
ret
|
ret
|
||||||
;-----------------------------------------------------------------------------
|
;-----------------------------------------------------------------------------
|
||||||
align 4
|
align 4
|
||||||
proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScroll:dword, HScroll:dword
|
proc set_mouse_data stdcall uses edx, BtnState:dword, XMoving:dword, YMoving:dword, VScroll:dword, HScroll:dword
|
||||||
|
|
||||||
mov eax, [BtnState]
|
mov eax, [BtnState]
|
||||||
and eax, 0x3FFFFFFF ; Top 2 bits are used to flag absolute movements
|
and eax, 0x3FFFFFFF ; Top 2 bits are used to flag absolute movements
|
||||||
mov [BTN_DOWN], eax
|
mov [BTN_DOWN], eax
|
||||||
|
;--------------------------------------
|
||||||
mov eax, [XMoving]
|
mov eax, [XMoving]
|
||||||
test [BtnState], 0x80000000
|
test [BtnState], 0x80000000
|
||||||
jnz @@M1
|
jnz .absolute_x
|
||||||
call mouse_acceleration
|
call mouse_acceleration
|
||||||
add ax, [MOUSE_X];[XCoordinate]
|
add ax, [MOUSE_X]
|
||||||
cmp ax, 0
|
cmp ax, 0
|
||||||
jge @@M1
|
jge .check_x
|
||||||
mov eax, 0
|
mov eax, 0
|
||||||
jmp @@M2
|
jmp .set_x
|
||||||
|
.absolute_x:
|
||||||
|
mov edx, [_display.width]
|
||||||
|
mul edx
|
||||||
|
shr eax, 15
|
||||||
|
.check_x:
|
||||||
|
cmp ax, word[Screen_Max_X]
|
||||||
|
jl .set_x
|
||||||
|
mov ax, word[Screen_Max_X]
|
||||||
|
.set_x:
|
||||||
|
mov [MOUSE_X], ax
|
||||||
;--------------------------------------
|
;--------------------------------------
|
||||||
align 4
|
|
||||||
@@M1:
|
|
||||||
cmp ax, word [Screen_Max_X];ScreenLength
|
|
||||||
jl @@M2
|
|
||||||
mov ax, word [Screen_Max_X];ScreenLength-1
|
|
||||||
;--------------------------------------
|
|
||||||
align 4
|
|
||||||
@@M2:
|
|
||||||
mov [MOUSE_X], ax;[XCoordinate]
|
|
||||||
|
|
||||||
mov eax, [YMoving]
|
mov eax, [YMoving]
|
||||||
test [BtnState], 0x40000000
|
test [BtnState], 0x40000000
|
||||||
jnz @@M3
|
jnz .absolute_y
|
||||||
neg eax
|
neg eax
|
||||||
call mouse_acceleration
|
call mouse_acceleration
|
||||||
|
add ax, [MOUSE_Y]
|
||||||
add ax, [MOUSE_Y];[YCoordinate]
|
|
||||||
cmp ax, 0
|
cmp ax, 0
|
||||||
jge @@M3
|
jge .check_y
|
||||||
mov ax, 0
|
mov ax, 0
|
||||||
jmp @@M4
|
jmp .set_y
|
||||||
|
.absolute_y:
|
||||||
|
mov edx, [_display.height]
|
||||||
|
mul edx
|
||||||
|
shr eax, 15
|
||||||
|
.check_y:
|
||||||
|
cmp ax, word[Screen_Max_Y]
|
||||||
|
jl .set_y
|
||||||
|
mov ax, word[Screen_Max_Y]
|
||||||
|
.set_y:
|
||||||
|
mov [MOUSE_Y], ax
|
||||||
;--------------------------------------
|
;--------------------------------------
|
||||||
align 4
|
|
||||||
@@M3:
|
|
||||||
cmp ax, word [Screen_Max_Y];ScreenHeigth
|
|
||||||
jl @@M4
|
|
||||||
mov ax, word [Screen_Max_Y];ScreenHeigth-1
|
|
||||||
;--------------------------------------
|
|
||||||
align 4
|
|
||||||
@@M4:
|
|
||||||
mov [MOUSE_Y], ax;[YCoordinate]
|
|
||||||
|
|
||||||
mov eax, [VScroll]
|
mov eax, [VScroll]
|
||||||
add [MOUSE_SCROLL_V], ax
|
add [MOUSE_SCROLL_V], ax
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user