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

@@ -69,7 +69,10 @@ dd servetable-0x10000
draw_line dd __sys_draw_line
disable_mouse dd __sys_disable_mouse
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
; } mike.dld
@@ -2856,9 +2859,10 @@ sys_drawwindow:
call sys_set_window
call [disable_mouse]
call drawwindow_I
dec [mouse_pause]
call [draw_pointer]
ret
;dec [mouse_pause]
;call [draw_pointer]
;ret
jmp draw_window_caption.2
nosyswI:
cmp edi,1 ; type II - only reserve area, no draw
@@ -2880,9 +2884,10 @@ sys_drawwindow:
call sys_set_window
call [disable_mouse]
call drawwindow_III
dec [mouse_pause]
call [draw_pointer]
ret
;dec [mouse_pause]
;call [draw_pointer]
;ret
jmp draw_window_caption.2
nosyswIII:
cmp edi,3 ; type IV - skinned window
@@ -2902,14 +2907,176 @@ sys_drawwindow:
call sys_set_window
call [disable_mouse]
call drawwindow_IV
dec [mouse_pause]
call [draw_pointer]
ret
;dec [mouse_pause]
;call [draw_pointer]
;ret
jmp draw_window_caption.2
nosyswIV:
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:
mov edi,[0x3000]
@@ -2917,12 +3084,14 @@ sys_set_window:
add edi,window_data
; colors
mov [edi+16],ecx
mov [edi+20],edx
mov [edi+24],esi
mov [edi+WDATA.cl_workarea],ecx
mov [edi+WDATA.cl_titlebar],edx
mov [edi+WDATA.cl_frames],esi
call set_window_clientbox
; check flag (?)
cmp [edi+30],byte 1
cmp [edi+WDATA.fl_wdrawn],1
jz newd
push eax
@@ -2931,23 +3100,33 @@ sys_set_window:
mov [new_window_starting],eax
pop eax
mov [edi+8],ax
mov [edi+12],bx
shr eax,16
shr ebx,16
mov [edi+00],ax
mov [edi+04],bx
mov word[edi+WDATA.box.width],ax
mov word[edi+WDATA.box.height],bx
sar eax,16
sar ebx,16
mov word[edi+WDATA.box.left],ax
mov word[edi+WDATA.box.top],bx
call check_window_position
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
shr edi,5
shl edi,8
shl edi,3
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
cld
rep movsd
@@ -2974,6 +3153,45 @@ sys_set_window:
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:
@@ -3966,6 +4184,13 @@ sys_putimage:
.exit:
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
cmp [0xfe0c], word 0x12
jz .doit
@@ -3989,6 +4214,13 @@ sys_putimage:
; edi color
__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]
cmp [0xfe0c],word 0x12
jne sdbv20
@@ -4667,8 +4899,12 @@ syscall_setpixel: ; SetPixel
mov edx,[0x3010]
add eax,[edx-twdw]
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
;mov edi,1
; mov edi,1
call [disable_mouse]
jmp [putpixel]
@@ -4678,8 +4914,12 @@ syscall_writetext: ; WriteText
mov edi,[0x3010]
mov ebp,[edi-twdw]
mov esi,[0x3000]
shl esi,8
add ebp,[esi+0x80000+APPDATA.wnd_clientbox.left]
shl ebp,16
add ebp,[edi-twdw+4]
add bp,word[esi+0x80000+APPDATA.wnd_clientbox.top]
add edi,0x10
add ecx,[edi]
add eax,ebp
@@ -4714,6 +4954,10 @@ syscall_drawrect: ; DrawRect
shr eax,16
movzx edx,bx
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 edx,ebx
jmp [drawbar]
@@ -4838,11 +5082,17 @@ syscall_drawline: ; DrawLine
mov edi,[0x3010]
movzx edx,word[edi-twdw]
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
add ebp,edx
movzx edx,word[edi-twdw+4]
add eax,ebp
mov ebp,edx
add ebp,[esi+0x80000+APPDATA.wnd_clientbox.top]
add dx,word[esi+0x80000+APPDATA.wnd_clientbox.top]
shl edx,16
xor edi,edi
add edx,ebp