mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-15 19:33:59 +03:00
2ef19ac48c
fix programs info3ds, info3ds_u git-svn-id: svn://kolibrios.org@7616 a494cfbc-eb01-0410-851d-a64ba20cac60
451 lines
9.6 KiB
Plaintext
451 lines
9.6 KiB
Plaintext
;*****************************************************************************
|
|
; Macro for use Open Dialog - for Kolibri OS
|
|
; Copyright (c) 2009-2013, Marat Zakiyanov aka Mario79, aka Mario
|
|
; All rights reserved.
|
|
;
|
|
; Redistribution and use in source and binary forms, with or without
|
|
; modification, are permitted provided that the following conditions are met:
|
|
; * Redistributions of source code must retain the above copyright
|
|
; notice, this list of conditions and the following disclaimer.
|
|
; * Redistributions in binary form must reproduce the above copyright
|
|
; notice, this list of conditions and the following disclaimer in the
|
|
; documentation and/or other materials provided with the distribution.
|
|
; * Neither the name of the <organization> nor the
|
|
; names of its contributors may be used to endorse or promote products
|
|
; derived from this software without specific prior written permission.
|
|
;
|
|
; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY
|
|
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
|
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
;*****************************************************************************
|
|
;---------------------------------------------------------------------
|
|
;Some documentation for memory
|
|
;
|
|
;area name db 'FFFFFFFF_open_dialog',0 ; FFFFFFFF = PID
|
|
;
|
|
; communication area data
|
|
; flag ; +0
|
|
; dw 0 ; 0 - empty, 1 - file for open, 2 -folder for open,
|
|
; 3 - cancel, 4 - path=name of area 6822.
|
|
;
|
|
; type of dialog: 0-Open, 1-Save, 2-Dir
|
|
; dw 0 ; +2
|
|
;
|
|
; window X size ; +4
|
|
; dw 0
|
|
;
|
|
; window X position ; +6
|
|
; dw 0
|
|
;
|
|
; window y size ; +8
|
|
; dw 0
|
|
;
|
|
; window Y position ; +10
|
|
; dw 0
|
|
;
|
|
; OpenDialog WINDOW SLOT ; +12
|
|
; dd 0
|
|
;
|
|
; file_path ; +16
|
|
; rb 3824 ; path to file
|
|
;
|
|
; file name ; +3840
|
|
; rb 256
|
|
;
|
|
; filtration flag ; +4096
|
|
; dd 0 ; flag 0 - no filtration, 1 - filtering
|
|
;
|
|
; area for storage of filtering values ; +4100
|
|
; rb 4092
|
|
;---------------------------------------------------------------------
|
|
;*****************************************************************************
|
|
macro OpenDialog_exit
|
|
{
|
|
popa
|
|
ret 4
|
|
}
|
|
;*****************************************************************************
|
|
macro use_OpenDialog
|
|
{
|
|
OpenDialog:
|
|
od_type equ dword [ebp] ; 0-Open, 1-Save, 2-Dir
|
|
od_procinfo equ dword [ebp+4] ; Process info area for function 9
|
|
od_com_area_name equ dword [ebp+8] ; Name for shared area
|
|
od_com_area equ dword [ebp+12] ; Adress of shared area
|
|
od_opendir_pach equ dword [ebp+16] ; Temp area the directory for show
|
|
od_dir_default_pach equ dword [ebp+20] ; Default path of directory,
|
|
od_start_path equ dword [ebp+24] ; Location path to OpenDialog
|
|
od_draw_window equ dword [ebp+28] ; Adress of procedure - draw_window
|
|
od_status equ dword [ebp+32] ; 0-Cancel, 1-Get path OK, 2-Use alternatives
|
|
od_openfile_pach equ dword [ebp+36] ; Getting path to file
|
|
od_filename_area equ dword [ebp+40] ; Adress of file name area
|
|
od_filter_area equ dword [ebp+44] ; Adress of filter area
|
|
od_x_size equ [ebp+48] ; Window X size
|
|
od_x_start equ [ebp+50] ; Window X position
|
|
od_y_size equ [ebp+52] ; Window y size
|
|
od_y_start equ [ebp+54] ; Window Y position
|
|
;*****************************************************************************
|
|
.init:
|
|
pusha
|
|
mov ebp,dword [esp+36]
|
|
mcall SF_THREAD_INFO,od_procinfo,-1
|
|
mov ebx,[ebx+30]
|
|
mov edi,od_com_area_name
|
|
add edi,7
|
|
std
|
|
mov ecx,4
|
|
@@:
|
|
mov al,bl
|
|
and al,1111b
|
|
add al,0x30
|
|
stosb
|
|
mov al,bl
|
|
shr al,4
|
|
and al,1111b
|
|
add al,0x30
|
|
stosb
|
|
shr ebx,8
|
|
dec ecx
|
|
jnz @r
|
|
cld
|
|
|
|
mcall SF_SYS_MISC,SSF_MEM_OPEN,od_com_area_name,8192,0x09
|
|
mov od_com_area,eax
|
|
|
|
mov esi,od_openfile_pach
|
|
mov edi,od_opendir_pach
|
|
call .copy_dir_path
|
|
|
|
OpenDialog_exit
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
.start:
|
|
pusha
|
|
mov ebp,dword [esp+36]
|
|
|
|
mov eax,od_com_area
|
|
test eax,eax
|
|
jz .1
|
|
mov ebx,od_type
|
|
mov [eax+2],bx
|
|
|
|
mov [eax],word 2 ; folder for open
|
|
|
|
pusha
|
|
mcall SF_THREAD_INFO,od_procinfo,-1
|
|
|
|
mov eax,[ebx+42] ;main window x size
|
|
shr eax,1
|
|
add eax,[ebx+34] ; main window x start
|
|
mov cx,od_x_size
|
|
shr cx,1
|
|
sub ax,cx
|
|
test ax,cx
|
|
test eax,0x8000
|
|
jz @f
|
|
xor eax,eax
|
|
@@:
|
|
mov od_x_start,ax
|
|
|
|
mov eax,[ebx+46] ;main window y size
|
|
shr eax,1
|
|
add eax,[ebx+38] ; main window y start
|
|
mov cx,od_y_size
|
|
shr cx,1
|
|
sub ax,cx
|
|
test eax,0x8000
|
|
jz @f
|
|
xor eax,eax
|
|
@@:
|
|
mov od_y_start,ax
|
|
popa
|
|
|
|
mov ebx,dword od_x_size
|
|
mov [eax+4],ebx
|
|
mov ebx,dword od_y_size
|
|
mov [eax+8],ebx
|
|
|
|
mov edi,eax
|
|
add edi,16 ;12
|
|
|
|
mov esi,od_opendir_pach
|
|
xor eax,eax
|
|
mov al,[esi]
|
|
test eax,eax
|
|
jnz @f
|
|
mov esi,od_dir_default_pach ;communication_area_default_pach
|
|
@@:
|
|
call .copy
|
|
;----------------------------------------------
|
|
; copy file name to shared area
|
|
cmp od_type,dword 2
|
|
je .4
|
|
mov edi,od_com_area
|
|
add edi,3840 ;4096-256
|
|
|
|
mov esi,od_filename_area
|
|
test esi,esi
|
|
jnz @f
|
|
xor eax,eax
|
|
mov [edi],eax
|
|
jmp .4
|
|
@@:
|
|
call .copy
|
|
.4:
|
|
;----------------------------------------------
|
|
cmp od_type,dword 2
|
|
je @f
|
|
call .get_filter_data
|
|
@@:
|
|
;----------------------------------------------
|
|
mov ebx,od_procinfo
|
|
xor eax,eax
|
|
mov edi,ebx
|
|
mov ecx,6
|
|
cld
|
|
rep stosd
|
|
mov [ebx],dword 7
|
|
mov eax,od_com_area_name
|
|
mov [ebx+8],eax
|
|
mov eax,od_start_path
|
|
mov [ebx+21],eax
|
|
mcall SF_FILE
|
|
|
|
shr eax,31
|
|
test eax,eax
|
|
jnz .1
|
|
;----------------------------------------------
|
|
.still:
|
|
; The main window of application sometimes
|
|
; is not present the really. For this reason
|
|
; not use func 10 and 23, because event 1
|
|
; is not cleared without call of func 0.
|
|
; In this case is suitable only func 5 and 11,
|
|
; or 68.1 and 11 for better response.
|
|
mcall SF_SYS_MISC,SSF_SWITCH_TASK
|
|
mcall SF_SLEEP,10 ; because OS uses a new scheduler for kernel(SVN r.3534)
|
|
mcall SF_CHECK_EVENT
|
|
cmp eax,1
|
|
je .draw
|
|
cmp eax,2
|
|
je .key
|
|
cmp eax,3
|
|
je .button
|
|
jmp .no_draw
|
|
.key:
|
|
mcall SF_GET_KEY
|
|
jmp .no_draw
|
|
.button:
|
|
mcall SF_GET_BUTTON
|
|
jmp .no_draw
|
|
;----------------------------------------------
|
|
.draw:
|
|
pusha
|
|
call od_draw_window
|
|
popa
|
|
;----------------------------------------------
|
|
pusha
|
|
call .prepare_PID
|
|
jz @f
|
|
|
|
mov ecx,eax ; WINDOW SLOT
|
|
mcall SF_SYSTEM,SSF_GET_ACTIVE_WINDOW
|
|
cmp eax,ecx ; compare ACTIVE and WINDOW SLOT
|
|
jne @f
|
|
|
|
mov eax,od_com_area
|
|
mov ecx,[eax+12]
|
|
test ecx,ecx
|
|
jz @f
|
|
mcall SF_SYSTEM,SSF_FOCUS_WINDOW
|
|
@@:
|
|
popa
|
|
;----------------------------------------------
|
|
.no_draw:
|
|
mov eax,od_com_area
|
|
movzx ebx,word [eax]
|
|
test ebx,ebx
|
|
jz .still
|
|
cmp ebx,3
|
|
je .2
|
|
cmp ebx,1
|
|
jne .still
|
|
|
|
mov esi,od_com_area
|
|
add esi,16 ;12
|
|
mov edi,od_openfile_pach
|
|
call .copy
|
|
mov od_status,1
|
|
|
|
mov esi,od_openfile_pach
|
|
mov edi,od_opendir_pach
|
|
call .copy_dir_path
|
|
;----------------------------------------------
|
|
; copy file name from shared area
|
|
cmp od_type,dword 2
|
|
je @f
|
|
mov esi,od_com_area
|
|
add esi,3840
|
|
mov edi,od_filename_area
|
|
test edi,edi
|
|
jz @f
|
|
call .copy
|
|
@@:
|
|
;----------------------------------------------
|
|
jmp .3
|
|
.2:
|
|
mov od_status,0
|
|
jmp .3
|
|
.1:
|
|
mov od_status,2
|
|
.3:
|
|
mov eax,od_com_area
|
|
mov ebx,[eax+4]
|
|
mov od_x_size,ebx
|
|
mov ebx,[eax+8]
|
|
mov od_y_size, ebx
|
|
|
|
call .prepare_PID
|
|
jz @f
|
|
mov ecx,eax ; WINDOW SLOT
|
|
mcall SF_SYSTEM,SSF_FOCUS_WINDOW
|
|
@@:
|
|
OpenDialog_exit
|
|
;----------------------------------------------
|
|
.prepare_PID:
|
|
mcall SF_THREAD_INFO,od_procinfo,-1
|
|
mov ecx,[ebx+30] ; PID
|
|
mcall SF_SYSTEM,SSF_GET_THREAD_SLOT
|
|
test eax,eax
|
|
ret
|
|
;----------------------------------------------
|
|
.get_filter_data:
|
|
mov edi,od_com_area
|
|
test edi,edi
|
|
jnz @f
|
|
ret
|
|
@@:
|
|
add edi,4100
|
|
mov esi,od_filter_area
|
|
mov ecx,[esi]
|
|
test ecx,ecx
|
|
jnz @f
|
|
mov edi,od_com_area
|
|
mov [edi+4096],dword 0
|
|
ret
|
|
@@:
|
|
cmp ecx,4091 ;max filter len = 8192-4100-1
|
|
jle @f
|
|
;todo ... error message: corrypt filter
|
|
mov edi,od_com_area
|
|
mov [edi+4096],dword 0
|
|
ret
|
|
@@:
|
|
inc ecx
|
|
cld
|
|
rep movsb
|
|
mov edi,od_com_area
|
|
mov [edi+4096],dword 1
|
|
ret
|
|
;----------------------------------------------
|
|
.copy:
|
|
xor eax,eax
|
|
cld
|
|
@@:
|
|
lodsb
|
|
stosb
|
|
test eax,eax
|
|
jnz @b
|
|
ret
|
|
;----------------------------------------------
|
|
.copy_dir_path:
|
|
xor eax,eax
|
|
cmp [esi],al
|
|
jne @f
|
|
mov [edi],al
|
|
mov [ebx],al
|
|
xor ebx,ebx
|
|
inc ebx
|
|
ret
|
|
@@:
|
|
cld
|
|
lodsb
|
|
stosb
|
|
test eax,eax
|
|
jnz @b
|
|
cmp od_type,dword 2
|
|
jne @f
|
|
ret
|
|
@@:
|
|
mov esi,edi
|
|
dec esi
|
|
@@:
|
|
std
|
|
lodsb
|
|
cmp al,'/'
|
|
jnz @b
|
|
|
|
mov [esi+1],byte 0
|
|
cld
|
|
ret
|
|
;----------------------------------------------
|
|
align 4
|
|
.set_file_name:
|
|
push ebp
|
|
mov ebp,esp
|
|
push eax ecx edi esi
|
|
mov edi,[ebp+8] ;open dlg struct
|
|
mov edi,[edi+40] ;+40 - filename_area
|
|
mov esi,[ebp+12] ;file name
|
|
mov ecx,256
|
|
;copy file name in dialog
|
|
@@:
|
|
lodsb
|
|
stosb
|
|
test eax,eax
|
|
loop @b
|
|
pop esi edi ecx eax
|
|
pop ebp
|
|
ret 8
|
|
;----------------------------------------------
|
|
align 4
|
|
.set_file_ext:
|
|
push ebp
|
|
mov ebp,esp
|
|
push eax ecx edi esi
|
|
mov esi,[ebp+8] ;open dlg struct
|
|
|
|
xor eax,eax
|
|
mov ecx,256
|
|
mov edi,[esi+40] ;+40 - filename_area
|
|
repne scasb
|
|
@@: ;found position of '.'
|
|
dec edi
|
|
cmp byte[edi],'.'
|
|
je @f
|
|
cmp edi,[esi+40]
|
|
ja @b
|
|
jmp .no_dot
|
|
@@:
|
|
inc edi
|
|
mov esi,[ebp+12] ;file ext
|
|
;copy file ext in dialog
|
|
@@:
|
|
lodsb
|
|
stosb
|
|
test eax,eax
|
|
jnz @b
|
|
|
|
.no_dot:
|
|
pop esi edi ecx eax
|
|
pop ebp
|
|
ret 8
|
|
}
|
|
;***************************************************************************** |