Added two flags to 0th function (edx = 0xXYRRGGBB, X = DCBAb)

A - window has a caption; if Y=3, then caption scting address could be passed in
      edi, otherwise use function 71/1
  B - treat all drawing performed to be relative to window client area
  D - use gradient fill for client area
Added function 71:
  subfunction 1 - set window caption string address (in ecx)
  subfunction 2 - get window caption into buffer (not implemented yet)
Updated sysfuncr.txt, added sysfuncs.txt

git-svn-id: svn://kolibrios.org@114 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Mihail Semenyako (mike.dld) 2006-08-03 19:30:32 +00:00
parent 7a1e29cbc9
commit 9a27b206b3
10 changed files with 5125 additions and 465 deletions

View File

@ -797,20 +797,20 @@ terminate: ; terminate application
cld cld
shl esi,5 shl esi,5
add esi,window_data add esi,window_data
mov eax,[esi+WDATA.left] mov eax,[esi+WDATA.box.left]
mov [dlx],eax mov [dlx],eax
add eax,[esi+WDATA.width] add eax,[esi+WDATA.box.width]
mov [dlxe],eax mov [dlxe],eax
mov eax,[esi+WDATA.top] mov eax,[esi+WDATA.box.top]
mov [dly],eax mov [dly],eax
add eax,[esi+WDATA.height] add eax,[esi+WDATA.box.height]
mov [dlye],eax mov [dlye],eax
mov [esi+WDATA.left], 0 mov [esi+WDATA.box.left], 0
mov [esi+WDATA.width], 5 mov [esi+WDATA.box.width], 5
mov eax,[0xFE04] mov eax,[0xFE04]
mov [esi+WDATA.top],eax mov [esi+WDATA.box.top],eax
mov [esi+WDATA.height], 5 mov [esi+WDATA.box.height], 5
xor eax, eax xor eax, eax
mov [esi+16],eax mov [esi+16],eax
mov [esi+20],eax mov [esi+20],eax

View File

@ -143,6 +143,7 @@ iglobal
dd sys_internal_services ; 68-Some internal services dd sys_internal_services ; 68-Some internal services
dd sys_debug_services ; 69-Debug dd sys_debug_services ; 69-Debug
dd file_system_lfn ; 70-Common file system interface, version 2 dd file_system_lfn ; 70-Common file system interface, version 2
dd syscall_windowsettings ; 71-Window settings
times 255 - ( ($-servetable) /4 ) dd undefined_syscall times 255 - ( ($-servetable) /4 ) dd undefined_syscall

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -163,14 +163,26 @@ button_dececx:
sys_button: sys_button:
push edi
mov edi,[0x3000]
shl edi,8
rol eax,16
add ax,word[edi+0x80000+APPDATA.wnd_clientbox.left]
rol eax,16
rol ebx,16
add bx,word[edi+0x80000+APPDATA.wnd_clientbox.top]
rol ebx,16
pop edi
.forced:
test ecx,0x80000000 test ecx,0x80000000
jnz remove_button jnz remove_button
push esi push esi
push edi push edi
push eax push eax ; <x,xs>
push ebx push ebx ; <y,ys>
push ecx push ecx ; <id>
push edx push edx
or ax,ax or ax,ax

View File

@ -191,9 +191,78 @@ parse_skin_data:
sys_putimage_with_check: sys_putimage_with_check:
or ebx,ebx or ebx,ebx
jz @f jz @f
call sys_putimage call sys_putimage.forced
@@: ret @@: ret
drawwindow_IV_caption:
mov ebp,skin_active
or al,al
jnz @f
mov ebp,skin_inactive
@@:
mov esi,[esp+4]
mov eax,[esi+8] ; window width
mov edx,[ebp+SKIN_DATA.left.left]
shl edx,16
mov ecx,[ebp+SKIN_DATA.left.width]
shl ecx,16
add ecx,[_skinh]
mov ebx, [ebp+SKIN_DATA.left.data]
call sys_putimage_with_check
mov esi,[esp+4]
mov eax,[esi+8]
sub eax,[ebp+SKIN_DATA.left.width]
sub eax,[ebp+SKIN_DATA.oper.width]
cmp eax,[ebp+SKIN_DATA.base.left]
jng .non_base
xor edx,edx
mov ecx,[ebp+SKIN_DATA.base.width]
jecxz .non_base
div ecx
inc eax
mov ebx,[ebp+SKIN_DATA.base.data]
mov ecx,[ebp+SKIN_DATA.base.width]
shl ecx,16
add ecx,[_skinh]
mov edx,[ebp+SKIN_DATA.base.left]
sub edx,[ebp+SKIN_DATA.base.width]
shl edx,16
.baseskinloop:
shr edx,16
add edx,[ebp+SKIN_DATA.base.width]
shl edx,16
push eax ebx ecx edx
call sys_putimage_with_check
pop edx ecx ebx eax
dec eax
jnz .baseskinloop
.non_base:
mov esi,[esp+4]
mov edx,[esi+8]
sub edx,[ebp+SKIN_DATA.oper.width]
inc edx
shl edx,16
mov ebx,[ebp+SKIN_DATA.oper.data]
mov ecx,[ebp+SKIN_DATA.oper.width]
shl ecx,16
add ecx,[_skinh]
call sys_putimage_with_check
ret
;//mike.dld, 2006-08-02 ]
drawwindow_IV: drawwindow_IV:
;param1 - aw_yes ;param1 - aw_yes
@ -256,61 +325,8 @@ drawwindow_IV:
jmp draw_clientbar jmp draw_clientbar
@@: @@:
mov esi,[esp] mov al,[esp+32+4+4]
mov eax,[esi+8] ; window width call drawwindow_IV_caption
mov edx,[ebp+SKIN_DATA.left.left]
shl edx,16
mov ecx,[ebp+SKIN_DATA.left.width]
shl ecx,16
add ecx,[_skinh]
mov ebx, [ebp+SKIN_DATA.left.data]
call sys_putimage_with_check
mov esi,[esp]
mov eax,[esi+8]
sub eax,[ebp+SKIN_DATA.left.width]
sub eax,[ebp+SKIN_DATA.oper.width]
cmp eax,[ebp+SKIN_DATA.base.left]
jng non_base
xor edx,edx
mov ecx,[ebp+SKIN_DATA.base.width]
jecxz non_base
div ecx
inc eax
mov ebx,[ebp+SKIN_DATA.base.data]
mov ecx,[ebp+SKIN_DATA.base.width]
shl ecx,16
add ecx,[_skinh]
mov edx,[ebp+SKIN_DATA.base.left]
sub edx,[ebp+SKIN_DATA.base.width]
shl edx,16
baseskinloop:
shr edx,16
add edx,[ebp+SKIN_DATA.base.width]
shl edx,16
push eax ebx ecx edx
call sys_putimage_with_check
pop edx ecx ebx eax
dec eax
jnz baseskinloop
non_base:
mov esi,[esp]
mov edx,[esi+8]
sub edx,[ebp+SKIN_DATA.oper.width]
inc edx
shl edx,16
mov ebx,[ebp+SKIN_DATA.oper.data]
mov ecx,[ebp+SKIN_DATA.oper.width]
shl ecx,16
add ecx,[_skinh]
call sys_putimage_with_check
draw_clientbar: draw_clientbar:

View File

@ -35,7 +35,11 @@ align 4
skin_udata: skin_udata:
_skinh dd ? _skinh dd ?
_skinmargins rw 4 _skinmargins: ; rw 4
.right dw ?
.left dw ?
.bottom dw ?
.top dw ?
skin_btn_close SKIN_BUTTON skin_btn_close SKIN_BUTTON
skin_btn_minimize SKIN_BUTTON skin_btn_minimize SKIN_BUTTON

View File

@ -75,17 +75,17 @@ calculatescreen:
test [edi+WDATA.fl_wstate], WSTATE_MINIMIZED test [edi+WDATA.fl_wstate], WSTATE_MINIMIZED
jnz .not_wnd jnz .not_wnd
mov eax, [edi+WDATA.left] mov eax,[edi+WDATA.box.left]
cmp eax, [esp+RECT.right] cmp eax, [esp+RECT.right]
ja .out_of_bounds ja .out_of_bounds
mov ebx, [edi+WDATA.top] mov ebx,[edi+WDATA.box.top]
cmp ebx, [esp+RECT.bottom] cmp ebx, [esp+RECT.bottom]
ja .out_of_bounds ja .out_of_bounds
mov ecx, [edi+WDATA.width] mov ecx,[edi+WDATA.box.width]
add ecx, eax add ecx, eax
cmp ecx, [esp+RECT.left] cmp ecx, [esp+RECT.left]
jb .out_of_bounds jb .out_of_bounds
mov edx, [edi+WDATA.height] mov edx,[edi+WDATA.box.height]
add edx, ebx add edx, ebx
cmp edx, [esp+RECT.top] cmp edx, [esp+RECT.top]
jb .out_of_bounds jb .out_of_bounds
@ -239,9 +239,9 @@ pushad
mov ecx, esi mov ecx, esi
shl ecx, 5 shl ecx, 5
mov edx, [window_data+ecx+WDATA.top] mov edx, [window_data+ecx+WDATA.box.top]
push [window_data+ecx+WDATA.width] ; for loop - width push [window_data+ecx+WDATA.box.width] ; for loop - width
mov ecx, [window_data+ecx+WDATA.left] mov ecx, [window_data+ecx+WDATA.box.left]
sub ebx, edx sub ebx, edx
sub eax, ecx sub eax, ecx
push ebx eax ; for loop - x,y push ebx eax ; for loop - x,y
@ -513,44 +513,44 @@ repos_windows:
test [esi+WDATA.fl_wstate],WSTATE_MAXIMIZED test [esi+WDATA.fl_wstate],WSTATE_MAXIMIZED
jz .lp2 jz .lp2
mov eax,[screen_workarea.left] mov eax,[screen_workarea.left]
mov [esi+WDATA.left],eax mov [esi+WDATA.box.left],eax
sub eax,[screen_workarea.right] sub eax,[screen_workarea.right]
neg eax neg eax
mov [esi+WDATA.width],eax mov [esi+WDATA.box.width],eax
mov eax,[screen_workarea.top] mov eax,[screen_workarea.top]
mov [esi+WDATA.top],eax mov [esi+WDATA.box.top],eax
test [esi+WDATA.fl_wstate],WSTATE_ROLLEDUP test [esi+WDATA.fl_wstate],WSTATE_ROLLEDUP
jnz .lp1 jnz .lp1
sub eax,[screen_workarea.bottom] sub eax,[screen_workarea.bottom]
neg eax neg eax
mov [esi+WDATA.height],eax mov [esi+WDATA.box.height],eax
.lp1: add esi,0x20 .lp1: add esi,0x20
loop @b loop @b
ret ret
.lp2: mov eax,[esi+WDATA.left] .lp2: mov eax,[esi+WDATA.box.left]
add eax,[esi+WDATA.width] add eax,[esi+WDATA.box.width]
mov ebx,[0x0000fe00] mov ebx,[0x0000fe00]
; inc ebx ; inc ebx
cmp eax,ebx cmp eax,ebx
jle .lp4 jle .lp4
mov eax,[esi+WDATA.width] mov eax,[esi+WDATA.box.width]
sub eax,ebx sub eax,ebx
jle .lp3 jle .lp3
mov [esi+WDATA.width],ebx mov [esi+WDATA.box.width],ebx
.lp3: sub ebx,[esi+WDATA.width] .lp3: sub ebx,[esi+WDATA.box.width]
mov [esi+WDATA.left],ebx mov [esi+WDATA.box.left],ebx
.lp4: mov eax,[esi+WDATA.top] .lp4: mov eax,[esi+WDATA.box.top]
add eax,[esi+WDATA.height] add eax,[esi+WDATA.box.height]
mov ebx,[0x0000fe04] mov ebx,[0x0000fe04]
; inc ebx ; inc ebx
cmp eax,ebx cmp eax,ebx
jle .lp6 jle .lp6
mov eax,[esi+WDATA.height] mov eax,[esi+WDATA.box.height]
sub eax,ebx sub eax,ebx
jle .lp5 jle .lp5
mov [esi+WDATA.height],ebx mov [esi+WDATA.box.height],ebx
.lp5: sub ebx,[esi+WDATA.height] .lp5: sub ebx,[esi+WDATA.box.height]
mov [esi+WDATA.top],ebx mov [esi+WDATA.box.top],ebx
.lp6: add esi,0x20 .lp6: add esi,0x20
loop @b loop @b
ret ret
@ -633,6 +633,63 @@ sys_window_mouse:
ret ret
drawwindow_I_caption:
mov ecx,[edx+20] ; grab bar
push ecx
mov esi,edx
mov edx,[esi+04]
add edx,1
mov ebx,[esi+04]
add ebx,21
mov eax,[esi+04]
add eax,[esi+12]
cmp ebx,eax
jb .wdsizeok
mov ebx,eax
.wdsizeok:
push ebx
.drwi:
mov ebx,edx
shl ebx,16
add ebx,edx
mov eax,[esi+00]
inc eax
shl eax,16
add eax,[esi+00]
add eax,[esi+8]
sub eax,1
push edx
mov edx,0x80000000
mov ecx,[esi+20]
and ecx,edx
cmp ecx,edx
jnz .nofa
mov ecx,[esi+20]
sub ecx,0x00040404
mov [esi+20],ecx
and ecx,0x00ffffff
jmp .faj
.nofa:
mov ecx,[esi+20]
and ecx,0x00ffffff
.faj:
pop edx
mov edi,0
call [draw_line]
inc edx
cmp edx,[esp]
jb .drwi
add esp,4
pop ecx
mov [esi+20],ecx
ret
drawwindow_I: drawwindow_I:
pushad pushad
@ -648,54 +705,7 @@ drawwindow_I:
add ebx,[edx+12] add ebx,[edx+12]
call draw_rectangle call draw_rectangle
mov ecx,[edx+20] ; grab bar call drawwindow_I_caption
push ecx
mov esi,edx
mov edx,[esi+04]
add edx,1
mov ebx,[esi+04]
add ebx,25
mov eax,[esi+04]
add eax,[esi+12]
cmp ebx,eax
jb wdsizeok
mov ebx,eax
wdsizeok:
push ebx
drwi:
mov ebx,edx
shl ebx,16
add ebx,edx
mov eax,[esi+00]
inc eax
shl eax,16
add eax,[esi+00]
add eax,[esi+8]
sub eax,1
push edx
mov edx,0x80000000
mov ecx,[esi+20]
and ecx,edx
cmp ecx,edx
jnz nofa
mov ecx,[esi+20]
sub ecx,0x00040404
mov [esi+20],ecx
and ecx,0x00ffffff
jmp faj
nofa:
mov ecx,[esi+20]
and ecx,0x00ffffff
faj:
pop edx
mov edi,0
call [draw_line]
inc edx
cmp edx,[esp]
jb drwi
add esp,4
pop ecx
mov [esi+20],ecx
mov edx,[esi+04] ; inside work area mov edx,[esi+04] ; inside work area
add edx,21+5 add edx,21+5
@ -759,6 +769,54 @@ r_bx equ [esp+18] ; y end
ret ret
drawwindow_III_caption:
mov ecx,[edx+20] ; GRAB BAR
push ecx
mov esi,edx
mov edx,[esi+04]
add edx,4
mov ebx,[esi+04]
add ebx,20
mov eax,[esi+04]
add eax,[esi+12]
cmp ebx,eax
jb .wdsizeok
mov ebx,eax
.wdsizeok:
push ebx
.drwi:
mov ebx,edx
shl ebx,16
add ebx,edx
mov eax,[esi+00]
shl eax,16
add eax,[esi+00]
add eax,[esi+8]
add eax,4*65536-4
mov ecx,[esi+20]
test ecx,0x40000000
jz .nofa
add ecx,0x040404
.nofa:
test ecx,0x80000000
jz .nofa2
sub ecx,0x040404
.nofa2:
mov [esi+20],ecx
and ecx,0xffffff
xor edi, edi
call [draw_line]
inc edx
cmp edx,[esp]
jb .drwi
add esp,4
pop ecx
mov [esi+20],ecx
ret
drawwindow_III: drawwindow_III:
pushad pushad
@ -790,48 +848,7 @@ drawwindow_III:
add ebx,1*65536-1 add ebx,1*65536-1
call draw_rectangle call draw_rectangle
mov ecx,[edx+20] ; GRAB BAR call drawwindow_III_caption
push ecx
mov esi,edx
mov edx,[esi+04]
add edx,4
mov ebx,[esi+04]
add ebx,20
mov eax,[esi+04]
add eax,[esi+12]
cmp ebx,eax
jb wdsizeok2
mov ebx,eax
wdsizeok2:
push ebx
drwi2:
mov ebx,edx
shl ebx,16
add ebx,edx
mov eax,[esi+00]
shl eax,16
add eax,[esi+00]
add eax,[esi+8]
add eax,4*65536-4
mov ecx,[esi+20]
test ecx,0x40000000
jz nofa3
add ecx,0x040404
nofa3:
test ecx,0x80000000
jz nofa2
sub ecx,0x040404
nofa2:
mov [esi+20],ecx
and ecx,0xffffff
xor edi, edi
call [draw_line]
inc edx
cmp edx,[esp]
jb drwi2
add esp,4
pop ecx
mov [esi+20],ecx
mov edx,[esi+04] ; WORK AREA mov edx,[esi+04] ; WORK AREA
add edx,21+5 add edx,21+5
@ -1060,15 +1077,15 @@ minimize_window:
or [eax+WDATA.fl_wstate], WSTATE_MINIMIZED or [eax+WDATA.fl_wstate], WSTATE_MINIMIZED
mov edi, eax mov edi, eax
;call calculatescreen ;call calculatescreen
mov eax, [edi+WDATA.left] mov eax, [edi+WDATA.box.left]
mov [dlx], eax mov [dlx], eax
mov ecx, eax mov ecx, eax
add ecx, [edi+WDATA.width] add ecx, [edi+WDATA.box.width]
mov [dlxe], ecx mov [dlxe], ecx
mov ebx, [edi+WDATA.top] mov ebx, [edi+WDATA.box.top]
mov [dly], ebx mov [dly], ebx
mov edx, ebx mov edx, ebx
add edx, [edi+WDATA.height] add edx, [edi+WDATA.box.height]
mov [dlye], edx mov [dlye], edx
call calculatescreen call calculatescreen
xor esi, esi xor esi, esi
@ -1093,21 +1110,21 @@ restore_minimized_window:
and [edi+WDATA.fl_wstate], not WSTATE_MINIMIZED and [edi+WDATA.fl_wstate], not WSTATE_MINIMIZED
cmp eax, [0x3004] ; the uppermost window cmp eax, [0x3004] ; the uppermost window
jnz .no_uppermost jnz .no_uppermost
mov eax, [edi+WDATA.left] mov eax, [edi+WDATA.box.left]
mov ebx, [edi+WDATA.top] mov ebx, [edi+WDATA.box.top]
mov ecx, eax mov ecx, eax
mov edx, ebx mov edx, ebx
add ecx, [edi+WDATA.width] add ecx, [edi+WDATA.box.width]
add edx, [edi+WDATA.height] add edx, [edi+WDATA.box.height]
call setscreen call setscreen
jmp .done jmp .done
.no_uppermost: .no_uppermost:
mov eax, [edi+WDATA.left] mov eax, [edi+WDATA.box.left]
mov ebx, [edi+WDATA.top] mov ebx, [edi+WDATA.box.top]
mov ecx, eax mov ecx, eax
mov edx, ebx mov edx, ebx
add ecx, [edi+WDATA.width] add ecx, [edi+WDATA.box.width]
add edx, [edi+WDATA.height] add edx, [edi+WDATA.box.height]
call calculatescreen call calculatescreen
.done: .done:
mov [0xfff4],byte 0 ; no mouse under mov [0xfff4],byte 0 ; no mouse under
@ -1480,7 +1497,7 @@ checkwindows:
jz @f jz @f
mov eax,[screen_workarea.bottom] mov eax,[screen_workarea.bottom]
sub eax,[screen_workarea.top] sub eax,[screen_workarea.top]
@@: mov [edi+WDATA.height],eax @@: mov [edi+WDATA.box.height],eax
no_window_shade: no_window_shade:
@ -1493,22 +1510,22 @@ checkwindows:
jnz restore_from_fullscreen jnz restore_from_fullscreen
or [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED or [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
mov eax,[screen_workarea.left] mov eax,[screen_workarea.left]
mov [edi+WDATA.left],eax mov [edi+WDATA.box.left],eax
sub eax,[screen_workarea.right] sub eax,[screen_workarea.right]
neg eax neg eax
mov [edi+WDATA.width],eax mov [edi+WDATA.box.width],eax
mov eax,[screen_workarea.top] mov eax,[screen_workarea.top]
mov [edi+WDATA.top],eax mov [edi+WDATA.box.top],eax
test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
jnz @f jnz @f
sub eax,[screen_workarea.bottom] sub eax,[screen_workarea.bottom]
neg eax neg eax
mov [edi+WDATA.height],eax mov [edi+WDATA.box.height],eax
@@: @@:
jmp no_fullscreen_restore jmp no_fullscreen_restore
restore_from_fullscreen: restore_from_fullscreen:
and [edi+WDATA.fl_wstate],not WSTATE_MAXIMIZED and [edi+WDATA.fl_wstate],not WSTATE_MAXIMIZED
push [edi+WDATA.height] push [edi+WDATA.box.height]
push edi ; restore push edi ; restore
lea esi, [edx + 0x90] lea esi, [edx + 0x90]
mov ecx,4 mov ecx,4
@ -1518,7 +1535,7 @@ checkwindows:
pop eax pop eax
test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
jz @f jz @f
mov [edi+WDATA.height],eax mov [edi+WDATA.box.height],eax
@@: @@:
no_fullscreen_restore: no_fullscreen_restore:

View File

@ -69,7 +69,10 @@ dd servetable-0x10000
draw_line dd __sys_draw_line draw_line dd __sys_draw_line
disable_mouse dd __sys_disable_mouse disable_mouse dd __sys_disable_mouse
draw_pointer dd __sys_draw_pointer draw_pointer dd __sys_draw_pointer
drawbar dd __sys_drawbar ;//mike.dld, 2006-08-02 [
;drawbar dd __sys_drawbar
drawbar dd __sys_drawbar.forced
;//mike.dld, 2006-08-02 ]
putpixel dd __sys_putpixel putpixel dd __sys_putpixel
; } mike.dld ; } mike.dld
@ -2856,9 +2859,10 @@ sys_drawwindow:
call sys_set_window call sys_set_window
call [disable_mouse] call [disable_mouse]
call drawwindow_I call drawwindow_I
dec [mouse_pause] ;dec [mouse_pause]
call [draw_pointer] ;call [draw_pointer]
ret ;ret
jmp draw_window_caption.2
nosyswI: nosyswI:
cmp edi,1 ; type II - only reserve area, no draw cmp edi,1 ; type II - only reserve area, no draw
@ -2880,9 +2884,10 @@ sys_drawwindow:
call sys_set_window call sys_set_window
call [disable_mouse] call [disable_mouse]
call drawwindow_III call drawwindow_III
dec [mouse_pause] ;dec [mouse_pause]
call [draw_pointer] ;call [draw_pointer]
ret ;ret
jmp draw_window_caption.2
nosyswIII: nosyswIII:
cmp edi,3 ; type IV - skinned window cmp edi,3 ; type IV - skinned window
@ -2902,14 +2907,176 @@ sys_drawwindow:
call sys_set_window call sys_set_window
call [disable_mouse] call [disable_mouse]
call drawwindow_IV call drawwindow_IV
dec [mouse_pause] ;dec [mouse_pause]
call [draw_pointer] ;call [draw_pointer]
ret ;ret
jmp draw_window_caption.2
nosyswIV: nosyswIV:
ret ret
draw_window_caption:
inc [mouse_pause]
call [disable_mouse]
xor eax,eax
mov edx,[0x3004]
movzx edx,word[0xC400+edx*2]
cmp edx,[0x3000]
jne @f
inc eax
@@: mov edx,[0x3000]
shl edx,5
add edx,window_data
movzx ebx,[edx+WDATA.fl_wstyle]
and bl,0x0F
cmp bl,3
jne .not_style_3
push edx
call drawwindow_IV_caption
add esp,4
jmp .2
.not_style_3:
cmp bl,2
jne .not_style_2
call drawwindow_III_caption
jmp .2
.not_style_2:
cmp bl,0
jne .2
call drawwindow_I_caption
;--------------------------------------------------------------
.2: ;jmp @f
mov edi,[0x3000]
shl edi,5
test [edi+window_data+WDATA.fl_wstyle],WSTYLE_HASCAPTION
jz @f
mov ecx,[edi*8+0x80000+APPDATA.wnd_caption]
or ecx,ecx
jz @f
add ecx,[edi+twdw+0x10]
movzx eax,[edi+window_data+WDATA.fl_wstyle]
and al,0x0F
cmp al,3
jne .not_skinned
mov ebp,[edi+window_data+WDATA.box.left-2]
mov bp,word[edi+window_data+WDATA.box.top]
movzx eax,word[edi+window_data+WDATA.box.width]
sub ax,[_skinmargins.left]
sub ax,[_skinmargins.right]
cwde
cdq
mov ebx,6
idiv ebx
or eax,eax
js @f
mov edx,eax
mov eax,dword[_skinmargins.left-2]
mov ax,word[_skinh]
sub ax,[_skinmargins.bottom]
sub ax,[_skinmargins.top]
sar ax,1
adc ax,0
add ax,[_skinmargins.top]
add ax,-3
add eax,ebp
mov ebx,[common_colours+16];0x00FFFFFF
xor edi,edi
call dtext
jmp @f
.not_skinned:
cmp al,1
je @f
mov ebp,[edi+window_data+WDATA.box.left-2]
mov bp,word[edi+window_data+WDATA.box.top]
movzx eax,word[edi+window_data+WDATA.box.width]
sub eax,16
cwde
cdq
mov ebx,6
idiv ebx
or eax,eax
js @f
mov edx,eax
mov eax,0x00080007
add eax,ebp
mov ebx,[common_colours+16];0x00FFFFFF
xor edi,edi
call dtext
jmp @f
@@:
;--------------------------------------------------------------
dec [mouse_pause]
call [draw_pointer]
ret
iglobal
align 4
window_topleft dd \
1, 21,\
0, 0,\
5, 20,\
5, ?
endg
set_window_clientbox:
push eax ecx edi
mov eax,[_skinh]
mov [window_topleft+4*7],eax
mov ecx,edi
sub edi,window_data
shl edi,3
test [ecx+WDATA.fl_wstyle],WSTYLE_CLIENTRELATIVE
jz @f
movzx eax,[ecx+WDATA.fl_wstyle]
and eax,0x0F
mov eax,[eax*8+window_topleft+0]
mov [edi+0x80000+APPDATA.wnd_clientbox.left],eax
shl eax,1
neg eax
add eax,[ecx+WDATA.box.width]
mov [edi+0x80000+APPDATA.wnd_clientbox.width],eax
movzx eax,[ecx+WDATA.fl_wstyle]
and eax,0x0F
push [eax*8+window_topleft+0]
mov eax,[eax*8+window_topleft+4]
mov [edi+0x80000+APPDATA.wnd_clientbox.top],eax
neg eax
sub eax,[esp]
add eax,[ecx+WDATA.box.height]
mov [edi+0x80000+APPDATA.wnd_clientbox.height],eax
add esp,4
pop edi ecx eax
ret
@@:
xor eax,eax
mov [edi+0x80000+APPDATA.wnd_clientbox.left],eax
mov [edi+0x80000+APPDATA.wnd_clientbox.top],eax
mov eax,[ecx+WDATA.box.width]
mov [edi+0x80000+APPDATA.wnd_clientbox.width],eax
mov eax,[ecx+WDATA.box.height]
mov [edi+0x80000+APPDATA.wnd_clientbox.height],eax
pop edi ecx eax
ret
sys_set_window: sys_set_window:
mov edi,[0x3000] mov edi,[0x3000]
@ -2917,12 +3084,14 @@ sys_set_window:
add edi,window_data add edi,window_data
; colors ; colors
mov [edi+16],ecx mov [edi+WDATA.cl_workarea],ecx
mov [edi+20],edx mov [edi+WDATA.cl_titlebar],edx
mov [edi+24],esi mov [edi+WDATA.cl_frames],esi
call set_window_clientbox
; check flag (?) ; check flag (?)
cmp [edi+30],byte 1 cmp [edi+WDATA.fl_wdrawn],1
jz newd jz newd
push eax push eax
@ -2931,23 +3100,33 @@ sys_set_window:
mov [new_window_starting],eax mov [new_window_starting],eax
pop eax pop eax
mov [edi+8],ax mov word[edi+WDATA.box.width],ax
mov [edi+12],bx mov word[edi+WDATA.box.height],bx
shr eax,16 sar eax,16
shr ebx,16 sar ebx,16
mov [edi+00],ax mov word[edi+WDATA.box.left],ax
mov [edi+04],bx mov word[edi+WDATA.box.top],bx
call check_window_position call check_window_position
push ecx esi edi ; save for window fullscreen/resize push ecx esi edi ; save for window fullscreen/resize
mov esi,edi ;mov esi,edi
mov cl,[edi+WDATA.fl_wstyle]
sub edi,window_data sub edi,window_data
shr edi,5 shl edi,3
shl edi,8
add edi,0x80000+0x90 add edi,0x80000+0x90
and cl,0x0F
mov [edi-0x90+APPDATA.wnd_caption],0
cmp cl,3
jne @f
mov [edi-0x90+APPDATA.wnd_caption],esi
@@: mov esi,[esp+0]
mov ecx,4 mov ecx,4
cld cld
rep movsd rep movsd
@ -2974,6 +3153,45 @@ sys_set_window:
ret ret
syscall_windowsettings:
.set_window_caption:
dec eax ; subfunction #1 - set window caption
jnz .get_window_caption
; NOTE: only window owner thread can set its caption,
; so there's no parameter for PID/TID
mov edi,[0x3000]
shl edi,5
; have to check if caption is within application memory limit
; check is trivial, and if application resizes its memory,
; caption still can become over bounds
mov ecx,[edi*8+0x80000+APPDATA.mem_size]
add ecx,255 ; max caption length
cmp ebx,ecx
ja .exit_fail
mov [edi*8+0x80000+APPDATA.wnd_caption],ebx
or [edi+window_data+WDATA.fl_wstyle],WSTYLE_HASCAPTION
call draw_window_caption
xor eax,eax ; eax = 0 (success)
ret
.get_window_caption:
dec eax ; subfunction #2 - get window caption
jnz .exit_fail
; not implemented yet
.exit_fail:
xor eax,eax
inc eax ; eax = 1 (fail)
ret
sys_window_move: sys_window_move:
@ -3966,6 +4184,13 @@ sys_putimage:
.exit: .exit:
ret ret
@@: @@:
mov edi,[0x3000]
shl edi,8
add dx,word[edi+0x80000+APPDATA.wnd_clientbox.top]
rol edx,16
add dx,word[edi+0x80000+APPDATA.wnd_clientbox.left]
rol edx,16
.forced:
mov eax, vga_putimage mov eax, vga_putimage
cmp [0xfe0c], word 0x12 cmp [0xfe0c], word 0x12
jz .doit jz .doit
@ -3989,6 +4214,13 @@ sys_putimage:
; edi color ; edi color
__sys_drawbar: __sys_drawbar:
mov esi,[0x3000]
shl esi,8
add eax,[esi+0x80000+APPDATA.wnd_clientbox.left]
add ecx,[esi+0x80000+APPDATA.wnd_clientbox.left]
add ebx,[esi+0x80000+APPDATA.wnd_clientbox.top]
add edx,[esi+0x80000+APPDATA.wnd_clientbox.top]
.forced:
inc [mouse_pause] inc [mouse_pause]
cmp [0xfe0c],word 0x12 cmp [0xfe0c],word 0x12
jne sdbv20 jne sdbv20
@ -4667,8 +4899,12 @@ syscall_setpixel: ; SetPixel
mov edx,[0x3010] mov edx,[0x3010]
add eax,[edx-twdw] add eax,[edx-twdw]
add ebx,[edx-twdw+4] add ebx,[edx-twdw+4]
mov edi,[0x3000]
shl edi,8
add eax,[edi+0x80000+APPDATA.wnd_clientbox.left]
add ebx,[edi+0x80000+APPDATA.wnd_clientbox.top]
xor edi,edi ; no force xor edi,edi ; no force
;mov edi,1 ; mov edi,1
call [disable_mouse] call [disable_mouse]
jmp [putpixel] jmp [putpixel]
@ -4678,8 +4914,12 @@ syscall_writetext: ; WriteText
mov edi,[0x3010] mov edi,[0x3010]
mov ebp,[edi-twdw] mov ebp,[edi-twdw]
mov esi,[0x3000]
shl esi,8
add ebp,[esi+0x80000+APPDATA.wnd_clientbox.left]
shl ebp,16 shl ebp,16
add ebp,[edi-twdw+4] add ebp,[edi-twdw+4]
add bp,word[esi+0x80000+APPDATA.wnd_clientbox.top]
add edi,0x10 add edi,0x10
add ecx,[edi] add ecx,[edi]
add eax,ebp add eax,ebp
@ -4714,6 +4954,10 @@ syscall_drawrect: ; DrawRect
shr eax,16 shr eax,16
movzx edx,bx movzx edx,bx
shr ebx,16 shr ebx,16
mov esi,[0x3000]
shl esi,8
add eax,[esi+0x80000+APPDATA.wnd_clientbox.left]
add ebx,[esi+0x80000+APPDATA.wnd_clientbox.top]
add ecx,eax add ecx,eax
add edx,ebx add edx,ebx
jmp [drawbar] jmp [drawbar]
@ -4838,11 +5082,17 @@ syscall_drawline: ; DrawLine
mov edi,[0x3010] mov edi,[0x3010]
movzx edx,word[edi-twdw] movzx edx,word[edi-twdw]
mov ebp,edx mov ebp,edx
mov esi,[0x3000]
shl esi,8
add ebp,[esi+0x80000+APPDATA.wnd_clientbox.left]
add dx,word[esi+0x80000+APPDATA.wnd_clientbox.left]
shl edx,16 shl edx,16
add ebp,edx add ebp,edx
movzx edx,word[edi-twdw+4] movzx edx,word[edi-twdw+4]
add eax,ebp add eax,ebp
mov ebp,edx mov ebp,edx
add ebp,[esi+0x80000+APPDATA.wnd_clientbox.top]
add dx,word[esi+0x80000+APPDATA.wnd_clientbox.top]
shl edx,16 shl edx,16
xor edi,edi xor edi,edi
add edx,ebp add edx,ebp

View File

@ -75,31 +75,6 @@ struc dt [a] { common . dt a
display 'not used dt: ',`.,13,10 display 'not used dt: ',`.,13,10
end if } end if }
; constants definition
WSTATE_NORMAL = 00000000b
WSTATE_MAXIMIZED = 00000001b
WSTATE_MINIMIZED = 00000010b
WSTATE_ROLLEDUP = 00000100b
; structures definition
struc WDATA {
.left dd ?
.top dd ?
.width dd ?
.height dd ?
.cl_workarea dd ?
.cl_titlebar dd ?
.cl_frames dd ?
.reserved db ?
.fl_wstate db ?
.fl_wdrawn db ?
.fl_redraw db ?
}
virtual at 0
WDATA WDATA
end virtual
label WDATA.fl_wstyle byte at 0x13 ; WDATA.cl_workarea+3
struc RECT { struc RECT {
.left dd ? .left dd ?
.top dd ? .top dd ?
@ -120,18 +95,97 @@ virtual at 0
BOX BOX BOX BOX
end virtual end virtual
; constants definition
WSTATE_NORMAL = 00000000b
WSTATE_MAXIMIZED = 00000001b
WSTATE_MINIMIZED = 00000010b
WSTATE_ROLLEDUP = 00000100b
WSTATE_REDRAW = 00000001b
WSTATE_WNDDRAWN = 00000010b
WSTYLE_HASCAPTION = 00010000b
WSTYLE_CLIENTRELATIVE = 00100000b
struc TASKLIST
{
.event_mask dd ?
.pid dd ?
dw ?
.state dw ?
dw ?
.wnd_number db ?
db ?
.mem_start dd ?
.counter_sum dd ?
.counter_add dd ?
.cpu_usage dd ?
}
virtual at 0
TASKLIST TASKLIST
end virtual
; structures definition
struc WDATA {
.box BOX
.cl_workarea dd ?
.cl_titlebar dd ?
.cl_frames dd ?
.reserved db ?
.fl_wstate db ?
.fl_wdrawn db ?
.fl_redraw db ?
}
virtual at 0
WDATA WDATA
end virtual
label WDATA.fl_wstyle byte at 0x13
struc APPDATA
{
.app_name db 11 dup(?)
db 5 dup(?)
.fpu_save_area db 108 dup(?)
db 3 dup(?)
.is_fpu_saved db ?
.wnd_shape dd ?
.wnd_shape_scale dd ?
.gdt dd ?
.mem_size dd ?
.saved_box BOX
.ipc_start dd ?
.ipc_size dd ?
.event_mask dd ?
.debugger_slot dd ?
.int40_handler dd ?
.keyboard_mode db ?
db 3 dup(?)
.dir_table dd ?
.dbg_event_mem dd ?
.dbg_regs:
.dbg_regs.dr0 dd ?
.dbg_regs.dr1 dd ?
.dbg_regs.dr2 dd ?
.dbg_regs.dr3 dd ?
.dbg_regs.dr7 dd ?
.wnd_caption dd ?
.wnd_clientbox BOX
}
virtual at 0
APPDATA APPDATA
end virtual
;// mike.dld, 2006-29-01 ] ;// mike.dld, 2006-29-01 ]
; Core functions ; Core functions
include "core/sync.inc" include "core/sync.inc" ; macros for synhronization objects
include "core/sys32.inc" ; process management include "core/sys32.inc" ; process management
include "core/sched.inc" ; process scheduling include "core/sched.inc" ; process scheduling
include "core/syscall.inc" ; system call include "core/syscall.inc" ; system call
include "core/mem.inc" ; high-level memory management include "core/mem.inc" ; high-level memory management
include "core/newproce.inc" ;new process management include "core/newproce.inc" ;new process management
include "core/physmem.inc" ; access to physical memory for applications include "core/physmem.inc" ; access to physical memory for applications
include "core/sync.inc" ; macros for synhronization objects
; GUI stuff ; GUI stuff
include "gui/window.inc" include "gui/window.inc"