kolibrios-fun/kernel/branches/kolibri_pe/hid/mousedrv.inc

337 lines
6.8 KiB
PHP
Raw Normal View History

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$
; check mouse
;
;
; FB00 -> FB0F mouse memory 00 chunk count - FB0A-B x - FB0C-D y
; FB10 -> FB17 mouse color mem
; FB21 x move
; FB22 y move
; FB30 color temp
; FB28 high bits temp
uglobal
mousecount dd 0x0
mousedata dd 0x0
endg
iglobal
mouse_delay dd 10
mouse_speed_factor: dd 3
mouse_timer_ticks dd 0
endg
align 4
draw_mouse_under:
; return old picture
cmp [set_hw_cursor], 0
jz .exit
pushad
mov eax, [x_under]
mov ebx, [y_under]
stdcall [hw_restore], eax, ebx
popad
.exit:
ret
save_draw_mouse:
cmp [set_hw_cursor], 0
je .exit
pushad
mov [x_under], eax
mov [y_under], ebx
movzx eax,word [MOUSE_Y]
movzx ebx,word [MOUSE_X]
push eax
push ebx
mov ecx, [Screen_Max_X]
inc ecx
mul ecx
add eax, [_display_data]
movzx edx, byte [ebx+eax]
shl edx, 8
mov esi, [edx+SLOT_BASE+APPDATA.cursor]
cmp esi, [current_cursor]
je .draw
push esi
call [select_hw_cursor]
mov [current_cursor], esi
.draw:
stdcall [set_hw_cursor], esi
popad
.exit:
ret
__sys_disable_mouse:
cmp [MOUSE_VISIBLE], 0
je @f
ret
@@:
pushad
cmp [CURRENT_TASK],dword 1
je disable_m
mov edx,[CURRENT_TASK]
shl edx,5
add edx,window_data
movzx eax, word [MOUSE_X]
movzx ebx, word [MOUSE_Y]
mov ecx,[Screen_Max_X]
inc ecx
imul ecx,ebx
add ecx,eax
add ecx, [_display_data]
mov eax, [CURRENT_TASK]
movzx ebx, byte [ecx]
cmp eax,ebx
je yes_mouse_disable
movzx ebx, byte [ecx+32]
cmp eax,ebx
je yes_mouse_disable
mov ebx,[Screen_Max_X]
inc ebx
imul ebx,10
add ecx,ebx
movzx ebx, byte [ecx]
cmp eax,ebx
je yes_mouse_disable
movzx ebx, byte [ecx+32]
cmp eax,ebx
je yes_mouse_disable
jmp no_mouse_disable
yes_mouse_disable:
mov edx,[CURRENT_TASK]
shl edx,5
add edx,window_data
movzx eax, word [MOUSE_X]
movzx ebx, word [MOUSE_Y]
mov ecx,[edx+0] ; mouse inside the area ?
add eax,10
cmp eax,ecx
jb no_mouse_disable
sub eax,10
add ecx,[edx+8]
cmp eax,ecx
jg no_mouse_disable
mov ecx,[edx+4]
add ebx,14
cmp ebx,ecx
jb no_mouse_disable
sub ebx,14
add ecx,[edx+12]
cmp ebx,ecx
jg no_mouse_disable
disable_m:
cmp [MOUSE_VISIBLE], 0
jne no_mouse_disable
pushf
cli
call draw_mouse_under
popf
mov [MOUSE_VISIBLE], 1
no_mouse_disable:
popad
ret
__sys_draw_pointer:
cmp [mouse_pause],0
je @f
ret
@@:
push eax
mov eax,[timer_ticks]
sub eax,[MouseTickCounter]
cmp eax,1
ja @f
pop eax
ret
@@:
mov eax,[timer_ticks]
mov [MouseTickCounter],eax
pop eax
pushad
cmp [MOUSE_VISIBLE], 0 ; mouse visible ?
je chms00
mov [MOUSE_VISIBLE], 0
movzx ebx,word [MOUSE_Y]
movzx eax,word [MOUSE_X]
pushfd
cli
call save_draw_mouse
popfd
nodmu2:
popad
ret
chms00:
mov ecx, [x_under]
mov edx, [y_under]
movzx ebx,word [MOUSE_Y]
movzx eax,word [MOUSE_X]
cmp eax,ecx
jne redrawmouse
cmp ebx,edx
jne redrawmouse
jmp nodmp
redrawmouse:
pushfd
cli
call draw_mouse_under
call save_draw_mouse
popfd
nodmp:
popad
ret
proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScroll:dword, HScroll:dword
mov eax,[BtnState]
mov [btn_down],eax
mov eax,[XMoving]
call mouse_acceleration
add ax,[MOUSE_X] ;[XCoordinate]
cmp ax,0
jge @@M1
mov eax,0
jmp @@M2
@@M1:
cmp ax, word [Screen_Max_X] ;ScreenLength
jl @@M2
mov ax, word [Screen_Max_X] ;ScreenLength-1
@@M2:
mov [MOUSE_X],ax ;[XCoordinate]
mov eax,[YMoving]
neg eax
call mouse_acceleration
add ax,[MOUSE_Y] ;[YCoordinate]
cmp ax,0
jge @@M3
mov ax,0
jmp @@M4
@@M3:
cmp ax, word [Screen_Max_Y] ;ScreenHeigth
jl @@M4
mov ax, word [Screen_Max_Y] ;ScreenHeigth-1
@@M4:
mov [MOUSE_Y],ax ;[YCoordinate]
mov eax,[VScroll]
add [mouse_scroll_v], eax
mov eax,[HScroll]
add [mouse_scroll_h], eax
mov [mouse_active],1
mov eax,[timer_ticks]
mov [mouse_timer_ticks],eax
ret
endp
mouse_acceleration:
push eax
mov eax,[timer_ticks]
sub eax,[mouse_timer_ticks]
cmp eax,[mouse_delay]
pop eax
ja @f
;push edx
imul eax,[mouse_speed_factor]
;pop edx
@@:
ret
;[ecx] x
;[ecx+4] y
;[ecx+8] w
;[ecx+12] h
align 4
lock_cursor:
pushfd
cli
xor eax, eax
mov edx, [ecx]
mov ebx, [ecx+4]
cmp edx, [cur.right]
jg .done
cmp ebx, [cur.bottom]
jg .done
add edx, [ecx+8]
add ebx, [ecx+12]
cmp edx, [cur.left]
jle .done
cmp ebx, [cur.top]
jle .done
mov ecx, [CURRENT_TASK]
mov ebx, [cur.left]
mov eax, [cur.top]
add ebx, [_display_data]
mul [_screen_width]
add ebx, eax
cmp cl, [ebx]
je .disable
cmp cl, [ebx+31]
je .disable
mov eax, [_screen_width]
shl eax, 5
sub eax, [_screen_width]
cmp cl, [ebx+eax]
je .disable
cmp cl, [ebx+eax+31]
jne .done
.disable:
call draw_mouse_under
mov eax, 1
.done:
inc eax
mov [cur.lock], eax
popfd
ret
align 4
unlock_cursor:
pushfd
cli
cmp [cur.lock], 2
jne .done
call save_draw_mouse
.done:
mov [cur.lock], 1
popfd
ret