1,6 → 1,6 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;; |
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;; |
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
43,10 → 43,7 |
jae .exit |
|
push eax |
inc [mouse_pause] |
call [_display.disable_mouse] |
call window._.sys_set_window |
call [_display.disable_mouse] |
pop eax |
|
or al, al |
55,17 → 52,19 |
; type I - original style |
call drawwindow_I |
jmp window._.draw_window_caption.2 |
|
;-------------------------------------- |
align 4 |
@@: |
dec al |
jnz @f |
|
; type II - only reserve area, no draw |
call sys_window_mouse |
dec [mouse_pause] |
call [draw_pointer] |
; call sys_window_mouse |
; call [draw_pointer] |
call __sys_draw_pointer |
jmp .exit |
|
;-------------------------------------- |
align 4 |
@@: |
dec al |
jnz @f |
75,6 → 74,8 |
jmp window._.draw_window_caption.2 |
|
; type IV & V - skinned window (resizable & not) |
;-------------------------------------- |
align 4 |
@@: |
mov eax, [TASK_COUNT] |
movzx eax, word[WIN_POS + eax * 2] |
84,10 → 85,11 |
push eax |
call drawwindow_IV |
jmp window._.draw_window_caption.2 |
|
;-------------------------------------- |
align 4 |
.exit: |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
syscall_display_settings: ;///// system function 48 /////////////////////////// |
136,10 → 138,11 |
cmp ebx, .sizeof.ftable / 4 |
ja @f |
jmp [.ftable + ebx * 4] |
;-------------------------------------- |
align 4 |
@@: |
ret |
|
|
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.00: |
xor eax, eax |
149,10 → 152,11 |
mov [windowtypechanged], eax |
|
jmp syscall_display_settings._.redraw_whole_screen |
|
;-------------------------------------- |
align 4 |
.exit: |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.01: |
and ecx, 1 |
160,10 → 164,11 |
je .exit |
mov [buttontype], ecx |
mov [windowtypechanged], ebx |
|
;-------------------------------------- |
align 4 |
.exit: |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.02: |
dec ebx |
174,7 → 179,7 |
rep movsb |
mov [windowtypechanged], ebx |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.03: |
mov edi, ecx |
183,13 → 188,13 |
mov ecx, edx |
rep movsb |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.04: |
mov eax, [_skinh] |
mov [esp + 32], eax |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.05: |
mov eax, [screen_workarea.left - 2] |
199,7 → 204,7 |
mov ax, word[screen_workarea.bottom] |
mov [esp + 20], eax |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.06: |
xor esi, esi |
214,14 → 219,19 |
or eax, eax |
jge @f |
xor eax, eax |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.left], eax |
cmp ebx, edi |
jle @f |
mov ebx, edi |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.right], ebx |
|
;-------------------------------------- |
align 4 |
.check_horizontal: |
mov edi, [Screen_Max_Y] |
mov eax, edx |
233,14 → 243,19 |
or eax, eax |
jge @f |
xor eax, eax |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.top], eax |
cmp ebx, edi |
jle @f |
mov ebx, edi |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.bottom], ebx |
|
;-------------------------------------- |
align 4 |
.check_if_redraw_needed: |
or esi, esi |
jz .exit |
247,10 → 262,11 |
|
call repos_windows |
jmp syscall_display_settings._.calculate_whole_screen |
|
;-------------------------------------- |
align 4 |
.exit: |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.07: |
mov eax, [_skinmargins + 0] |
258,7 → 274,7 |
mov eax, [_skinmargins + 4] |
mov [esp + 20], eax |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.08: |
mov ebx, ecx |
269,10 → 285,12 |
|
call syscall_display_settings._.calculate_whole_screen |
jmp syscall_display_settings._.redraw_whole_screen |
|
;-------------------------------------- |
align 4 |
.exit: |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings._.calculate_whole_screen: |
xor eax, eax |
xor ebx, ebx |
279,7 → 297,8 |
mov ecx, [Screen_Max_X] |
mov edx, [Screen_Max_Y] |
jmp calculatescreen |
|
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings._.redraw_whole_screen: |
xor eax, eax |
mov [draw_limits.left], eax |
290,7 → 309,7 |
mov [draw_limits.bottom], eax |
mov eax, window_data |
jmp redrawscreen |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
syscall_set_window_shape: ;///// system function 50 /////////////////////////// |
308,15 → 327,17 |
test ebx, ebx |
jne .shape_scale |
mov [edi + APPDATA.wnd_shape], ecx |
|
;-------------------------------------- |
align 4 |
.shape_scale: |
dec ebx |
jnz .exit |
mov [edi + APPDATA.wnd_shape_scale], ecx |
|
;-------------------------------------- |
align 4 |
.exit: |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
syscall_move_window: ;///// system function 67 //////////////////////////////// |
336,19 → 357,26 |
cmp ebx, -1 |
jne @f |
mov ebx, [edi + WDATA.box.left] |
;-------------------------------------- |
align 4 |
@@: |
cmp ecx, -1 |
jne @f |
mov ecx, [edi + WDATA.box.top] |
;-------------------------------------- |
align 4 |
@@: |
cmp edx, -1 |
jne @f |
mov edx, [edi + WDATA.box.width] |
;-------------------------------------- |
align 4 |
@@: |
cmp esi, -1 |
jne @f |
mov esi, [edi + WDATA.box.height] |
|
;-------------------------------------- |
align 4 |
@@: |
push esi edx ecx ebx |
mov eax, esp |
363,10 → 391,11 |
|
; NOTE: do we really need this? to be reworked |
; call [draw_pointer] |
|
;-------------------------------------- |
align 4 |
.exit: |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
syscall_window_settings: ;///// system function 71 ///////////////////////////// |
395,12 → 424,13 |
; jnz .exit_fail |
|
; not implemented yet |
|
;-------------------------------------- |
align 4 |
.exit_fail: |
xor eax, eax |
inc eax ; eax = 1 (fail) |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
set_window_defaults: ;///////////////////////////////////////////////////////// |
411,6 → 441,8 |
push eax ecx |
xor eax, eax |
mov ecx, WIN_STACK |
;-------------------------------------- |
align 4 |
@@: |
inc eax |
add ecx, 2 |
422,7 → 454,7 |
jne @b |
pop ecx eax |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
calculatescreen: ;///////////////////////////////////////////////////////////// |
449,7 → 481,8 |
jbe .exit |
|
push edx ecx ebx eax |
|
;-------------------------------------- |
align 4 |
.next_window: |
movzx edi, word[WIN_POS + esi * 2] |
shl edi, 5 |
479,25 → 512,33 |
cmp eax, [esp + RECT.left] |
jae @f |
mov eax, [esp + RECT.left] |
;-------------------------------------- |
align 4 |
@@: |
cmp ebx, [esp + RECT.top] |
jae @f |
mov ebx, [esp + RECT.top] |
;-------------------------------------- |
align 4 |
@@: |
cmp ecx, [esp + RECT.right] |
jbe @f |
mov ecx, [esp + RECT.right] |
;-------------------------------------- |
align 4 |
@@: |
cmp edx, [esp + RECT.bottom] |
jbe @f |
mov edx, [esp + RECT.bottom] |
|
;-------------------------------------- |
align 4 |
@@: |
push esi |
movzx esi, word[WIN_POS + esi * 2] |
call window._.set_screen |
pop esi |
|
;-------------------------------------- |
align 4 |
.skip_window: |
inc esi |
dec ebp |
504,13 → 545,15 |
jnz .next_window |
|
pop eax ebx ecx edx |
|
;-------------------------------------- |
align 4 |
.exit: |
pop ebp |
inc [_display.mask_seqno] |
popfd |
pop esi |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
repos_windows: ;/////////////////////////////////////////////////////////////// |
522,7 → 565,8 |
call force_redraw_background |
dec ecx |
jle .exit |
|
;-------------------------------------- |
align 4 |
.next_window: |
mov [edi + WDATA.fl_redraw], 1 |
test [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED |
537,10 → 581,13 |
sub eax, ebx |
jle @f |
mov [edi + WDATA.box.width], ebx |
;-------------------------------------- |
align 4 |
@@: |
sub ebx, [edi + WDATA.box.width] |
mov [edi + WDATA.box.left], ebx |
|
;-------------------------------------- |
align 4 |
.fix_vertical: |
mov eax, [edi + WDATA.box.top] |
add eax, [edi + WDATA.box.height] |
551,11 → 598,23 |
sub eax, ebx |
jle @f |
mov [edi + WDATA.box.height], ebx |
;-------------------------------------- |
align 4 |
@@: |
sub ebx, [edi + WDATA.box.height] |
mov [edi + WDATA.box.top], ebx |
jmp .fix_client_box |
|
;-------------------------------------- |
align 4 |
.fix_client_box: |
call window._.set_window_clientbox |
add edi, sizeof.WDATA |
loop .next_window |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;-------------------------------------- |
align 4 |
.fix_maximized: |
mov eax, [screen_workarea.left] |
mov [edi + WDATA.box.left], eax |
569,20 → 628,12 |
sub eax, [screen_workarea.bottom] |
neg eax |
mov [edi + WDATA.box.height], eax |
|
.fix_client_box: |
call window._.set_window_clientbox |
|
add edi, sizeof.WDATA |
loop .next_window |
|
.exit: |
ret |
|
align 4 |
jmp .fix_client_box |
;------------------------------------------------------------------------------ |
sys_window_mouse: ;//////////////////////////////////////////////////////////// |
;align 4 |
;------------------------------------------------------------------------------ |
;sys_window_mouse: ;//////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
; NOTE: commented out since doesn't provide necessary functionality |
600,8 → 651,8 |
; |
; .exit: |
; pop eax |
ret |
|
; ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
draw_rectangle: ;////////////////////////////////////////////////////////////// |
609,28 → 660,38 |
;> eax = pack[16(left), 16(right)] |
;> ebx = pack[16(top), 16(bottom)] |
;> esi = color |
; ?? RR GG BB ; 0x01000000 negation |
; ; 0x02000000 used for draw_rectangle without top line |
; ; for example drawwindow_III and drawwindow_IV |
;------------------------------------------------------------------------------ |
push eax ebx ecx edi |
|
xor edi, edi |
|
;-------------------------------------- |
align 4 |
.flags_set: |
push ebx |
|
; set line color |
mov ecx, esi |
|
; draw top border |
rol ebx, 16 |
push ebx |
rol ebx, 16 |
pop bx |
call [draw_line] |
|
test ecx, 1 shl 25 |
jnz @f |
sub ecx, 1 shl 25 |
; call [draw_line] |
call __sys_draw_line |
;-------------------------------------- |
align 4 |
@@: |
; draw bottom border |
mov ebx, [esp - 2] |
pop bx |
call [draw_line] |
; call [draw_line] |
call __sys_draw_line |
|
pop ebx |
add ebx, 1 * 65536 - 1 |
640,22 → 701,25 |
push eax |
rol eax, 16 |
pop ax |
call [draw_line] |
; call [draw_line] |
call __sys_draw_line |
|
; draw right border |
mov eax, [esp - 2] |
pop ax |
call [draw_line] |
; call [draw_line] |
call __sys_draw_line |
|
pop edi ecx ebx eax |
ret |
|
;-------------------------------------- |
align 4 |
.forced: |
push eax ebx ecx edi |
xor edi, edi |
inc edi |
jmp .flags_set |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
drawwindow_I_caption: ;//////////////////////////////////////////////////////// |
674,11 → 738,14 |
cmp ebx, eax |
jbe @f |
mov ebx, eax |
;-------------------------------------- |
align 4 |
@@: |
push ebx |
|
xor edi, edi |
|
;-------------------------------------- |
align 4 |
.next_line: |
mov ebx, edx |
shl ebx, 16 |
694,9 → 761,12 |
jz @f |
sub ecx, 0x00040404 |
mov [esi + WDATA.cl_titlebar], ecx |
;-------------------------------------- |
align 4 |
@@: |
and ecx, 0x00ffffff |
call [draw_line] |
; call [draw_line] |
call __sys_draw_line |
inc edx |
cmp edx, [esp] |
jb .next_line |
704,7 → 774,7 |
add esp, 4 |
pop [esi + WDATA.cl_titlebar] |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
drawwindow_I: ;//////////////////////////////////////////////////////////////// |
749,12 → 819,14 |
mov ebx, 21 |
mov ecx, [esi + WDATA.box.width] |
mov edx, [esi + WDATA.box.height] |
call [drawbar] |
|
; call [drawbar] |
call vesa20_drawbar |
;-------------------------------------- |
align 4 |
.exit: |
popad |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
drawwindow_III_caption: ;///////////////////////////////////////////////////// |
774,11 → 846,14 |
cmp ebx, eax |
jb @f |
mov ebx, eax |
;-------------------------------------- |
align 4 |
@@: |
push ebx |
|
xor edi, edi |
|
;-------------------------------------- |
align 4 |
.next_line: |
mov ebx, edx |
shl ebx, 16 |
792,14 → 867,19 |
test ecx, 0x40000000 |
jz @f |
add ecx, 0x00040404 |
;-------------------------------------- |
align 4 |
@@: |
test ecx, 0x80000000 |
jz @f |
sub ecx, 0x00040404 |
;-------------------------------------- |
align 4 |
@@: |
mov [esi + WDATA.cl_titlebar], ecx |
and ecx, 0x00ffffff |
call [draw_line] |
; call [draw_line] |
call __sys_draw_line |
inc edx |
cmp edx, [esp] |
jb .next_line |
807,7 → 887,7 |
add esp, 4 |
pop [esi + WDATA.cl_titlebar] |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
drawwindow_III: ;////////////////////////////////////////////////////////////// |
833,7 → 913,8 |
push esi |
mov ecx, 3 |
mov esi, [edx + WDATA.cl_frames] |
|
;-------------------------------------- |
align 4 |
.next_frame: |
add eax, 1 * 65536 - 1 |
add ebx, 1 * 65536 - 1 |
872,12 → 953,14 |
mov edx, [esi + WDATA.box.height] |
sub ecx, 4 |
sub edx, 4 |
call [drawbar] |
|
; call [drawbar] |
call vesa20_drawbar |
;-------------------------------------- |
align 4 |
.exit: |
popad |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
waredraw: ;//////////////////////////////////////////////////////////////////// |
919,6 → 1002,7 |
mov edi, [TASK_COUNT] |
movzx esi, word[WIN_POS + edi * 2] |
call window._.set_screen |
inc [_display.mask_seqno] |
popad |
|
; tell application to redraw itself |
925,7 → 1009,8 |
mov [edi + WDATA.fl_redraw], 1 |
xor eax, eax |
jmp .exit |
|
;-------------------------------------- |
align 4 |
.do_not_draw: |
; no it's not, just activate the window |
call window._.window_activate |
932,13 → 1017,13 |
xor eax, eax |
mov byte[MOUSE_BACKGROUND], al |
mov byte[DONT_DRAW_MOUSE], al |
|
|
;-------------------------------------- |
align 4 |
.exit: |
mov byte[MOUSE_DOWN], 0 |
inc eax |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
minimize_window: ;///////////////////////////////////////////////////////////// |
978,12 → 1063,13 |
call redrawscreen |
|
pop esi edx ecx ebx eax |
|
;-------------------------------------- |
align 4 |
.exit: |
popfd |
pop edi |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
restore_minimized_window: ;//////////////////////////////////////////////////// |
1011,6 → 1097,8 |
cmp eax, [TASK_COUNT] |
jz @f |
mov ebp, calculatescreen |
;-------------------------------------- |
align 4 |
@@: |
mov eax, [edi + WDATA.box.left] |
mov ebx, [edi + WDATA.box.top] |
1019,14 → 1107,15 |
add ecx, eax |
add edx, ebx |
call ebp |
|
inc [_display.mask_seqno] |
mov byte[MOUSE_BACKGROUND], 0 |
|
;-------------------------------------- |
align 4 |
.exit: |
popfd |
popad |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
; TODO: remove this proc |
;------------------------------------------------------------------------------ |
1046,13 → 1135,15 |
jnz @f |
call minimize_window |
jmp .exit |
|
;-------------------------------------- |
align 4 |
@@: |
call restore_minimized_window |
|
;-------------------------------------- |
align 4 |
.exit: |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
sys_window_maximize_handler: ;///////////////////////////////////////////////// |
1089,7 → 1180,8 |
sub [esp + BOX.height], ecx |
mov eax, esp |
jmp .set_box |
|
;-------------------------------------- |
align 4 |
.restore_size: |
mov eax, esi |
shl eax, 8 |
1099,7 → 1191,8 |
[eax + BOX.top] \ |
[eax + BOX.left] |
mov eax, esp |
|
;-------------------------------------- |
align 4 |
.set_box: |
test bl, WSTATE_ROLLEDUP |
jz @f |
1108,14 → 1201,17 |
call window._.get_rolledup_height |
mov [ecx + BOX.height], eax |
xchg eax, ecx |
|
;-------------------------------------- |
align 4 |
@@: |
call window._.set_window_box |
add esp, sizeof.BOX |
|
;-------------------------------------- |
align 4 |
.exit: |
inc [_display.mask_seqno] |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
sys_window_rollup_handler: ;/////////////////////////////////////////////////// |
1143,7 → 1239,8 |
[edi + WDATA.box.left] |
mov eax, esp |
jmp .set_box |
|
;-------------------------------------- |
align 4 |
.restore_size: |
test bl, WSTATE_MAXIMIZED |
jnz @f |
1150,7 → 1247,8 |
add esp, -sizeof.BOX |
lea eax, [edx + APPDATA.saved_box] |
jmp .set_box |
|
;-------------------------------------- |
align 4 |
@@: |
mov eax, [screen_workarea.top] |
push [screen_workarea.bottom] \ |
1159,13 → 1257,13 |
[edi + WDATA.box.left] |
sub [esp + BOX.height], eax |
mov eax, esp |
|
;-------------------------------------- |
align 4 |
.set_box: |
call window._.set_window_box |
add esp, sizeof.BOX |
|
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
sys_window_start_moving_handler: ;///////////////////////////////////////////// |
1177,9 → 1275,8 |
;------------------------------------------------------------------------------ |
mov edi, eax |
call window._.draw_negative_box |
|
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
sys_window_end_moving_handler: ;/////////////////////////////////////////////// |
1201,7 → 1298,7 |
mov bl, [edi + WDATA.fl_wstate] |
call window._.set_window_box |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
sys_window_moving_handler: ;/////////////////////////////////////////////////// |
1217,7 → 1314,6 |
mov edi, ebx |
call window._.draw_negative_box |
ret |
|
;============================================================================== |
;///// private functions ////////////////////////////////////////////////////// |
;============================================================================== |
1240,7 → 1336,7 |
; to be reworked |
; new_window_starting dd ? |
;endg |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.invalidate_screen: ;////////////////////////////////////////////////// |
1255,37 → 1351,16 |
|
; TODO: do we really need `draw_limits`? |
; Yes, they are used by background drawing code. |
mov ecx, [eax + BOX.left] |
mov edx, [ebx + BOX.left] |
cmp ecx, edx |
jle @f |
mov ecx, edx |
@@: |
|
; we need only to restore the background windows at the old place! |
mov ecx, [ebx + BOX.left] |
mov [draw_limits.left], ecx |
mov ecx, [eax + BOX.left] |
add ecx, [eax + BOX.width] |
add edx, [ebx + BOX.width] |
cmp ecx, edx |
jae @f |
mov ecx, edx |
@@: |
add ecx, [ebx + BOX.width] |
mov [draw_limits.right], ecx |
mov ecx, [eax + BOX.top] |
mov edx, [ebx + BOX.top] |
cmp ecx, edx |
jle @f |
mov ecx, edx |
@@: |
mov ecx, [ebx + BOX.top] |
mov [draw_limits.top], ecx |
mov ecx, [eax + BOX.top] |
add ecx, [eax + BOX.height] |
add edx, [ebx + BOX.height] |
cmp ecx, edx |
jae @f |
mov ecx, edx |
@@: |
add ecx, [ebx + BOX.height] |
mov [draw_limits.bottom], ecx |
|
; recalculate screen buffer at old position |
push ebx |
mov edx, [eax + BOX.height] |
1296,7 → 1371,6 |
add edx, ebx |
call calculatescreen |
pop eax |
|
; recalculate screen buffer at new position |
mov edx, [eax + BOX.height] |
mov ecx, [eax + BOX.width] |
1314,7 → 1388,7 |
|
pop ebx eax |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.set_window_box: ;///////////////////////////////////////////////////// |
1339,10 → 1413,10 |
repz cmpsd |
pop edi |
jz .exit |
;-------------------------------------- |
align 4 |
@@: |
|
add esp, -sizeof.BOX |
|
mov ebx, esp |
if WDATA.box |
lea esi, [edi + WDATA.box] |
1391,11 → 1465,12 |
jnz .exit |
|
mov [eax + APPDATA.saved_box.height], edx |
|
;-------------------------------------- |
align 4 |
.exit: |
pop esi ebx eax |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.set_window_clientbox: ;/////////////////////////////////////////////// |
1436,7 → 1511,8 |
mov [edi + SLOT_BASE + APPDATA.wnd_clientbox.height], eax |
add esp, 4 |
jmp .exit |
|
;-------------------------------------- |
align 4 |
.whole_window: |
xor eax, eax |
mov [edi + SLOT_BASE + APPDATA.wnd_clientbox.left], eax |
1445,11 → 1521,12 |
mov [edi + SLOT_BASE + APPDATA.wnd_clientbox.width], eax |
mov eax, [ecx + WDATA.box.height] |
mov [edi + SLOT_BASE + APPDATA.wnd_clientbox.height], eax |
|
;-------------------------------------- |
align 4 |
.exit: |
pop edi ecx eax |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.sys_set_window: ;///////////////////////////////////////////////////// |
1473,7 → 1550,10 |
test [edi + WDATA.fl_wdrawn], 1 |
jnz .set_client_box |
or [edi + WDATA.fl_wdrawn], 1 |
|
; After first draw_window we need redraw mouse necessarily! |
; Otherwise the user can see cursor specified by f.37.5 from another window. |
; He will be really unhappy! He is terrible in rage - usually he throws stones! |
mov [redrawmouse_unconditional], 1 |
; NOTE: commented out since doesn't provide necessary functionality |
; anyway, to be reworked |
; mov eax, [timer_ticks] ; [0xfdf0] |
1508,7 → 1588,8 |
je @f |
|
xor eax, eax |
|
;-------------------------------------- |
align 4 |
@@: |
mov [edi + APPDATA.wnd_caption], eax |
|
1536,7 → 1617,8 |
|
mov byte[KEY_COUNT], 0 ; empty keyboard buffer |
mov byte[BTN_COUNT], 0 ; empty button buffer |
|
;-------------------------------------- |
align 4 |
.set_client_box: |
; update window client box coordinates |
call window._.set_window_clientbox |
1545,7 → 1627,7 |
mov [edi + WDATA.fl_redraw], 0 |
mov edx, edi |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.check_window_position: ;////////////////////////////////////////////// |
1564,7 → 1646,8 |
mov esi, [Screen_Max_X] |
cmp ecx, esi |
ja .fix_width_high |
|
;-------------------------------------- |
align 4 |
.check_left: |
or eax, eax |
jl .fix_left_low |
1571,12 → 1654,14 |
add eax, ecx |
cmp eax, esi |
jg .fix_left_high |
|
;-------------------------------------- |
align 4 |
.check_height: |
mov esi, [Screen_Max_Y] |
cmp edx, esi |
ja .fix_height_high |
|
;-------------------------------------- |
align 4 |
.check_top: |
or ebx, ebx |
jl .fix_top_low |
1583,43 → 1668,50 |
add ebx, edx |
cmp ebx, esi |
jg .fix_top_high |
|
;-------------------------------------- |
align 4 |
.exit: |
pop esi edx ecx ebx eax |
ret |
|
;-------------------------------------- |
align 4 |
.fix_width_high: |
mov ecx, esi |
mov [edi + WDATA.box.width], esi |
jmp .check_left |
|
;-------------------------------------- |
align 4 |
.fix_left_low: |
xor eax, eax |
mov [edi + WDATA.box.left], eax |
jmp .check_height |
|
;-------------------------------------- |
align 4 |
.fix_left_high: |
mov eax, esi |
sub eax, ecx |
mov [edi + WDATA.box.left], eax |
jmp .check_height |
|
;-------------------------------------- |
align 4 |
.fix_height_high: |
mov edx, esi |
mov [edi + WDATA.box.height], esi |
jmp .check_top |
|
;-------------------------------------- |
align 4 |
.fix_top_low: |
xor ebx, ebx |
mov [edi + WDATA.box.top], ebx |
jmp .exit |
|
;-------------------------------------- |
align 4 |
.fix_top_high: |
mov ebx, esi |
sub ebx, edx |
mov [edi + WDATA.box.top], ebx |
jmp .exit |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.get_titlebar_height: ;//////////////////////////////////////////////// |
1634,10 → 1726,12 |
jne @f |
mov eax, [_skinh] |
ret |
;-------------------------------------- |
align 4 |
@@: |
mov eax, 21 |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.get_rolledup_height: ;//////////////////////////////////////////////// |
1653,15 → 1747,19 |
mov eax, [_skinh] |
add eax, 3 |
ret |
;-------------------------------------- |
align 4 |
@@: |
or al, al |
jnz @f |
mov eax, 21 |
ret |
;-------------------------------------- |
align 4 |
@@: |
mov eax, 21 + 2 |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.set_screen: ;///////////////////////////////////////////////////////// |
1693,7 → 1791,8 |
jnz .check_for_shaped_window |
cmp [window_data + edi + WDATA.box.height], 0 |
jz .exit |
|
;-------------------------------------- |
align 4 |
.check_for_shaped_window: |
mov edi, esi |
shl edi, 8 |
1709,10 → 1808,14 |
|
; get WinMap start |
push esi |
mov edi, [Screen_Max_X] |
inc edi |
mov esi, edi |
imul edi, ebx |
; mov edi, [Screen_Max_X] |
; inc edi |
; mov esi, edi |
mov esi, [Screen_Max_X] |
inc esi |
; imul edi, ebx |
mov edi, [d_width_calc_area + ebx*4] |
|
add edi, eax |
add edi, [_WinMapAddress] |
pop eax |
1720,7 → 1823,8 |
push ax |
shl eax, 16 |
pop ax |
|
;-------------------------------------- |
align 4 |
.next_line: |
push ecx |
shr ecx, 2 |
1735,7 → 1839,8 |
jnz .next_line |
|
jmp .exit |
|
;-------------------------------------- |
align 4 |
.shaped_window: |
; for (y=0; y <= x_size; y++) |
; for (x=0; x <= x_size; x++) |
1751,9 → 1856,11 |
|
; get WinMap start -> ebp |
push eax |
mov eax, [Screen_Max_X] ; screen_sx |
inc eax |
imul eax, ebx |
; mov eax, [Screen_Max_X] ; screen_sx |
; inc eax |
; imul eax, ebx |
mov eax, [d_width_calc_area + ebx*4] |
|
add eax, [esp] |
add eax, [_WinMapAddress] |
mov ebp, eax |
1783,10 → 1890,12 |
add [ff_ysz], ebx |
|
mov ebx, [ff_y] |
|
;-------------------------------------- |
align 4 |
.ff_new_y: |
mov edx, [ff_x] |
|
;-------------------------------------- |
align 4 |
.ff_new_x: |
; -- body -- |
mov ecx, [ff_scale] |
1806,6 → 1915,8 |
mov eax, esi |
mov [ebp], al |
; -- end body -- |
;-------------------------------------- |
align 4 |
@@: |
inc ebp |
inc edx |
1821,11 → 1932,14 |
jb .ff_new_y |
|
add esp, 24 |
|
;-------------------------------------- |
align 4 |
.exit: |
popad |
inc [_display.mask_seqno] |
ret |
|
;-------------------------------------- |
align 4 |
.read_byte: |
; eax - address |
; esi - slot |
1836,7 → 1950,7 |
call read_process_memory |
pop esi edx ecx eax |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.window_activate: ;//////////////////////////////////////////////////// |
1861,10 → 1975,12 |
je .set_window_redraw_flag |
cmp al, 0x04 |
jne .move_others_down |
|
;-------------------------------------- |
align 4 |
.set_window_redraw_flag: |
mov [window_data + ebx + WDATA.fl_redraw], 1 |
|
;-------------------------------------- |
align 4 |
.move_others_down: |
; ax <- process no |
movzx ebx, word[esi] |
1873,7 → 1989,8 |
|
; drop others |
xor eax, eax |
|
;-------------------------------------- |
align 4 |
.next_stack_window: |
cmp eax, [TASK_COUNT] |
jae .move_self_up |
1889,7 → 2006,8 |
jbe .next_stack_window |
dec word[WIN_STACK + eax * 2] |
jmp .next_stack_window |
|
;-------------------------------------- |
align 4 |
.move_self_up: |
movzx ebx, word[esi] |
; number of processes |
1899,7 → 2017,8 |
|
; update on screen - window stack |
xor eax, eax |
|
;-------------------------------------- |
align 4 |
.next_window_pos: |
cmp eax, [TASK_COUNT] |
jae .reset_vars |
1907,7 → 2026,8 |
movzx ebx, word[WIN_STACK + eax * 2] |
mov [WIN_POS + ebx * 2], ax |
jmp .next_window_pos |
|
;-------------------------------------- |
align 4 |
.reset_vars: |
mov byte[KEY_COUNT], 0 |
mov byte[BTN_COUNT], 0 |
1916,7 → 2036,6 |
|
pop ebx eax |
ret |
|
;------------------------------------------------------------------------------ |
window._.window_deactivate: ;//////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
1925,7 → 2044,8 |
;> esi = pointer to WIN_POS+ window data |
;------------------------------------------------------------------------------ |
push eax ebx |
;------------------------------------------------------------------------------ |
;-------------------------------------- |
align 4 |
.move_others_up: |
; ax <- process no |
movzx ebx, word[esi] |
1933,6 → 2053,8 |
movzx ebx, word[WIN_STACK + ebx * 2] |
; up others |
xor eax, eax |
;-------------------------------------- |
align 4 |
.next_stack_window: |
cmp eax, [TASK_COUNT] |
jae .move_self_down |
1941,7 → 2063,8 |
jae .next_stack_window |
inc word[WIN_STACK + eax * 2] |
jmp .next_stack_window |
;---------------------------------------------- |
;-------------------------------------- |
align 4 |
.move_self_down: |
movzx ebx, word[esi] |
; this is the last (and the low) |
1948,6 → 2071,8 |
mov [WIN_STACK + ebx * 2], word 1 |
; update on screen - window stack |
xor eax, eax |
;-------------------------------------- |
align 4 |
.next_window_pos: |
cmp eax, [TASK_COUNT] |
jae .reset_vars |
1955,7 → 2080,8 |
movzx ebx, word[WIN_STACK + eax * 2] |
mov [WIN_POS + ebx * 2], ax |
jmp .next_window_pos |
;----------------------------------------------- |
;-------------------------------------- |
align 4 |
.reset_vars: |
mov byte[KEY_COUNT], 0 |
mov byte[BTN_COUNT], 0 |
1987,7 → 2113,8 |
|
movzx eax, word[WIN_STACK + eax * 2] ; get value of the curr process |
lea esi, [WIN_POS + eax * 2] ; get address of this process at 0xC400 |
|
;-------------------------------------- |
align 4 |
.next_window: |
add esi, 2 |
|
2025,17 → 2152,19 |
jge .next_window |
|
pop esi edx ebx eax |
|
;-------------------------------------- |
align 4 |
.exit.redraw: |
xor ecx, ecx |
inc ecx |
ret |
|
;-------------------------------------- |
align 4 |
.exit.no_redraw: |
pop esi edx ebx eax |
xor ecx, ecx |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.draw_window_caption: ;//////////////////////////////////////////////// |
2042,9 → 2171,6 |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
inc [mouse_pause] |
call [_display.disable_mouse] |
|
xor eax, eax |
mov edx, [TASK_COUNT] |
movzx edx, word[WIN_POS + edx * 2] |
2051,6 → 2177,8 |
cmp edx, [CURRENT_TASK] |
jne @f |
inc eax |
;-------------------------------------- |
align 4 |
@@: |
mov edx, [CURRENT_TASK] |
shl edx, 5 |
2063,13 → 2191,15 |
je .draw_caption_style_3 |
|
jmp .not_style_3 |
|
;-------------------------------------- |
align 4 |
.draw_caption_style_3: |
push edx |
call drawwindow_IV_caption |
add esp, 4 |
jmp .2 |
|
;-------------------------------------- |
align 4 |
.not_style_3: |
cmp bl, 2 |
jne .not_style_2 |
2076,13 → 2206,15 |
|
call drawwindow_III_caption |
jmp .2 |
|
;-------------------------------------- |
align 4 |
.not_style_2: |
cmp bl, 0 |
jne .2 |
|
call drawwindow_I_caption |
|
;-------------------------------------- |
align 4 |
.2: |
mov edi, [CURRENT_TASK] |
shl edi, 5 |
2100,7 → 2232,8 |
je .skinned |
|
jmp .not_skinned |
|
;-------------------------------------- |
align 4 |
.skinned: |
mov ebp, [edi + window_data + WDATA.box.left - 2] |
mov bp, word[edi + window_data + WDATA.box.top] |
2127,7 → 2260,8 |
add bx, -3 |
add ebx, ebp |
jmp .dodraw |
|
;-------------------------------------- |
align 4 |
.not_skinned: |
cmp al, 1 |
je .exit |
2148,18 → 2282,20 |
mov esi, eax |
mov ebx, 0x00080007 |
add ebx, ebp |
|
;-------------------------------------- |
align 4 |
.dodraw: |
mov ecx, [common_colours + 16] |
or ecx, 0x80000000 |
xor edi, edi |
call dtext_asciiz_esi |
|
;-------------------------------------- |
align 4 |
.exit: |
dec [mouse_pause] |
call [draw_pointer] |
; call [draw_pointer] |
call __sys_draw_pointer |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.draw_negative_box: ;////////////////////////////////////////////////// |
2170,6 → 2306,8 |
;------------------------------------------------------------------------------ |
push eax ebx esi |
mov esi, 0x01000000 |
;-------------------------------------- |
align 4 |
.1: |
mov eax, [edi + BOX.left - 2] |
mov ax, word[edi + BOX.left] |
2181,6 → 2319,8 |
pop esi ebx eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.end_moving__box: ;////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Draw positive box |
2190,9 → 2330,9 |
push eax ebx esi |
xor esi, esi |
jmp window._.draw_negative_box.1 |
|
|
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.get_rect: ;///////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> void __fastcall get_window_rect(struct RECT* rc); |
2212,6 → 2352,5 |
|
add edx, [eax-twdw + WDATA.box.height] |
mov [ecx+RECT.bottom], edx |
|
ret |
|
;------------------------------------------------------------------------------ |