fix mouse redraw in 'checkbox'

git-svn-id: svn://kolibrios.org@8568 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2021-02-02 22:32:19 +00:00
parent e594f133e1
commit aba76d1871
3 changed files with 59 additions and 70 deletions

View File

@ -1,4 +1,4 @@
;Последная модификация 08.12.2020 ;Последная модификация 02.02.2021
;файл создан 13.02.2009 <Lrz> На код применена GPL2 лицензия ;файл создан 13.02.2009 <Lrz> На код применена GPL2 лицензия
;Checkbox ;Checkbox
@ -107,9 +107,9 @@ align 16
check_box_mouse: ;обработка мыши check_box_mouse: ;обработка мыши
pushad pushad
mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке
mcall SF_MOUSE_GET,SSF_BUTTON ;проверяем состояние клавиш мышки. Было ли событие нажатая клавиша на мышке. mcall SF_MOUSE_GET,SSF_BUTTON_EXT ;проверяем состояние клавиш мышки. Было ли событие нажатая клавиша на мышке.
test eax,eax ;проверка если у нас в eax=0, выйдем and eax, 3 shl 8 ;проверяем левую и правую кнопки
jz .check_box_mouse_end ;обработка закончилась jz .end ;обработка закончилась
; Да событие: нажатие клавиши мышки произошло. ; Да событие: нажатие клавиши мышки произошло.
@@: @@:
mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ;получить координаты курсора относительно окна mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ;получить координаты курсора относительно окна
@ -119,11 +119,11 @@ pushad
mov ebx,ecx mov ebx,ecx
shr ebx,16 ;bx = координата по y shr ebx,16 ;bx = координата по y
cmp ax,bx cmp ax,bx
jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по y чем координата по Y у бокса jb .end ;указатель мышки меньше начальной координаты по y чем координата по Y у бокса
;сравнение нижней точки по Y ;сравнение нижней точки по Y
add cx,bx ;сложим длинну по y и координату верхней точки по y поличим координату нижней точки по Y add cx,bx ;сложим длинну по y и координату верхней точки по y поличим координату нижней точки по Y
cmp ax,cx cmp ax,cx
ja .check_box_mouse_end ;указатель мышки больше конечной координаты по y чем координата по Y у бокса ja .end ;указатель мышки больше конечной координаты по y чем координата по Y у бокса
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
shr eax,16 ;сместим координату по Х в нижную часть регистра т.е. в ax shr eax,16 ;сместим координату по Х в нижную часть регистра т.е. в ax
;сравнение по начальной точке Х ;сравнение по начальной точке Х
@ -131,20 +131,20 @@ pushad
mov ebx,ecx mov ebx,ecx
shr ebx,16 ;bx = координата по X shr ebx,16 ;bx = координата по X
cmp ax,bx cmp ax,bx
jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по X чем координата по X у бокса jb .end ;указатель мышки меньше начальной координаты по X чем координата по X у бокса
;сравнение конечной точки по X ;сравнение конечной точки по X
add bx,cx ;сложим длинну по x и координату точки по х получим координату конечной точки по Х add bx,cx ;сложим длинну по x и координату точки по х получим координату конечной точки по Х
add bx,word ch_sz_str ;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации add bx,word ch_sz_str ;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации
cmp ax,bx cmp ax,bx
ja .check_box_mouse_end ;указатель мышки больше конечной координаты по х чем координата по Х у бокса ja .end ;указатель мышки больше конечной координаты по х чем координата по Х у бокса
;если все проверки были успешно пройдены мы обязаны поменять состояние бокса ;если все проверки были успешно пройдены мы обязаны поменять состояние бокса
btc dword ch_flags,1 ;перенос 2-го бита в cf и инверсия его btc dword ch_flags,1 ;перенос 2-го бита в cf и инверсия его
jnc .enable_box ;если CF=1 то отобразим включенный бокс и выйдем jnc .enable_box ;если CF=1 то отобразим включенный бокс и выйдем
push dword .check_box_mouse_end ;фокус -покус, вернемся после вызова check_box_clear_ch на метку check_box_mouse_end push dword .end ;фокус-покус, вернемся после вызова check_box_clear_ch на метку check_box_mouse.end
jmp check_box_clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. jmp check_box_clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона.
.enable_box: .enable_box:
call check_box_draw_ch ;отобразить включенный чек бокс call check_box_draw_ch ;отобразить включенный чек бокс
.check_box_mouse_end: .end:
popad ;восстановить регистры из стека popad ;восстановить регистры из стека
ret 4 ;выйти и восстановим стек ret 4 ;выйти и восстановим стек

View File

@ -26,24 +26,14 @@ ini_data:
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
load_lib_start: load_lib_start:
lib1 l_libs img.name, \ lib1 l_libs img.name, \
sys_path, \
file_name, \ file_name, \
img.dir, \ img.dir, \
error, \ img
error, \
img, \
error, \
error
lib2 l_libs ini.name, \ lib2 l_libs ini.name, \
sys_path, \
file_name, \ file_name, \
ini.dir, \ ini.dir, \
error, \ ini
error, \
ini, \
error, \
error
load_lib_end: load_lib_end:
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
img: img:

View File

@ -7,13 +7,14 @@
include "../../../macros.inc" include "../../../macros.inc"
include "../../../proc32.inc" include "../../../proc32.inc"
include "../../../dll.inc" include "../../../dll.inc"
include "../../../develop/libraries/box_lib/load_lib.mac" include "../../../KOSfuncs.inc"
include "../../../load_lib.mac"
;include "../../../debug.inc" ;include "../../../debug.inc"
include "DATA.INC" include "DATA.INC"
include "NAME.INC" include "NAME.INC"
@use_library_mem \ @use_library \
mem.Alloc, \ mem.Alloc, \
mem.Free, \ mem.Free, \
mem.ReAlloc, \ mem.ReAlloc, \
@ -21,10 +22,10 @@
;================================================================================ ;================================================================================
main: main:
; ==== Init ==== ; ==== Init ====
mcall 18, 7 mcall SF_SYSTEM, SSF_GET_ACTIVE_WINDOW
mov [win.psid], eax mov [win.psid], eax
mcall 40, EVM_REDRAW+EVM_BUTTON+EVM_MOUSE ;+EVM_DEKSTOP to update colors on skin change mcall SF_SET_EVENTS_MASK, EVM_REDRAW+EVM_BUTTON+EVM_MOUSE ;+EVM_DEKSTOP to update colors on skin change
; ==== Load libs ==== ; ==== Load libs ====
load_libraries load_lib_start, load_lib_end load_libraries load_lib_start, load_lib_end
@ -40,17 +41,17 @@ main:
invoke ini.sections, ini_data.file_name, sections_callback invoke ini.sections, ini_data.file_name, sections_callback
; ==== Load colors ==== ; ==== Load colors ====
mcall 48, 3, color mcall SF_STYLE_SETTINGS, SSF_GET_COLORS, color
or dword[color.bg], 0x10000000 or dword[color.bg], 0x10000000
or dword[color.frame], 0x10000000 or dword[color.frame], 0x10000000
or dword[color.text], 0x80000000 or dword[color.text], 0x80000000
; ==== Config LibIMG ==== ; ==== Config LibIMG ====
mov dword[fi.p00], 5 mov dword[fi.p00], SSF_GET_INFO
mov dword[fi.p16], buf_128 mov dword[fi.p16], buf_128
mov dword[fi.p21], img_data.file_name mov dword[fi.p21], img_data.file_name
mcall 70, fi mcall SF_FILE, fi
mov edx, [buf_128 + 32] mov edx, [buf_128 + 32]
imul edx, 10 imul edx, 10
@ -58,12 +59,12 @@ main:
stdcall mem.Alloc, edx stdcall mem.Alloc, edx
mov [img_data.rgb_object], eax mov [img_data.rgb_object], eax
mov dword[fi.p00], 0 mov dword[fi.p00], SSF_READ_FILE
mov dword[fi.p12], edx mov dword[fi.p12], edx
m2m dword[fi.p16], dword[img_data.rgb_object] m2m dword[fi.p16], dword[img_data.rgb_object]
mov dword[fi.p21], img_data.file_name mov dword[fi.p21], img_data.file_name
mcall 70, fi mcall SF_FILE, fi
cmp ebx, 0xFFFFFFFF cmp ebx, 0xFFFFFFFF
je @f je @f
@ -153,7 +154,7 @@ main:
dec eax dec eax
jmp .set_hw jmp .set_hw
@@: @@:
mcall 14 mcall SF_GET_SCREEN_SIZE
shr eax, 16 shr eax, 16
.set_hw: .set_hw:
mov [win.width_opn], eax mov [win.width_opn], eax
@ -163,7 +164,7 @@ main:
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
.HORZ_X: .HORZ_X:
mcall 14 mcall SF_GET_SCREEN_SIZE
shr eax, 17 shr eax, 17
mov ecx, [win.width_opn] mov ecx, [win.width_opn]
shr ecx, 1 shr ecx, 1
@ -182,7 +183,7 @@ main:
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
.HORZ_Y_BOTTOM: .HORZ_Y_BOTTOM:
mcall 14 mcall SF_GET_SCREEN_SIZE
and eax, 0xFFFF and eax, 0xFFFF
dec eax dec eax
mov [win.y_hdn], eax mov [win.y_hdn], eax
@ -212,7 +213,7 @@ main:
ret ret
.VERT_X_RIGHT: .VERT_X_RIGHT:
mcall 14 mcall SF_GET_SCREEN_SIZE
and eax, 0xFFFF0000 and eax, 0xFFFF0000
shr eax, 16 shr eax, 16
mov [win.x_hdn], eax mov [win.x_hdn], eax
@ -231,7 +232,7 @@ main:
dec eax dec eax
jmp .set_vh jmp .set_vh
@@: @@:
mcall 14 mcall SF_GET_SCREEN_SIZE
and eax, 0xFFFF and eax, 0xFFFF
.set_vh: .set_vh:
mov [win.height_opn], eax mov [win.height_opn], eax
@ -241,7 +242,7 @@ main:
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
.VERT_Y: .VERT_Y:
mcall 14 mcall SF_GET_SCREEN_SIZE
and eax, 0xFFFF and eax, 0xFFFF
shr eax, 1 shr eax, 1
@ -288,9 +289,9 @@ main:
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
; ==== START ==== ; ==== START ====
mcall 9, win.procinfo, -1 mcall SF_THREAD_INFO, win.procinfo, -1
mov ecx, [win.procinfo + 30] mov ecx, [win.procinfo + 30]
mcall 18, 21 mcall SF_SYSTEM, SSF_GET_THREAD_SLOT
and eax, 0xFFFF and eax, 0xFFFF
mov [win.sid], eax mov [win.sid], eax
@ -298,11 +299,12 @@ main:
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
exit: exit:
stdcall mem.Free, [img_data.rgb_object] stdcall mem.Free, [img_data.rgb_object]
mcall 18, 2, [nwin.sid] mcall SF_SYSTEM, SSF_TERMINATE_THREAD, [nwin.sid]
mcall -1 mcall SF_TERMINATE_PROCESS
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
align 4
main_loop: main_loop:
mcall 10 mcall SF_WAIT_EVENT
cmp eax, EV_REDRAW cmp eax, EV_REDRAW
je event_redraw je event_redraw
@ -320,19 +322,19 @@ event_redraw:
jmp main_loop jmp main_loop
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
DRAW_WINDOW: DRAW_WINDOW:
mcall 12, 1 mcall SF_REDRAW, SSF_BEGIN_DRAW
mov esi, [color.bg] mov esi, [color.bg]
or esi, 0x01000000 or esi, 0x01000000
mcall 0, <[win.x], [win.width]>, <[win.y], [win.height]>, [color.bg], , [color.frame] mcall SF_CREATE_WINDOW, <[win.x], [win.width]>, <[win.y], [win.height]>, [color.bg], , [color.frame]
mov edi, 0 xor edi, edi
@@: @@:
cmp edi, [dock_items.count] cmp edi, [dock_items.count]
je @f je @f
push edi push edi
mov eax, 8 mov eax, SF_DEFINE_BUTTON
mov edx, 0x60000002 mov edx, 0x60000002
mov esi, [color.bg] mov esi, [color.bg]
imul edi, BUTTON_SIZE imul edi, BUTTON_SIZE
@ -356,12 +358,11 @@ DRAW_WINDOW:
push ebx push ebx
push ecx push ecx
mov eax, 13 mov eax, SF_DRAW_RECT
mov ebx, edi mov ebx, edi
imul ebx, BUTTON_SIZE imul ebx, BUTTON_SIZE
add ebx, BUTTON_SIZE add ebx, BUTTON_SIZE
add ebx, 12 add ebx, 12-1
dec ebx
shl ebx, 16 shl ebx, 16
add ebx, 2 add ebx, 2
@ -397,18 +398,18 @@ DRAW_WINDOW:
imul ebx, ICON_SIZE_BGR imul ebx, ICON_SIZE_BGR
add ebx, [img_data.rgb_object] add ebx, [img_data.rgb_object]
mcall 7, , <32, 32> mcall SF_PUT_IMAGE, , <32, 32>
inc edi inc edi
jmp @b jmp @b
@@: @@:
mcall 12, 2 mcall SF_REDRAW, SSF_END_DRAW
ret ret
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
event_button: event_button:
mcall 17 mcall SF_GET_BUTTON
;; it must not be possible to close dock ;; it must not be possible to close dock
;cmp ah, 1 ;cmp ah, 1
@ -426,7 +427,7 @@ event_button:
mov edi, [win.button_index] mov edi, [win.button_index]
imul edi, 256 imul edi, 256
mov dword[fi.p00], 7 mov dword[fi.p00], SSF_START_APP
mov esi, edi mov esi, edi
add esi, dock_items.path add esi, dock_items.path
@ -436,10 +437,10 @@ event_button:
add esi, dock_items.param add esi, dock_items.param
mov dword[fi.p08], esi mov dword[fi.p08], esi
mcall 70, fi mcall SF_FILE, fi
mov ecx, eax mov ecx, eax
mcall 18, 21 mcall SF_SYSTEM, SSF_GET_THREAD_SLOT
and eax, 0xFFFF and eax, 0xFFFF
mov [win.psid], eax mov [win.psid], eax
@ -450,7 +451,7 @@ event_button:
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
event_mouse: event_mouse:
; ==== IS MOUSE INNER ==== ; ==== IS MOUSE INNER ====
mcall 37, 1 mcall SF_MOUSE_GET, SSF_WINDOW_POSITION
mov edi, eax mov edi, eax
mov esi, eax mov esi, eax
shr edi, 16 shr edi, 16
@ -513,14 +514,14 @@ event_mouse:
add eax, [win.x] add eax, [win.x]
mov [nwin.x], eax mov [nwin.x], eax
mov byte[nwin.change_shape], 1 mov byte[nwin.change_shape], 1
mcall 13, <0, [win.width]>, <[win.height], 1>, [color.frame] mcall SF_DRAW_RECT, <0, [win.width]>, <[win.height], 1>, [color.frame]
jmp .vert_end jmp .vert_end
.vert_name: .vert_name:
add eax, [win.y] add eax, [win.y]
add eax, 14 add eax, 14
mov [nwin.y], eax mov [nwin.y], eax
mov byte[nwin.change_shape], 1 mov byte[nwin.change_shape], 1
mcall 13, <[win.width], 1>, <0, [win.height]>, [color.frame] mcall SF_DRAW_RECT, <[win.width], 1>, <0, [win.height]>, [color.frame]
.vert_end: .vert_end:
; ==== OPEN/CLOSE WINDOW ==== ; ==== OPEN/CLOSE WINDOW ====
@ -529,14 +530,12 @@ event_mouse:
mov edx, esp mov edx, esp
add edx, 512 add edx, 512
mcall 51, 1, n_main mcall SF_CREATE_THREAD, 1, n_main
mov eax, 18 mcall SF_SYSTEM, SSF_GET_ACTIVE_WINDOW
mcall , 7
mov [win.psid], eax mov [win.psid], eax
mcall 18, 3, [win.sid] mcall SF_SYSTEM, SSF_FOCUS_WINDOW, [win.sid]
mov byte[win.state], 1 mov byte[win.state], 1
@ -555,7 +554,7 @@ event_mouse:
cmp byte[dock_items.ashow],1 cmp byte[dock_items.ashow],1
je .change_nothing je .change_nothing
mcall 67, [win.x], [win.y], [win.width], [win.height] mcall SF_CHANGE_WINDOW, [win.x], [win.y], [win.width], [win.height]
.change_nothing: .change_nothing:
call DRAW_WINDOW call DRAW_WINDOW
@ -569,7 +568,7 @@ wnd_hide:
mov byte[nwin.close], 1 mov byte[nwin.close], 1
mcall 18, 3, [win.psid] mcall SF_SYSTEM, SSF_FOCUS_WINDOW, [win.psid]
mov byte[win.state], 0 mov byte[win.state], 0
mov byte[win.button_index], -1 mov byte[win.button_index], -1
@ -589,7 +588,7 @@ wnd_hide:
mov eax, [win.y_hdn] mov eax, [win.y_hdn]
mov [win.y], eax mov [win.y], eax
mcall 67, [win.x], [win.y], [win.width], [win.height] mcall SF_CHANGE_WINDOW, [win.x], [win.y], [win.width], [win.height]
.do_no_hide: .do_no_hide:
call DRAW_WINDOW call DRAW_WINDOW
@ -609,7 +608,7 @@ DRAW_SELECTION:
sub ecx, 0x000C0000 sub ecx, 0x000C0000
@@: @@:
mcall 13, , , [color.bg] mcall SF_DRAW_RECT, , , [color.bg]
mov edx, ebx mov edx, ebx
shr ecx, 16 shr ecx, 16
@ -623,7 +622,7 @@ DRAW_SELECTION:
imul ebx, ICON_SIZE_BGR imul ebx, ICON_SIZE_BGR
add ebx, [img_data.rgb_object] add ebx, [img_data.rgb_object]
mcall 7, , <32, 32> mcall SF_PUT_IMAGE, , <32, 32>
mov ebx, [win.button_index] mov ebx, [win.button_index]
imul ebx, BUTTON_SIZE imul ebx, BUTTON_SIZE
@ -638,7 +637,7 @@ DRAW_SELECTION:
sub ecx, 0x000C0000 sub ecx, 0x000C0000
@@: @@:
mcall 13, , , [color.bt] mcall SF_DRAW_RECT, , , [color.bt]
mov edx, ebx mov edx, ebx
shr ecx, 16 shr ecx, 16
@ -682,7 +681,7 @@ DRAW_SELECTION:
cmp edi, 1024 * 3 cmp edi, 1024 * 3
jne @b jne @b
mcall 7, sel_img, <32, 32> mcall SF_PUT_IMAGE, sel_img, <32, 32>
ret ret
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------