Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ; Программа запускает OpenDialog с указанным фильтром и после выбора файла
  2. ; запускает указанную программу, передавая в качестве параметра выбранный путь.
  3. ; Например:
  4. ; LOD *pdf,xps*/hd0/1/mupdf
  5. ; LOD *mp3*/hd0/1/minimp3
  6. ; LOD *asm,inc,mac*/sys/tinypad
  7.  
  8. ; Author 0CodErr
  9. ; http://board.kolibrios.org/viewtopic.php?f=9&t=2486
  10.  
  11. ORG 0
  12. BITS 32
  13. ; ---------------------------------------------------------------------------- ;
  14. PARAMS_SIZE       equ 256
  15. STACK_SIZE         equ 256
  16. ; ---------------------------------------------------------------------------- ;
  17. PROCINFO_SIZE     equ 1024
  18. FILENAME_AREA_SIZE equ 256
  19. OPENDIR_PATH_SIZE equ 4096
  20. OPENFILE_PATH_SIZE equ 4096
  21. FILTER_AREA_SIZE   equ 256
  22. FILTER_BRACKET     equ "*" ; and for example: LOD *bmp,png,jpeg*/sys/media/kiv
  23. ; ---------------------------------------------------------------------------- ;
  24. MENUET01           db 'MENUET01'
  25. version            dd 1
  26. program.start      dd START
  27. program.end        dd END
  28. program.memory     dd END + PARAMS_SIZE + STACK_SIZE
  29. program.stack      dd END + PARAMS_SIZE + STACK_SIZE
  30. program.params     dd END
  31. program.path       dd 0
  32. ; ---------------------------------------------------------------------------- ;
  33. START:
  34.                 mov    edi,[program.params]
  35.                 cmp    [edi],dword 0
  36.                 je     terminate
  37.                
  38.         call   FakeDrawWindow
  39.         call   OpenDialogInit
  40.         call   OpenDialogSetFilter
  41.         call   OpenDialogOpen
  42.         cmp    [od.status], dword 0
  43.         je     terminate
  44.         mov    [file_info.params], eax
  45. launch_program:
  46.         mov    eax, 70
  47.         mov    ebx, file_info
  48.         int    64
  49. terminate:
  50.         or     eax, -1
  51.         int    64
  52. ; ---------------------------------------------------------------------------- ;
  53. OpenDialogInit:
  54. ; load.library
  55.         mov    eax, 68
  56.         mov    ebx, 19
  57.         mov    ecx, sz_proc_lib
  58.         int    64
  59.         mov    [proclib], eax
  60.  
  61.         push   dword[proclib]
  62.         push   sz_OpenDialog_init
  63.         call   GetProcAddress
  64.         mov    [opendialog_init], eax
  65.  
  66.         push   dword[proclib]
  67.         push   sz_OpenDialog_start
  68.         call   GetProcAddress
  69.         mov    [opendialog_start], eax
  70. ; memory.allocate
  71.         mov    eax, 68
  72.         mov    ebx, 12
  73.         mov    ecx, PROCINFO_SIZE + FILENAME_AREA_SIZE + OPENDIR_PATH_SIZE + OPENFILE_PATH_SIZE
  74.         int    64
  75.  
  76.         mov    [od.procinfo], eax
  77.         add    eax, PROCINFO_SIZE
  78.         mov    [od.filename_area], eax
  79.         add    eax, FILENAME_AREA_SIZE
  80.         mov    [od.opendir_path], eax
  81.         add    eax, OPENDIR_PATH_SIZE
  82.         mov    [od.openfile_path], eax
  83.  
  84.         push   od
  85.         call   [opendialog_init]
  86.         ret
  87. ; ---------------------------------------------------------------------------- ;
  88. OpenDialogOpen:
  89.         mov    eax, [od.openfile_path]
  90.         mov    [eax], byte 0
  91.         push   od
  92.         call   [opendialog_start]
  93.         mov    eax, [od.openfile_path]
  94.         ret
  95. ; ---------------------------------------------------------------------------- ;
  96. GetProcAddress:
  97.         mov    edx, [esp + 8]
  98.         xor    eax, eax
  99.         test   edx, edx
  100.         jz     .end
  101. .next:
  102.         xor    eax, eax
  103.         cmp    [edx], dword 0
  104.         jz     .end
  105.         mov    esi, [edx]
  106.         mov    edi, [esp + 4]
  107. .next_:
  108.         lodsb
  109.         scasb
  110.         jne    .fail
  111.         or     al, al
  112.         jnz    .next_
  113.         jmp    .ok
  114. .fail:
  115.         add    edx, 8
  116.         jmp    .next
  117. .ok:
  118.         mov    eax, [edx + 4]
  119. .end:
  120.         ret    8
  121. ; ---------------------------------------------------------------------------- ;
  122. FakeDrawWindow:
  123. ; redraw.start
  124.         mov    eax, 12
  125.         mov    ebx, 1
  126.         int    64
  127. ; get.screen.size
  128.         mov    eax, 61
  129.         mov    ebx, 1
  130.         int    64
  131.         shr    eax, 1
  132.         and    eax, 0x7FFF7FFF
  133. ; draw.window        
  134.         movzx  ecx, ax
  135.         shl    ecx, 16
  136.         shr    eax, 16
  137.         movzx  ebx, ax
  138.         shl    ebx, 16
  139.         mov    edx, 0x01000000
  140.         xor    eax, eax
  141.         int    64                        
  142. ; redraw.finish
  143.         mov    eax, 12
  144.         mov    ebx, 2
  145.         int    64
  146.         ret
  147. ; ---------------------------------------------------------------------------- ;
  148. OpenDialogSetFilter:
  149.         mov    edi, [program.params]
  150.         mov    esi, filefilter + 4
  151. ; skip spaces
  152.         or     ecx, -1
  153.         mov    al, " "
  154.         repe scasb
  155.         dec    edi
  156.         cmp    [edi], byte FILTER_BRACKET
  157.         xchg   esi, edi
  158.         jne    .no_filter
  159.         inc    esi
  160.         mov    ecx, FILTER_AREA_SIZE
  161. ; copy filter string to filter area
  162. ; and replace commas with zeroes
  163. .next:
  164.         lodsb
  165.         test   al, al
  166.         jnz    .bracket?
  167.         stosb
  168.         jmp    .done
  169. .bracket?:
  170.         cmp    al, FILTER_BRACKET
  171.         jne    .comma?
  172.         xor    al, al
  173.         stosb
  174.         jmp    .done
  175. .comma?:
  176.         cmp    al, ","
  177.         jne    .not_comma
  178.         xor    al, al
  179. .not_comma:
  180.         stosb
  181.         loop   .next
  182. .done:
  183.         sub    edi, filefilter
  184.         mov    [filefilter], edi
  185. .no_filter:
  186.         mov    edi, esi
  187. ; skip spaces
  188.         or     ecx, -1
  189.         mov    al, " "
  190.         repe scasb
  191.         dec    edi
  192.         mov    [file_info.file_path], edi
  193.         ret    4
  194. ; ---------------------------------------------------------------------------- ;
  195. LaunchProgram:
  196.         mov    eax, [od.openfile_path]
  197.         mov    [file_info.params], eax
  198.         mov    eax, 70
  199.         mov    ebx, file_info
  200.         int    64
  201.         ret
  202. ; ---------------------------------------------------------------------------- ;
  203. file_info:
  204.                     dd 7
  205.                     dd 0
  206. .params             dd 0
  207.                     dd 0
  208.                     dd 0
  209.                     db 0
  210. .file_path          dd 0
  211. ; ---------------------------------------------------------------------------- ;
  212. filefilter          dd 0
  213.                     resb FILTER_AREA_SIZE
  214. .end                db 0
  215. ; ---------------------------------------------------------------------------- ;
  216. od:
  217. .mode               dd 0
  218. .procinfo           dd 0
  219. .com_area_name      dd sz_com_area_name
  220. .com_area           dd 0
  221. .opendir_path       dd 0
  222. .dir_default_path   dd sz_dir_default_path
  223. .start_path         dd sz_start_path
  224. .draw_window        dd FakeDrawWindow
  225. .status             dd 0
  226. .openfile_path      dd 0
  227. .filename_area      dd 0
  228. .filter_area        dd filefilter
  229. .x_size             dw 444
  230. .x_start            dw 0
  231. .y_size             dw 444
  232. .y_start            dw 0
  233. ; ---------------------------------------------------------------------------- ;
  234. sz_proc_lib         db "/sys/lib/proc_lib.obj",0
  235. sz_OpenDialog_init  db "OpenDialog_init",0
  236. sz_OpenDialog_start db "OpenDialog_start",0
  237. sz_com_area_name    db "FFFFFFFF_open_dialog",0
  238. sz_dir_default_path db "/sys",0
  239. sz_start_path       db "/sys/File managers/opendial",0
  240. ; ---------------------------------------------------------------------------- ;
  241. proclib             dd 0
  242. opendialog_init     dd 0
  243. opendialog_start    dd 0
  244. ; ---------------------------------------------------------------------------- ;
  245. END: