mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-29 01:39:41 +03:00
510e1e65a4
Added program 'Run with OpenDialog' git-svn-id: svn://kolibrios.org@3478 a494cfbc-eb01-0410-851d-a64ba20cac60
700 lines
16 KiB
NASM
700 lines
16 KiB
NASM
; Run with OpenDialog ;
|
|
; this source can be compiled ;
|
|
; with FASM or NASM ;
|
|
|
|
org 0
|
|
use32
|
|
|
|
STACK_SIZE equ 256
|
|
REDRAW_EVENT equ 1
|
|
KEY_EVENT equ 2
|
|
BUTTON_EVENT equ 3
|
|
MOUSE_EVENT equ 6
|
|
|
|
BUTTON_RUN equ 10
|
|
BUTTON_BROWSE equ 20
|
|
|
|
MENUET01 db 'MENUET01'
|
|
version dd 1
|
|
program.start dd start_
|
|
program.end dd end_
|
|
program.memory dd end_ + STACK_SIZE
|
|
program.stack dd end_ + STACK_SIZE
|
|
program.params dd 0
|
|
program.path dd 0
|
|
|
|
; ======================================================================= ;
|
|
start_:
|
|
; set.event
|
|
mov eax, 40
|
|
mov ebx, 39
|
|
int 64
|
|
|
|
push sz_box_lib
|
|
call load.library
|
|
mov [box_lib], eax
|
|
|
|
push dword[box_lib]
|
|
push sz_edit_box
|
|
call getprocaddress
|
|
mov [edit_box_draw], eax
|
|
|
|
push dword[box_lib]
|
|
push sz_edit_box_key
|
|
call getprocaddress
|
|
mov [edit_box_key], eax
|
|
|
|
push dword[box_lib]
|
|
push sz_edit_box_mouse
|
|
call getprocaddress
|
|
mov [edit_box_mouse], eax
|
|
|
|
push dword[box_lib]
|
|
push sz_edit_box_set_text
|
|
call getprocaddress
|
|
mov [edit_box_set_text], eax
|
|
|
|
push sz_proc_lib
|
|
call load.library
|
|
mov [proc_lib], eax
|
|
|
|
push dword[proc_lib]
|
|
push sz_OpenDialog_init
|
|
call getprocaddress
|
|
mov [opendialog_init], eax
|
|
|
|
push dword[proc_lib]
|
|
push sz_OpenDialog_start
|
|
call getprocaddress
|
|
mov [opendialog_start], eax
|
|
|
|
|
|
; memory.allocate:
|
|
mov eax, 68
|
|
mov ebx, 12
|
|
mov ecx, 4096 + 4096 + 4096
|
|
int 64
|
|
|
|
mov [od.procinfo], eax
|
|
|
|
add eax, 1024
|
|
mov [od.filename_area], eax
|
|
|
|
add eax, 4096 - 1024
|
|
mov [od.opendir_path], eax
|
|
|
|
add eax, 4096
|
|
mov [od.openfile_path], eax
|
|
|
|
push od
|
|
call [opendialog_init]
|
|
|
|
|
|
; get.screen.size
|
|
mov eax, 61
|
|
mov ebx, 1
|
|
int 64
|
|
|
|
mov [screen], eax
|
|
movzx eax, word[screen.width]
|
|
shr eax, 3
|
|
lea eax, [eax*2 + eax]
|
|
add eax, 72
|
|
mov [window.width], eax
|
|
|
|
; skin.height
|
|
mov eax, 48
|
|
mov ebx, 4
|
|
int 64
|
|
|
|
add eax, 64
|
|
mov [window.height], eax
|
|
|
|
movzx eax, word[screen.width]
|
|
sub eax, [window.width]
|
|
shr eax, 1
|
|
mov [window.left], eax
|
|
|
|
movzx eax, word[screen.height]
|
|
sub eax, [window.height]
|
|
sub eax, 24
|
|
mov [window.top], eax
|
|
|
|
mov eax, [window.width]
|
|
sub eax, 20
|
|
mov [edit1.width], eax
|
|
|
|
mov eax, [od.openfile_path]
|
|
mov [edit1.text], eax
|
|
|
|
|
|
call on_redraw
|
|
; ----------------------- ;
|
|
.loop:
|
|
; wait.event
|
|
mov eax, 10
|
|
int 64
|
|
cmp eax, REDRAW_EVENT
|
|
jne .check_key
|
|
call on_redraw
|
|
jmp .loop
|
|
; ----------------------- ;
|
|
.check_key:
|
|
cmp eax, KEY_EVENT
|
|
jne .check_button
|
|
mov eax, 2
|
|
int 64
|
|
cmp ah, 13
|
|
jne .no_key_enter
|
|
call on_button_run
|
|
jmp .loop
|
|
; ----------------------- ;
|
|
.no_key_enter:
|
|
push edit1
|
|
call [edit_box_key]
|
|
jmp .loop
|
|
; ----------------------- ;
|
|
.check_button:
|
|
cmp eax, BUTTON_EVENT
|
|
jne .check_mouse
|
|
; get.button.number
|
|
mov eax, 17
|
|
int 64
|
|
cmp ah, 1
|
|
jne .check_button_run
|
|
; program.terminate
|
|
or eax, -1
|
|
int 64
|
|
; ----------------------- ;
|
|
.check_button_run:
|
|
cmp ah, BUTTON_RUN
|
|
jne .check_button_browse
|
|
call on_button_run
|
|
jmp .loop
|
|
; ----------------------- ;
|
|
.check_button_browse:
|
|
cmp ah, BUTTON_BROWSE
|
|
jne .loop
|
|
call on_button_browse
|
|
jmp .loop
|
|
; ----------------------- ;
|
|
.check_mouse:
|
|
cmp eax, MOUSE_EVENT
|
|
jne .loop
|
|
push edit1
|
|
call [edit_box_mouse]
|
|
jmp .loop
|
|
|
|
|
|
; ======================================================================= ;
|
|
on_button_run:
|
|
push dword[edit1.text]
|
|
call extractrunpathandparams
|
|
|
|
;file.run:
|
|
mov eax, 70
|
|
mov ebx, file_info
|
|
int 64
|
|
|
|
mov dl, byte[lastendpath]
|
|
mov ecx, [ptrlastendpath]
|
|
mov [ecx], dl
|
|
|
|
test eax, eax
|
|
jnge .error
|
|
mov [runresult], dword sz_Program_run_successfully
|
|
jmp .exit
|
|
|
|
.error:
|
|
; ----------------------- ;
|
|
.5:
|
|
cmp al, -5
|
|
jne .31
|
|
mov [runresult], dword sz_File_not_found
|
|
jmp .exit
|
|
; ----------------------- ;
|
|
.31:
|
|
cmp al, -31
|
|
jne .32
|
|
mov [runresult], dword sz_File_is_not_executable
|
|
jmp .exit
|
|
; ----------------------- ;
|
|
.32:
|
|
cmp al, -32
|
|
jne .10
|
|
mov [runresult], dword sz_Too_many_processes
|
|
jmp .exit
|
|
; ----------------------- ;
|
|
.10:
|
|
cmp al, -10
|
|
jne .30
|
|
mov [runresult], dword sz_Access_denied
|
|
jmp .exit
|
|
; ----------------------- ;
|
|
.30:
|
|
cmp al, -30
|
|
jne .unknown
|
|
mov [runresult], dword sz_Out_of_memory
|
|
jmp .exit
|
|
; ----------------------- ;
|
|
.unknown:
|
|
mov [runresult], dword sz_Unknown_error
|
|
; ----------------------- ;
|
|
.exit:
|
|
call on_redraw
|
|
ret
|
|
|
|
; ======================================================================= ;
|
|
on_button_browse:
|
|
push od
|
|
call [opendialog_start]
|
|
|
|
mov eax, [od.status]
|
|
test eax, eax
|
|
je .exit
|
|
|
|
;======== if space exist in filepath, then quote filepath
|
|
mov eax, [od.openfile_path]
|
|
; ----------------------- ;
|
|
.check_space:
|
|
cmp [eax], byte 0
|
|
je .no_space
|
|
cmp [eax], byte 32 ;space
|
|
je .space
|
|
inc eax
|
|
jmp .check_space
|
|
.space:
|
|
; ----------------------- ;
|
|
.find_end_zero:
|
|
inc eax
|
|
cmp [eax], byte 0
|
|
jne .find_end_zero
|
|
mov [eax + 2], byte 0
|
|
mov [eax + 1], byte 34 ; quote
|
|
; ----------------------- ;
|
|
.shift_path:
|
|
dec eax
|
|
|
|
mov dl, byte [eax ]
|
|
mov [eax + 1], dl
|
|
|
|
cmp eax, [od.openfile_path]
|
|
jne .shift_path
|
|
mov [eax ], byte 34 ; quote
|
|
|
|
.no_space:
|
|
;=================================
|
|
|
|
push dword[od.openfile_path]
|
|
push edit1
|
|
call [edit_box_set_text]
|
|
; ----------------------- ;
|
|
.exit:
|
|
ret
|
|
|
|
|
|
; ======================================================================= ;
|
|
on_redraw:
|
|
; redraw.start
|
|
mov eax, 12
|
|
mov ebx, 1
|
|
int 64
|
|
; get.standart.colors
|
|
mov eax, 48
|
|
mov ebx, 3
|
|
mov ecx, sc
|
|
mov edx, 40
|
|
int 64
|
|
|
|
mov eax, [sc.work_graph]
|
|
mov [edit1.shift_color], eax
|
|
|
|
mov eax, [sc.work_graph]
|
|
mov [edit1.focus_border_color], eax
|
|
|
|
mov eax, [sc.frames]
|
|
mov [edit1.blur_border_color], eax
|
|
|
|
mov eax, [sc.work_text]
|
|
mov [edit1.text_color], eax
|
|
|
|
; draw.window
|
|
xor eax, eax
|
|
mov ebx, [window.left]
|
|
shl ebx, 16
|
|
add ebx, [window.width]
|
|
mov ecx, [window.top]
|
|
shl ecx, 16
|
|
add ecx, [window.height]
|
|
mov edx, [sc.work]
|
|
or edx, 34000000h
|
|
mov edi, sz_run
|
|
int 64
|
|
|
|
mov eax, [window.width]
|
|
sub eax, 318
|
|
shr eax, 1
|
|
sub eax, 5
|
|
push eax
|
|
push 5
|
|
push sz_Type_name_of_program
|
|
push dword [sc.work_text]
|
|
call draw.text
|
|
|
|
; ====================| browse button |====================
|
|
push 20
|
|
push 5
|
|
push 38
|
|
push 42
|
|
push 17
|
|
call draw.button
|
|
|
|
push 3
|
|
push 42
|
|
push sz_browse
|
|
push dword [sc.work_button_text]
|
|
call draw.text
|
|
|
|
; ====================| run button |====================
|
|
push 10
|
|
mov eax, [window.width]
|
|
sub eax, 57
|
|
push eax
|
|
push 38
|
|
push 42
|
|
push 17
|
|
call draw.button
|
|
|
|
mov eax, [window.width]
|
|
sub eax, 56
|
|
push eax
|
|
push 42
|
|
push sz_run
|
|
push dword [sc.work_button_text]
|
|
call draw.text
|
|
; =====================================================
|
|
|
|
mov eax, 57
|
|
push eax
|
|
mov eax, [window.height]
|
|
sub eax, 44
|
|
push eax
|
|
push dword[runresult]
|
|
push dword [sc.work_text]
|
|
call draw.text
|
|
|
|
push edit1
|
|
call [edit_box_draw]
|
|
|
|
; redraw.finish
|
|
mov eax, 12
|
|
mov ebx, 2
|
|
int 64
|
|
|
|
ret
|
|
|
|
|
|
; ======================================================================= ;
|
|
extractrunpathandparams:
|
|
xor ecx, ecx
|
|
|
|
mov eax, [esp + 4]
|
|
mov [runpath], eax
|
|
|
|
movzx eax, byte [eax]
|
|
cmp eax, 34
|
|
jne .start_without_quote
|
|
|
|
inc ecx
|
|
; ----------------------- ;
|
|
.loop1:
|
|
mov eax, [runpath]
|
|
movzx eax, byte [eax + ecx]
|
|
cmp eax, 34
|
|
jne .not_quote
|
|
|
|
mov eax, [runpath]
|
|
mov [eax + ecx], byte 0
|
|
|
|
mov eax, [runpath]
|
|
add eax, ecx
|
|
mov [ptrlastendpath], eax
|
|
mov [lastendpath], byte 34
|
|
inc ecx
|
|
; ----------------------- ;
|
|
.skip_space1:
|
|
mov eax, [runpath]
|
|
movzx eax, byte [eax + ecx]
|
|
cmp al, 32
|
|
jne .skipped1
|
|
inc ecx
|
|
jmp .skip_space1
|
|
; ----------------------- ;
|
|
.skipped1:
|
|
mov eax, [runpath]
|
|
add eax, ecx
|
|
mov [runparams], eax
|
|
inc dword [runpath]
|
|
jmp .exit
|
|
; ----------------------- ;
|
|
.not_quote:
|
|
mov eax, [runpath]
|
|
movzx eax, byte [eax + ecx]
|
|
|
|
test eax, eax
|
|
jne .not_zero1
|
|
mov eax, [runpath]
|
|
add eax, ecx
|
|
mov [runparams], eax
|
|
mov eax, [runpath]
|
|
add eax, ecx
|
|
mov [ptrlastendpath], eax
|
|
mov [lastendpath], byte 0
|
|
jmp .exit
|
|
; ----------------------- ;
|
|
.not_zero1:
|
|
inc ecx
|
|
jmp .loop1
|
|
; ----------------------- ;
|
|
.start_without_quote:
|
|
; ----------------------- ;
|
|
.loop2:
|
|
mov eax, [runpath]
|
|
movzx eax, byte [eax + ecx]
|
|
cmp eax, 32
|
|
jne .not_space
|
|
|
|
mov eax, [runpath]
|
|
mov [eax + ecx], byte 0
|
|
|
|
mov eax, [runpath]
|
|
add eax, ecx
|
|
mov [ptrlastendpath], eax
|
|
mov [lastendpath], byte 32
|
|
inc ecx
|
|
; ----------------------- ;
|
|
.skip_space2:
|
|
mov eax, [runpath]
|
|
movzx eax, byte [eax + ecx]
|
|
cmp al, 32
|
|
jne .skipped2
|
|
inc ecx
|
|
jmp .skip_space2
|
|
; ----------------------- ;
|
|
.skipped2:
|
|
mov eax, [runpath]
|
|
add eax, ecx
|
|
mov [runparams], eax
|
|
jmp .exit
|
|
; ----------------------- ;
|
|
.not_space:
|
|
mov eax, [runpath]
|
|
movzx eax, byte [eax + ecx]
|
|
|
|
test eax, eax
|
|
jne .not_zero2
|
|
mov eax, [runpath]
|
|
add eax, ecx
|
|
mov [runparams], eax
|
|
mov eax, [runpath]
|
|
add eax, ecx
|
|
mov [ptrlastendpath], eax
|
|
mov [lastendpath], byte 0
|
|
jmp .exit
|
|
; ----------------------- ;
|
|
.not_zero2:
|
|
inc ecx
|
|
jmp .loop2
|
|
; ----------------------- ;
|
|
.exit:
|
|
ret 4
|
|
|
|
; ======================================================================= ;
|
|
draw.button:
|
|
mov eax, 8
|
|
mov ebx, [esp + 16]
|
|
shl ebx, 16
|
|
add ebx, [esp + 8]
|
|
mov ecx, [esp + 12]
|
|
shl ecx, 16
|
|
add ecx, [esp + 4]
|
|
mov edx, [esp + 20]
|
|
mov esi, [sc.work_button]
|
|
int 64
|
|
ret 20
|
|
; ======================================================================= ;
|
|
draw.text:
|
|
mov eax, 4
|
|
mov ebx, [esp + 16]
|
|
shl ebx, 16
|
|
add ebx, [esp + 12]
|
|
mov ecx, 2147483648
|
|
or ecx, [esp + 4]
|
|
mov edx, [esp + 8]
|
|
int 64
|
|
ret 16
|
|
; ======================================================================= ;
|
|
load.library:
|
|
mov eax, 68
|
|
mov ebx, 19
|
|
mov ecx, [esp + 4]
|
|
int 64
|
|
ret 4
|
|
; ======================================================================= ;
|
|
getprocaddress:
|
|
mov edx, [esp + 8] ; hlib
|
|
xor eax, eax
|
|
test edx, edx ; If hlib = 0 then goto .end
|
|
jz .end
|
|
; ----------------------- ;
|
|
.next:
|
|
cmp [edx], dword 0 ; If end of export table then goto .end
|
|
jz .end
|
|
|
|
xor eax, eax
|
|
mov esi, [edx]
|
|
mov edi, [esp + 4] ; name
|
|
; ----------------------- ;
|
|
.next_:
|
|
lodsb
|
|
scasb
|
|
jne .fail
|
|
or al, al
|
|
jnz .next_
|
|
jmp .ok
|
|
; ----------------------- ;
|
|
.fail:
|
|
add edx, 8
|
|
jmp .next
|
|
; ----------------------- ;
|
|
.ok: ; return address
|
|
mov eax, [edx + 4]
|
|
; ----------------------- ;
|
|
.end:
|
|
ret 8
|
|
|
|
|
|
|
|
file_info:
|
|
dd 7
|
|
dd 0
|
|
runparams:
|
|
dd 0
|
|
dd 0
|
|
dd 0
|
|
db 0
|
|
runpath:
|
|
dd 0
|
|
|
|
|
|
screen:
|
|
.height dw 0
|
|
.width dw 0
|
|
|
|
window:
|
|
.left dd 0
|
|
.top dd 0
|
|
.width dd 0
|
|
.height dd 0
|
|
|
|
box_lib dd 0
|
|
|
|
edit1:
|
|
.width dd 0
|
|
.left dd 5
|
|
.top dd 19
|
|
.color dd 0ffffffffh
|
|
.shift_color dd 0
|
|
.focus_border_color dd 0
|
|
.blur_border_color dd 0
|
|
.text_color dd 0
|
|
.max dd 4096
|
|
.text dd 0
|
|
.mouse_variable dd 0
|
|
.flags dd 2
|
|
.size dd 0
|
|
.pos dd 0
|
|
.offset dd 0
|
|
.cl_curs_x dd 0
|
|
.cl_curs_y dd 0
|
|
.shift dd 0
|
|
.shift_old dd 0
|
|
|
|
edit_box_draw dd 0
|
|
edit_box_key dd 0
|
|
edit_box_mouse dd 0
|
|
edit_box_set_text dd 0
|
|
|
|
sc:
|
|
.frames dd 0
|
|
.grab dd 0
|
|
.grab_button dd 0
|
|
.grab_button_text dd 0
|
|
.grab_text dd 0
|
|
.work dd 0
|
|
.work_button dd 0
|
|
.work_button_text dd 0
|
|
.work_text dd 0
|
|
.work_graph dd 0
|
|
|
|
proc_lib dd 0
|
|
|
|
od:
|
|
.mode dd 0
|
|
.procinfo dd 0
|
|
.com_area_name dd sz_FFFFFFFF_open_dialog
|
|
.com_area dd 0
|
|
.opendir_path dd 0
|
|
.dir_default_path dd sz_SYS
|
|
.start_path dd sz_opendial_path
|
|
.draw_window dd on_redraw
|
|
.status dd 0
|
|
.openfile_path dd 0
|
|
.filename_area dd 0
|
|
.filter_area dd filefilter
|
|
.x_size dw 414
|
|
.x_start dw 0
|
|
.y_size dw 414
|
|
.y_start dw 0
|
|
|
|
opendialog_init dd 0
|
|
opendialog_start dd 0
|
|
|
|
filefilter dd 0
|
|
runresult dd sz_empty
|
|
|
|
lastendpath db 0
|
|
ptrlastendpath dd 0
|
|
|
|
sz_empty db 0
|
|
|
|
sz_box_lib db "/sys/lib/box_lib.obj",0
|
|
sz_edit_box db "edit_box",0
|
|
sz_edit_box_key db "edit_box_key",0
|
|
sz_edit_box_mouse db "edit_box_mouse",0
|
|
sz_edit_box_set_text db "edit_box_set_text",0
|
|
|
|
sz_proc_lib db "/sys/lib/proc_lib.obj",0
|
|
sz_OpenDialog_init db "OpenDialog_init",0
|
|
sz_OpenDialog_start db "OpenDialog_start",0
|
|
sz_FFFFFFFF_open_dialog db "FFFFFFFF_open_dialog",0
|
|
sz_SYS db "/sys",0
|
|
sz_opendial_path db "/sys/File managers/opendial",0
|
|
|
|
sz_Program_run_successfully db "Program run successfully",0
|
|
sz_File_not_found db "File not found",0
|
|
sz_File_is_not_executable db "File is not executable",0
|
|
sz_Too_many_processes db "Too many processes",0
|
|
sz_Access_denied db "Access denied",0
|
|
sz_Out_of_memory db "Out of memory",0
|
|
sz_Unknown_error db "Unknown error",0
|
|
|
|
sz_Type_name_of_program db "Type name of program, and Kolibri will run it for you",0
|
|
|
|
sz_run db " Run ",0
|
|
sz_browse db " Browse ",0
|
|
|
|
; ======================================================================= ;
|
|
end_:
|
|
|