forked from KolibriOS/kolibrios
333b0bbae6
2) Detection PS2 mouse. 3) Switching FPU in PM with reset. 4) Click on the application button - works only if during release of a up-button mouse the cursor is on the button application. Realization Victor Alberto Gil Hanla (vhanla). Version 1.1 5) Return of focus (activated window) on previous application at completion of the active application 6) Change skin of header of windows type 4, at loss and return of focus (activated window). git-svn-id: svn://kolibrios.org@33 a494cfbc-eb01-0410-851d-a64ba20cac60
460 lines
11 KiB
PHP
460 lines
11 KiB
PHP
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; ;;
|
|
;; WINDOW SKIN for MenuetOS ;;
|
|
;; ;;
|
|
;; entryway@bkg.lt ;;
|
|
;; ;;
|
|
;; Bugfixes & upgrades by ;;
|
|
;; Samuel Rodriguez Perez ;;
|
|
;; Xeoda@ciberirmandade.org ;;
|
|
;; ;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
|
|
|
include "skindata.inc"
|
|
|
|
virtual at 0
|
|
bmp_header:
|
|
.type rw 1 ; "BM" signature
|
|
.filesize rd 1 ; size of the file
|
|
.reserved rd 1 ; zero
|
|
.offbits rd 1 ; pointer to image data
|
|
;----------------
|
|
.headsize rd 1 ; usually 40 bytes for image header
|
|
.width rd 1
|
|
.height rd 1
|
|
.planes rw 1 ; usually 1
|
|
.bitcount rw 1 ; currently 24 bits/pixel (0x18)
|
|
.compress rd 1 ; zero
|
|
.sizeimage rd 1 ; x*y*(bitcount/8)
|
|
.unused rd 4 ; these bits aren't used by MeOS
|
|
bmp_data:
|
|
end virtual
|
|
|
|
virtual at 0x778000
|
|
_bmp_bpl dd ? ; bytes per line
|
|
_bmp_dpl dd ? ; dwords per line
|
|
_bmp_zb dd ? ; bytes filled by zeroes at the end of a scanline
|
|
align 32
|
|
raw_data:
|
|
end virtual
|
|
|
|
bmp2raw:
|
|
; esi = to bmp data (source)
|
|
; edi = to raw data (destination)
|
|
cmp [esi+bmp_header.type],'BM' ; check if bmp file is really loaded
|
|
jne .finish
|
|
mov edx,esi
|
|
|
|
mov eax,[edx+bmp_header.width]
|
|
imul eax,3
|
|
push eax
|
|
test eax,11b
|
|
jz @f
|
|
add eax,4
|
|
@@:
|
|
shr eax,2
|
|
mov [_bmp_dpl],eax
|
|
shl eax,2
|
|
mov [_bmp_bpl],eax
|
|
pop ebx
|
|
sub eax,ebx
|
|
mov [_bmp_zb],eax
|
|
|
|
add esi,bmp_data
|
|
mov eax,[_bmp_bpl]
|
|
imul eax,[edx+bmp_header.height]
|
|
add esi,eax
|
|
mov ebx,[edx+bmp_header.height] ; ebx = y
|
|
cld
|
|
.y_begin:
|
|
sub esi,[_bmp_bpl]
|
|
push esi
|
|
mov ecx,[_bmp_dpl]
|
|
rep movsd
|
|
pop esi
|
|
sub edi,[_bmp_zb]
|
|
dec ebx
|
|
jne .y_begin
|
|
|
|
.finish:
|
|
ret
|
|
|
|
|
|
; BMP support by Ivan Poddubny
|
|
; 1) load LEFT.BMP
|
|
; a) _skinleftw = bmp_width
|
|
; b) _skinleft = 0
|
|
; c) _refleft = 0x778000
|
|
; d) convert
|
|
; 2) load BASE.BMP
|
|
; a) _skinbasew = bmp_width
|
|
; b) _skinbase = _skinleftw
|
|
; c) _refbase = _refleft+sizeof(left_raw_converted)
|
|
; d) convert
|
|
; 3) load OPER.BMP
|
|
; a) _skinoper = minus width from bmp file
|
|
; b) _skinoperw = width from bmp file
|
|
; c) _refoper = _refbase+sizeof(oper_raw_converted)
|
|
; d) convert
|
|
; 4) set height
|
|
|
|
load_bmp_file:
|
|
; eax = pointer to filename
|
|
mov ebx, 1
|
|
or ecx, -1
|
|
mov edx, 0x90000
|
|
mov esi, 12
|
|
call fileread
|
|
ret
|
|
|
|
|
|
load_default_skin:
|
|
pushad
|
|
mov eax, _fileleft
|
|
call load_bmp_file
|
|
mov eax, [0x90000+bmp_header.width]
|
|
mov [_skinleftw], eax
|
|
mov [_skinleft], 0
|
|
mov edi, raw_data
|
|
mov [_refleft], edi
|
|
mov esi, 0x90000
|
|
call bmp2raw
|
|
mov eax, [_bmp_bpl]
|
|
imul eax, [0x90000+bmp_header.height]
|
|
push eax
|
|
|
|
mov eax, _filebase
|
|
call load_bmp_file
|
|
mov eax, [0x90000+bmp_header.width]
|
|
mov [_skinbasew], eax
|
|
mov eax, [_skinleftw]
|
|
mov [_skinbase], eax
|
|
pop eax
|
|
add eax, [_refleft]
|
|
; align to 32-byte boundary
|
|
test eax, 11111b
|
|
jz @f
|
|
shr eax, 5
|
|
inc eax
|
|
shl eax, 5
|
|
@@:
|
|
; save base address
|
|
mov [_refbase], eax
|
|
; convert
|
|
mov edi, eax
|
|
mov esi, 0x90000
|
|
call bmp2raw
|
|
mov eax, [_bmp_bpl]
|
|
imul eax, [0x90000+bmp_header.height]
|
|
push eax
|
|
|
|
mov eax, _fileoper
|
|
call load_bmp_file
|
|
mov eax, [0x90000+bmp_header.width]
|
|
mov [_skinoperw], eax
|
|
neg eax
|
|
mov [_skinoper], eax
|
|
pop eax
|
|
add eax, [_refbase]
|
|
; align to 32-byte boundary
|
|
test eax, 11111b
|
|
jz @f
|
|
shr eax, 5
|
|
inc eax
|
|
shl eax, 5
|
|
@@:
|
|
mov [_refoper], eax
|
|
mov edi, eax
|
|
mov esi, 0x90000
|
|
call bmp2raw
|
|
mov eax, [0x90000+bmp_header.height]
|
|
mov [_skinh], eax
|
|
popad
|
|
|
|
ret
|
|
|
|
load_default_skin_1:
|
|
pushad
|
|
mov eax, _fileleft_1
|
|
call load_bmp_file
|
|
mov eax, [0x90000+bmp_header.width]
|
|
mov [_skinleftw], eax
|
|
mov [_skinleft_1], 0
|
|
mov edi, raw_data+1000h
|
|
mov [_refleft_1], edi
|
|
mov esi, 0x90000
|
|
call bmp2raw
|
|
mov eax, [_bmp_bpl]
|
|
imul eax, [0x90000+bmp_header.height]
|
|
push eax
|
|
|
|
mov eax, _filebase_1
|
|
call load_bmp_file
|
|
mov eax, [0x90000+bmp_header.width]
|
|
mov [_skinbasew], eax
|
|
mov eax, [_skinleftw]
|
|
mov [_skinbase], eax
|
|
pop eax
|
|
add eax, [_refleft_1]
|
|
; align to 32-byte boundary
|
|
test eax, 11111b
|
|
jz @f
|
|
shr eax, 5
|
|
inc eax
|
|
shl eax, 5
|
|
@@:
|
|
; save base address
|
|
mov [_refbase_1], eax
|
|
; convert
|
|
mov edi, eax
|
|
mov esi, 0x90000
|
|
call bmp2raw
|
|
mov eax, [_bmp_bpl]
|
|
imul eax, [0x90000+bmp_header.height]
|
|
push eax
|
|
|
|
mov eax, _fileoper_1
|
|
call load_bmp_file
|
|
mov eax, [0x90000+bmp_header.width]
|
|
mov [_skinoperw], eax
|
|
neg eax
|
|
mov [_skinoper], eax
|
|
pop eax
|
|
add eax, [_refbase_1]
|
|
; align to 32-byte boundary
|
|
test eax, 11111b
|
|
jz @f
|
|
shr eax, 5
|
|
inc eax
|
|
shl eax, 5
|
|
@@:
|
|
mov [_refoper_1], eax
|
|
mov edi, eax
|
|
mov esi, 0x90000
|
|
call bmp2raw
|
|
mov eax, [0x90000+bmp_header.height]
|
|
mov [_skinh], eax
|
|
popad
|
|
ret
|
|
|
|
drawwindow_IV:
|
|
|
|
pusha
|
|
|
|
push edx
|
|
|
|
mov edi,[esp] ; RECTANGLE
|
|
|
|
mov eax,[edi+0]
|
|
shl eax,16
|
|
mov ax,[edi+0]
|
|
add ax,[edi+8]
|
|
mov ebx,[edi+4]
|
|
shl ebx,16
|
|
mov bx,[edi+4]
|
|
add bx,[edi+12]
|
|
; mov esi,[edi+24]
|
|
; shr esi,1
|
|
; and esi,0x007f7f7f
|
|
mov esi,[_coloroutborder]
|
|
call draw_rectangle
|
|
mov ecx,3
|
|
_dw3l:
|
|
add eax,1*65536-1
|
|
add ebx,1*65536-1
|
|
test ax,ax
|
|
js no_skin_add_button
|
|
test bx,bx
|
|
js no_skin_add_button
|
|
mov esi,[_colorframe] ;[edi+24]
|
|
call draw_rectangle
|
|
dec ecx
|
|
jnz _dw3l
|
|
mov esi,[_colorborder]
|
|
add eax,1*65536-1
|
|
add ebx,1*65536-1
|
|
test ax,ax
|
|
js no_skin_add_button
|
|
test bx,bx
|
|
js no_skin_add_button
|
|
call draw_rectangle
|
|
|
|
mov esi,[esp]
|
|
mov eax,[esi+8] ; window width
|
|
mov edx,[_skinleft]
|
|
shl edx,16
|
|
mov ecx,[_skinleftw]
|
|
shl ecx,16
|
|
add ecx,[_skinh]
|
|
|
|
cmp [aw_yes],1
|
|
; cmp [esp+32+4+2], word 1
|
|
jne @f
|
|
mov ebx,[_refleft]
|
|
jmp no_aw_3
|
|
@@:
|
|
mov ebx,[_refleft_1]
|
|
no_aw_3:
|
|
call sys_putimage
|
|
|
|
mov esi,[esp]
|
|
mov eax,[esi+8]
|
|
sub eax,[_skinleftw]
|
|
sub eax,[_skinoperw]
|
|
cmp eax,[_skinbase]
|
|
jng non_base
|
|
xor edx,edx
|
|
mov ebx,[_skinbasew]
|
|
div ebx
|
|
|
|
inc eax
|
|
|
|
cmp [aw_yes],1
|
|
; cmp [esp+32+4+2], word 1
|
|
jne @f
|
|
mov ebx,[_refbase]
|
|
jmp no_aw_2
|
|
@@:
|
|
mov ebx,[_refbase_1]
|
|
no_aw_2:
|
|
mov ecx,[_skinbasew]
|
|
shl ecx,16
|
|
add ecx,[_skinh]
|
|
mov edx,[_skinbase]
|
|
sub edx,[_skinbasew]
|
|
shl edx,16
|
|
baseskinloop:
|
|
shr edx,16
|
|
add edx,[_skinbasew]
|
|
shl edx,16
|
|
|
|
push eax ebx ecx edx
|
|
call sys_putimage
|
|
pop edx ecx ebx eax
|
|
|
|
dec eax
|
|
jnz baseskinloop
|
|
non_base:
|
|
|
|
mov esi,[esp]
|
|
mov edx,[esi+8]
|
|
sub edx,[_skinoperw]
|
|
inc edx
|
|
shl edx,16
|
|
cmp [aw_yes],1
|
|
; cmp [esp+32+4+2], word 1
|
|
jne @f
|
|
mov ebx,[_refoper]
|
|
jmp no_aw_1
|
|
@@:
|
|
mov ebx,[_refoper_1]
|
|
no_aw_1:
|
|
mov ecx,[_skinoperw]
|
|
shl ecx,16
|
|
add ecx,[_skinh]
|
|
call sys_putimage
|
|
|
|
mov esi,[esp]
|
|
|
|
mov edx,[esi+04] ; WORK AREA
|
|
add edx,21+5
|
|
mov ebx,[esi+04]
|
|
add ebx,[esi+12]
|
|
cmp edx,ebx
|
|
jg _noinside2
|
|
mov eax,5
|
|
mov ebx,[_skinh]
|
|
mov ecx,[esi+8]
|
|
mov edx,[esi+12]
|
|
sub ecx,4
|
|
sub edx,4
|
|
mov edi,[esi+16]
|
|
call [drawbar]
|
|
_noinside2:
|
|
|
|
mov edi,[0xfe88]
|
|
movzx eax,word [edi]
|
|
cmp eax,1000
|
|
jge no_skin_add_button
|
|
inc eax
|
|
mov [edi],ax
|
|
|
|
shl eax,4
|
|
add eax,edi
|
|
|
|
mov bx,[0x3000]
|
|
mov [eax],bx
|
|
|
|
add eax,2 ; save button id number
|
|
mov bx,1
|
|
mov [eax],bx
|
|
add eax,2 ; x start
|
|
mov ebx,[esp]
|
|
mov ebx,[ebx+8]
|
|
cmp [_buttonCx],0
|
|
jg _bCx_at_right
|
|
mov ebx,[_buttonCw] ; ebx will be 0 in next instruction
|
|
_bCx_at_right:
|
|
sub ebx,[_buttonCw]
|
|
sub ebx,[_buttonCx]
|
|
mov [eax],bx
|
|
add eax,2 ; x size
|
|
mov ebx,[_buttonCw]
|
|
mov [eax],bx
|
|
add eax,2 ; y start
|
|
mov ebx,[_buttonCy]
|
|
mov [eax],bx
|
|
add eax,2 ; y size
|
|
mov ebx,[_buttonCh]
|
|
mov [eax],bx
|
|
|
|
;* minimize button
|
|
mov edi,[0xfe88]
|
|
movzx eax,word [edi]
|
|
cmp eax,1000
|
|
jge no_skin_add_button
|
|
inc eax
|
|
mov [edi],ax
|
|
|
|
shl eax,4
|
|
add eax,edi
|
|
|
|
mov bx,[0x3000]
|
|
mov [eax],bx
|
|
|
|
add eax,2 ; save button id number
|
|
mov bx,65535 ;999
|
|
mov [eax],bx
|
|
add eax,2 ; x start
|
|
mov ebx,[esp]
|
|
mov ebx,[ebx+8]
|
|
cmp [_buttonMx],0
|
|
jg _bMx_at_right
|
|
mov ebx,[_buttonMw] ; ebx will be 0 in next instruction
|
|
_bMx_at_right:
|
|
sub ebx,[_buttonMw]
|
|
sub ebx,[_buttonMx]
|
|
mov [eax],bx
|
|
add eax,2 ; x size
|
|
mov ebx,[_buttonMw]
|
|
mov [eax],bx
|
|
add eax,2 ; y start
|
|
mov ebx,[_buttonMy]
|
|
mov [eax],bx
|
|
add eax,2 ; y size
|
|
mov ebx,[_buttonMh]
|
|
mov [eax],bx
|
|
;* minimize button
|
|
|
|
no_skin_add_button:
|
|
|
|
add esp,4
|
|
popa
|
|
|
|
ret
|
|
|
|
|