; Программа запускает OpenDialog с указанным фильтром и после выбора файла ; запускает указанную программу, передавая в качестве параметра выбранный путь. ; Например: ; LOD *pdf,xps*/hd0/1/mupdf ; LOD *mp3*/hd0/1/minimp3 ; LOD *asm,inc,mac*/sys/tinypad ; Author 0CodErr ; http://board.kolibrios.org/viewtopic.php?f=9&t=2486 ORG 0 BITS 32 ; ---------------------------------------------------------------------------- ; PARAMS_SIZE equ 256 STACK_SIZE equ 256 ; ---------------------------------------------------------------------------- ; PROCINFO_SIZE equ 1024 FILENAME_AREA_SIZE equ 256 OPENDIR_PATH_SIZE equ 4096 OPENFILE_PATH_SIZE equ 4096 FILTER_AREA_SIZE equ 256 FILTER_BRACKET equ "*" ; and for example: LOD *bmp,png,jpeg*/sys/media/kiv ; ---------------------------------------------------------------------------- ; MENUET01 db 'MENUET01' version dd 1 program.start dd START program.end dd END program.memory dd END + PARAMS_SIZE + STACK_SIZE program.stack dd END + PARAMS_SIZE + STACK_SIZE program.params dd END program.path dd 0 ; ---------------------------------------------------------------------------- ; START: mov edi,[program.params] cmp [edi],dword 0 je terminate call FakeDrawWindow call OpenDialogInit call OpenDialogSetFilter call OpenDialogOpen cmp [od.status], dword 0 je terminate mov [file_info.params], eax launch_program: mov eax, 70 mov ebx, file_info int 64 terminate: or eax, -1 int 64 ; ---------------------------------------------------------------------------- ; OpenDialogInit: ; load.library mov eax, 68 mov ebx, 19 mov ecx, sz_proc_lib int 64 mov [proclib], eax push dword[proclib] push sz_OpenDialog_init call GetProcAddress mov [opendialog_init], eax push dword[proclib] push sz_OpenDialog_start call GetProcAddress mov [opendialog_start], eax ; memory.allocate mov eax, 68 mov ebx, 12 mov ecx, PROCINFO_SIZE + FILENAME_AREA_SIZE + OPENDIR_PATH_SIZE + OPENFILE_PATH_SIZE int 64 mov [od.procinfo], eax add eax, PROCINFO_SIZE mov [od.filename_area], eax add eax, FILENAME_AREA_SIZE mov [od.opendir_path], eax add eax, OPENDIR_PATH_SIZE mov [od.openfile_path], eax push od call [opendialog_init] ret ; ---------------------------------------------------------------------------- ; OpenDialogOpen: mov eax, [od.openfile_path] mov [eax], byte 0 push od call [opendialog_start] mov eax, [od.openfile_path] ret ; ---------------------------------------------------------------------------- ; GetProcAddress: mov edx, [esp + 8] xor eax, eax test edx, edx jz .end .next: xor eax, eax cmp [edx], dword 0 jz .end mov esi, [edx] mov edi, [esp + 4] .next_: lodsb scasb jne .fail or al, al jnz .next_ jmp .ok .fail: add edx, 8 jmp .next .ok: mov eax, [edx + 4] .end: ret 8 ; ---------------------------------------------------------------------------- ; FakeDrawWindow: ; redraw.start mov eax, 12 mov ebx, 1 int 64 ; get.screen.size mov eax, 61 mov ebx, 1 int 64 shr eax, 1 and eax, 0x7FFF7FFF ; draw.window movzx ecx, ax shl ecx, 16 shr eax, 16 movzx ebx, ax shl ebx, 16 mov edx, 0x01000000 xor eax, eax int 64 ; redraw.finish mov eax, 12 mov ebx, 2 int 64 ret ; ---------------------------------------------------------------------------- ; OpenDialogSetFilter: mov edi, [program.params] mov esi, filefilter + 4 ; skip spaces or ecx, -1 mov al, " " repe scasb dec edi cmp [edi], byte FILTER_BRACKET xchg esi, edi jne .no_filter inc esi mov ecx, FILTER_AREA_SIZE ; copy filter string to filter area ; and replace commas with zeroes .next: lodsb test al, al jnz .bracket? stosb jmp .done .bracket?: cmp al, FILTER_BRACKET jne .comma? xor al, al stosb jmp .done .comma?: cmp al, "," jne .not_comma xor al, al .not_comma: stosb loop .next .done: sub edi, filefilter mov [filefilter], edi .no_filter: mov edi, esi ; skip spaces or ecx, -1 mov al, " " repe scasb dec edi mov [file_info.file_path], edi ret 4 ; ---------------------------------------------------------------------------- ; LaunchProgram: mov eax, [od.openfile_path] mov [file_info.params], eax mov eax, 70 mov ebx, file_info int 64 ret ; ---------------------------------------------------------------------------- ; file_info: dd 7 dd 0 .params dd 0 dd 0 dd 0 db 0 .file_path dd 0 ; ---------------------------------------------------------------------------- ; filefilter dd 0 resb FILTER_AREA_SIZE .end db 0 ; ---------------------------------------------------------------------------- ; od: .mode dd 0 .procinfo dd 0 .com_area_name dd sz_com_area_name .com_area dd 0 .opendir_path dd 0 .dir_default_path dd sz_dir_default_path .start_path dd sz_start_path .draw_window dd FakeDrawWindow .status dd 0 .openfile_path dd 0 .filename_area dd 0 .filter_area dd filefilter .x_size dw 444 .x_start dw 0 .y_size dw 444 .y_start dw 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_com_area_name db "FFFFFFFF_open_dialog",0 sz_dir_default_path db "/sys",0 sz_start_path db "/sys/File managers/opendial",0 ; ---------------------------------------------------------------------------- ; proclib dd 0 opendialog_init dd 0 opendialog_start dd 0 ; ---------------------------------------------------------------------------- ; END: