Subversion Repositories Kolibri OS

Rev

Rev 6759 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.    ; Run with OpenDialog ;
  2.  
  3. org 0
  4. use32
  5.  
  6. STACK_SIZE     equ 256
  7. REDRAW_EVENT   equ 1
  8. KEY_EVENT     equ 2
  9. BUTTON_EVENT   equ 3
  10. MOUSE_EVENT   equ 6
  11.  
  12. BUTTON_RUN     equ 10
  13. BUTTON_BROWSE equ 20
  14.  
  15. MENUET01       db 'MENUET01'
  16. version        dd 1
  17. program.start  dd start_
  18. program.end    dd data_
  19. program.memory dd end_ + STACK_SIZE
  20. program.stack  dd end_ + STACK_SIZE
  21. program.params dd 0
  22. program.path   dd 0
  23.  
  24. include 'lang.inc'
  25. include '../../develop/libraries/box_lib/trunk/box_lib.mac'
  26.  
  27. ; ======================================================================= ;
  28. start_:
  29.         mov byte [file_info], 7
  30. ; set.event
  31.         mov eax, 40
  32.         mov ebx, 39
  33.         int 64
  34.  
  35.         push sz_box_lib
  36.         call load.library
  37.         mov [box_lib], eax
  38.  
  39.         push dword[box_lib]
  40.         push sz_edit_box
  41.         call getprocaddress
  42.         mov [edit_box_draw], eax
  43.  
  44.         push dword[box_lib]
  45.         push sz_edit_box_key
  46.         call getprocaddress
  47.         mov [edit_box_key], eax
  48.  
  49.         push dword[box_lib]
  50.         push sz_edit_box_mouse
  51.         call getprocaddress
  52.         mov [edit_box_mouse], eax
  53.  
  54.         push dword[box_lib]
  55.         push sz_edit_box_set_text
  56.         call getprocaddress
  57.         mov [edit_box_set_text], eax
  58.  
  59.         push sz_proc_lib
  60.         call load.library
  61.         mov [proc_lib], eax
  62.  
  63.         push dword[proc_lib]
  64.         push sz_OpenDialog_init
  65.         call getprocaddress
  66.         mov [opendialog_init], eax
  67.  
  68.         push dword[proc_lib]
  69.         push sz_OpenDialog_start
  70.         call getprocaddress
  71.         mov [opendialog_start], eax
  72.  
  73.  
  74. ; memory.allocate:
  75.         mov eax, 68
  76.         mov ebx, 12
  77.         mov ecx, 4096 + 4096 + 4096
  78.         int 64
  79.  
  80.         mov [od.procinfo], eax
  81.  
  82.         add eax, 1024
  83.         mov [od.filename_area], eax
  84.  
  85.         add eax, 4096 - 1024
  86.         mov [od.opendir_path], eax
  87.  
  88.         add eax, 4096
  89.         mov [od.openfile_path], eax
  90.  
  91.         push od
  92.         call [opendialog_init]
  93.  
  94.  
  95. ; get.screen.size
  96.         mov eax, 61
  97.         mov ebx,  1
  98.         int 64
  99.  
  100.         mov [screen], eax
  101.         movzx eax,  word[screen.width]
  102.         shr   eax, 3
  103.         lea   eax, [eax*2 + eax]
  104.         add   eax, 90
  105.         mov [window.width], eax
  106.  
  107. ; skin.height
  108.         mov eax, 48
  109.         mov ebx, 4
  110.         int 64
  111.  
  112.         add eax, 100
  113.         mov [window.height], eax
  114.  
  115.         movzx eax,  word[screen.width]
  116.         sub   eax, [window.width]
  117.         shr   eax, 1
  118.         mov [window.left], eax
  119.  
  120.         movzx eax,  word[screen.height]
  121.         sub   eax, [window.height]
  122.         sub   eax, 100
  123.         mov [window.top], eax
  124.  
  125.         mov eax, [window.width]
  126.         sub eax, 80
  127.         mov [edit1.width], eax
  128.  
  129.         mov eax, [od.openfile_path]
  130.         mov [edit1.text], eax
  131.  
  132.  
  133.         call on_redraw
  134. ; ----------------------- ;
  135. .loop:
  136. ; wait.event
  137.         mov eax, 10
  138.         int 64
  139.         cmp eax, REDRAW_EVENT
  140.         jne .check_key
  141.         call on_redraw
  142.         jmp .loop
  143. ; ----------------------- ;
  144. .check_key:
  145.         cmp eax, KEY_EVENT
  146.         jne .check_button
  147.         mov eax, 2
  148.         int 64
  149.         cmp ah, 13
  150.         jne .no_key_enter
  151.         call on_button_run
  152.         jmp .loop
  153. ; ----------------------- ;
  154. .no_key_enter:
  155.         cmp ah, 185
  156.         jne .no_key_insert
  157.         call on_button_browse
  158.         jmp .loop
  159. .no_key_insert:
  160.         push edit1
  161.         call [edit_box_key]
  162.         jmp .loop
  163. ; ----------------------- ;
  164. .check_button:
  165.         cmp eax, BUTTON_EVENT
  166.         jne .check_mouse
  167. ; get.button.number
  168.         mov eax, 17
  169.         int 64
  170.         cmp ah, 1
  171.         jne .check_button_run
  172. ; program.terminate
  173.         or eax, -1
  174.         int 64
  175. ; ----------------------- ;
  176. .check_button_run:
  177.         cmp ah, BUTTON_RUN
  178.         jne .check_button_browse
  179.         call on_button_run
  180.         jmp .loop
  181. ; ----------------------- ;
  182. .check_button_browse:
  183.         cmp ah, BUTTON_BROWSE
  184.         jne .loop
  185.         call on_button_browse
  186.         jmp .loop
  187. ; ----------------------- ;
  188. .check_mouse:
  189.         cmp eax, MOUSE_EVENT
  190.         jne .loop
  191.         push edit1
  192.         call [edit_box_mouse]
  193.         jmp .loop
  194.  
  195.  
  196. ; ======================================================================= ;
  197. on_button_run:
  198.         push dword[edit1.text]
  199.         call extractrunpathandparams
  200.  
  201. ;file.run:
  202.         mov eax, 70
  203.         mov ebx, file_info
  204.         int 64
  205.  
  206.         mov    dl, byte[lastendpath]
  207.         mov   ecx, [ptrlastendpath]
  208.         mov [ecx], dl
  209.  
  210.         test eax, eax
  211.         jnge .error
  212.         mov [runresult], dword sz_Program_run_successfully
  213.         jmp .exit
  214.  
  215. .error:
  216. ; ----------------------- ;
  217. .5:
  218.         cmp al, -5
  219.         jne .31
  220.         mov [runresult], dword sz_File_not_found
  221.         jmp .exit
  222. ; ----------------------- ;
  223. .31:
  224.         cmp al, -31
  225.         jne .32
  226.         mov [runresult], dword sz_File_is_not_executable
  227.         jmp .exit
  228. ; ----------------------- ;
  229. .32:
  230.         cmp al, -32
  231.         jne .10
  232.         mov [runresult], dword sz_Too_many_processes
  233.         jmp .exit
  234. ; ----------------------- ;
  235. .10:
  236.         cmp al, -10
  237.         jne .30
  238.         mov [runresult], dword sz_Access_denied
  239.         jmp .exit
  240. ; ----------------------- ;
  241. .30:
  242.         cmp al, -30
  243.         jne .unknown
  244.         mov [runresult], dword sz_Out_of_memory
  245.         jmp .exit
  246. ; ----------------------- ;
  247. .unknown:
  248.         mov [runresult], dword sz_Unknown_error
  249. ; ----------------------- ;
  250. .exit:
  251.         call on_redraw
  252.         ret
  253.  
  254. ; ======================================================================= ;
  255. on_button_browse:
  256.         push od
  257.         call [opendialog_start]
  258.  
  259.         mov eax, [od.status]
  260.         test eax, eax
  261.         je .exit
  262.  
  263. ;======== if space exist in filepath, then quote filepath
  264.         mov eax, [od.openfile_path]
  265. ; ----------------------- ;
  266. .check_space:
  267.         cmp [eax], byte 0
  268.         je .no_space
  269.         cmp [eax], byte 32 ;space
  270.         je .space
  271.         inc eax
  272.         jmp .check_space
  273. .space:
  274. ; ----------------------- ;
  275. .find_end_zero:
  276.         inc eax
  277.         cmp [eax], byte 0
  278.         jne .find_end_zero
  279.         mov [eax + 2], byte 0
  280.         mov [eax + 1], byte 34 ; quote
  281. ; ----------------------- ;
  282. .shift_path:
  283.         dec eax
  284.  
  285.         mov dl, byte [eax ]
  286.         mov [eax + 1], dl
  287.  
  288.         cmp eax, [od.openfile_path]
  289.         jne .shift_path
  290.         mov [eax ], byte 34 ; quote
  291.  
  292. .no_space:
  293. ;=================================
  294.  
  295.         push dword[od.openfile_path]
  296.         push edit1
  297.         call [edit_box_set_text]
  298. ; ----------------------- ;
  299. .exit:
  300.         ret
  301.  
  302.  
  303. ; ======================================================================= ;
  304. on_redraw:
  305. ; redraw.start
  306.         mov eax, 12
  307.         mov ebx, 1
  308.         int 64
  309. ; get.standart.colors
  310.         mov eax, 48
  311.         mov ebx, 3
  312.         mov ecx, sc
  313.         mov edx, 40
  314.         int 64
  315.  
  316.         mov eax, [sc.work_graph]
  317.         mov [edit1.shift_color], eax
  318.  
  319.         mov eax, [sc.work_graph]
  320.         mov [edit1.focus_border_color], eax
  321.  
  322.         mov eax, [sc.frames]
  323.         mov [edit1.blur_border_color], eax
  324.  
  325.         mov eax, [sc.work_text]
  326.         bts eax, 28
  327.         mov [edit1.text_color], eax
  328.  
  329. ; draw.window
  330.         xor eax, eax
  331.         mov ebx, [window.left]
  332.         shl ebx, 16
  333.         add ebx, [window.width]
  334.         mov ecx, [window.top]
  335.         shl ecx, 16
  336.         add ecx, [window.height]
  337.         mov edx, [sc.work]
  338.         or  edx, 34000000h
  339.         mov edi, title
  340.         int 64
  341.  
  342.         push 5
  343.         push 5
  344.         push sz_Type_name_of_program
  345.         push dword [sc.work_text]
  346.         call draw.text
  347. ; ====================| browse button |====================
  348.         push 20
  349.         mov  eax, [window.width]
  350.         sub  eax, 70
  351.         push eax
  352.         push 26
  353.         push 52
  354.         push 21
  355.         call draw.button
  356.  
  357.         mov  eax, [window.width]
  358.         sub  eax, 56
  359.         push eax
  360.         push 29
  361.         push sz_browse
  362.         push dword [sc.work_button_text]
  363.         call draw.text
  364. ; ====================| run button |====================
  365.         push 10
  366.         push 5
  367.         push 52
  368.         mov  eax, [window.width]
  369.         sub  eax, 22
  370.         push eax
  371.         push 21
  372.         call draw.button
  373.  
  374.         mov  eax, [window.width]
  375.         shr  eax, 1
  376.         sub  eax, 40
  377.         push eax
  378.         push 55
  379.         push sz_run
  380.         push dword [sc.work_button_text]
  381.         call draw.text
  382.  ; =====================================================
  383.         push 5
  384.         push 80
  385.         push dword[runresult]
  386.         push dword [sc.work_text]
  387.         call draw.text
  388.  
  389.         push edit1
  390.         call [edit_box_draw]
  391.  
  392. ; redraw.finish
  393.         mov eax, 12
  394.         mov ebx, 2
  395.         int 64
  396.  
  397.         ret
  398.  
  399.  
  400. ; ======================================================================= ;
  401. extractrunpathandparams:
  402.         xor ecx, ecx
  403.  
  404.         mov eax, [esp + 4]
  405.         mov [runpath], eax
  406.  
  407.         movzx eax, byte [eax]
  408.         cmp eax, 34
  409.         jne .start_without_quote
  410.  
  411.         inc ecx
  412. ; ----------------------- ;
  413. .loop1:
  414.         mov eax, [runpath]
  415.         movzx eax, byte [eax + ecx]
  416.         cmp eax, 34
  417.         jne .not_quote
  418.  
  419.         mov eax, [runpath]
  420.         mov [eax + ecx], byte 0
  421.  
  422.         mov eax, [runpath]
  423.         add eax, ecx
  424.         mov [ptrlastendpath], eax
  425.         mov [lastendpath], byte 34
  426.         inc ecx
  427. ; ----------------------- ;
  428. .skip_space1:
  429.         mov eax, [runpath]
  430.         movzx eax, byte [eax + ecx]
  431.         cmp al, 32
  432.         jne .skipped1
  433.         inc ecx
  434.         jmp .skip_space1
  435. ; ----------------------- ;
  436. .skipped1:
  437.         mov eax, [runpath]
  438.         add eax, ecx
  439.         mov [runparams], eax
  440.         inc dword [runpath]
  441.         jmp .exit
  442. ; ----------------------- ;
  443. .not_quote:
  444.         mov eax, [runpath]
  445.         movzx eax, byte [eax + ecx]
  446.  
  447.         test eax, eax
  448.         jne .not_zero1
  449.         mov eax, [runpath]
  450.         add eax, ecx
  451.         mov [runparams], eax
  452.         mov eax, [runpath]
  453.         add eax, ecx
  454.         mov [ptrlastendpath], eax
  455.         mov [lastendpath], byte 0
  456.         jmp .exit
  457. ; ----------------------- ;
  458. .not_zero1:
  459.         inc ecx
  460.         jmp .loop1
  461. ; ----------------------- ;
  462. .start_without_quote:
  463. ; ----------------------- ;
  464. .loop2:
  465.         mov eax, [runpath]
  466.         movzx eax, byte [eax + ecx]
  467.         cmp eax, 32
  468.         jne .not_space
  469.  
  470.         mov eax, [runpath]
  471.         mov [eax + ecx], byte 0
  472.  
  473.         mov eax, [runpath]
  474.         add eax, ecx
  475.         mov [ptrlastendpath], eax
  476.         mov [lastendpath], byte 32
  477.         inc ecx
  478. ; ----------------------- ;
  479. .skip_space2:
  480.         mov eax, [runpath]
  481.         movzx eax, byte [eax + ecx]
  482.         cmp al, 32
  483.         jne .skipped2
  484.         inc ecx
  485.         jmp .skip_space2
  486. ; ----------------------- ;
  487. .skipped2:
  488.         mov eax, [runpath]
  489.         add eax, ecx
  490.         mov [runparams], eax
  491.         jmp .exit
  492. ; ----------------------- ;
  493. .not_space:
  494.         mov eax, [runpath]
  495.         movzx eax, byte [eax + ecx]
  496.  
  497.         test eax, eax
  498.         jne .not_zero2
  499.         mov eax, [runpath]
  500.         add eax, ecx
  501.         mov [runparams], eax
  502.         mov eax, [runpath]
  503.         add eax, ecx
  504.         mov [ptrlastendpath], eax
  505.         mov [lastendpath], byte 0
  506.         jmp .exit
  507. ; ----------------------- ;
  508. .not_zero2:
  509.         inc ecx
  510.         jmp .loop2
  511. ; ----------------------- ;
  512. .exit:
  513.         ret 4
  514.  
  515. ; ======================================================================= ;
  516. draw.button:
  517.         mov eax, 8
  518.         mov ebx, [esp + 16]
  519.         shl ebx, 16
  520.         add ebx, [esp + 8]
  521.         mov ecx, [esp + 12]
  522.         shl ecx, 16
  523.         add ecx, [esp + 4]
  524.         mov edx, [esp + 20]
  525.         mov esi, [sc.work_button]
  526.         int 64
  527.         ret 20
  528. ; ======================================================================= ;
  529. draw.text:
  530.         mov eax, 4
  531.         mov ebx, [esp + 16]
  532.         shl ebx, 16
  533.         add ebx, [esp + 12]
  534.         mov ecx, [esp + 4]
  535.         or  ecx, 90000000h
  536.         mov edx, [esp + 8]
  537.         int 64
  538.         ret 16
  539. ; ======================================================================= ;
  540. load.library:
  541.         mov eax, 68
  542.         mov ebx, 19
  543.         mov ecx, [esp + 4]
  544.         int 64
  545.         ret 4
  546. ; ======================================================================= ;
  547. getprocaddress:
  548.         mov  edx, [esp + 8] ; hlib
  549.         xor  eax, eax
  550.         test edx, edx ; If hlib = 0 then goto .end
  551.         jz  .end
  552. ; ----------------------- ;
  553. .next:
  554.         cmp  [edx], dword 0 ; If end of export table then goto .end
  555.         jz  .end
  556.  
  557.         xor  eax, eax
  558.         mov  esi, [edx]
  559.         mov  edi, [esp + 4] ; name
  560. ; ----------------------- ;
  561. .next_:
  562.         lodsb
  563.         scasb
  564.         jne  .fail
  565.         or   al, al
  566.         jnz  .next_
  567.         jmp  .ok
  568. ; ----------------------- ;
  569. .fail:
  570.         add  edx, 8
  571.         jmp  .next
  572. ; ----------------------- ;
  573. .ok:               ; return address
  574.         mov  eax, [edx + 4]
  575. ; ----------------------- ;
  576. .end:
  577.         ret 8
  578.  
  579. data_:
  580.  
  581. sz_box_lib              db "/sys/lib/box_lib.obj",0
  582. sz_edit_box             db "edit_box",0
  583. sz_edit_box_key         db "edit_box_key",0
  584. sz_edit_box_mouse       db "edit_box_mouse",0
  585. sz_edit_box_set_text    db "edit_box_set_text",0
  586.  
  587. sz_proc_lib             db "/sys/lib/proc_lib.obj",0
  588. sz_OpenDialog_init      db "OpenDialog_init",0
  589. sz_OpenDialog_start     db "OpenDialog_start",0
  590. sz_FFFFFFFF_open_dialog db "FFFFFFFF_open_dialog",0
  591. sz_SYS                  db "/sys",0
  592. sz_opendial_path        db "/sys/File managers/opendial",0
  593.  
  594. if lang eq it
  595.         sz_Program_run_successfully db "Programma eseguito correttamente",0
  596.         sz_File_not_found           db "File non trovato",0
  597.         sz_File_is_not_executable   db "File non eseguibile",0
  598.         sz_Too_many_processes       db "Troppi processi",0
  599.         sz_Access_denied            db "Accesso negato",0
  600.         sz_Out_of_memory            db "Out of memory",0
  601.         sz_Unknown_error            db "Errore sconosciuto",0
  602.         sz_Type_name_of_program     db "Digita il nome del programma per eseguirlo",0
  603.         sz_run                      db " Esegui",0
  604.         sz_browse                   db "Browse",0
  605.         title                       db "Esegui",0
  606. else if lang eq ru
  607.         sz_Program_run_successfully db "Программа запущена успешно",0
  608.         sz_File_not_found           db "Файл не найден",0
  609.         sz_File_is_not_executable   db "Файл не является исполняемым",0
  610.         sz_Too_many_processes       db "Слишком много процессов",0
  611.         sz_Access_denied            db "Доступ запрещен",0
  612.         sz_Out_of_memory            db "Недостаточно памяти",0
  613.         sz_Unknown_error            db "Неизвестная ошибка",0
  614.         sz_Type_name_of_program     db "Введите название программы",0
  615.         sz_run                      db "Запустить",0
  616.         sz_browse                   db "...",0
  617.         title                       db "Запуск программы",0
  618. else
  619.         sz_Program_run_successfully db "Program run successfully",0
  620.         sz_File_not_found           db "File not found",0
  621.         sz_File_is_not_executable   db "File is not executable",0
  622.         sz_Too_many_processes       db "Too many processes",0
  623.         sz_Access_denied            db "Access denied",0
  624.         sz_Out_of_memory            db "Out of memory",0
  625.         sz_Unknown_error            db "Unknown error",0
  626.         sz_Type_name_of_program     db "Type name of program to run",0
  627.         sz_run                      db "   Run",0
  628.         sz_browse                   db "...",0
  629.         title                       db "Run",0
  630. end if
  631.  
  632. align 4
  633. od:
  634. .mode           dd  0
  635. .procinfo       dd  0
  636. .com_area_name  dd  sz_FFFFFFFF_open_dialog
  637. .com_area       dd  0
  638. .opendir_path   dd  0
  639. .dir_default_path   dd  sz_SYS
  640. .start_path     dd  sz_opendial_path
  641. .draw_window    dd  on_redraw
  642. .status         dd  0
  643. .openfile_path  dd  0
  644. .filename_area  dd  0
  645. .filter_area    dd  filefilter
  646. .x_size         dw  414
  647. .x_start        dw  0
  648. .y_size         dw  414
  649. .y_start        dw  0
  650.  
  651. runresult   dd  sz_empty
  652.  
  653. edit1 edit_box 0, 5, 26, 0ffffffh, 0, 0, 0, 0, 4096, 0, 0, 4002h
  654.  
  655. box_lib     dd  ?
  656. proc_lib    dd  ?
  657. filefilter      dd  ?
  658. ptrlastendpath  dd  ?
  659. edit_box_draw   dd  ?
  660. edit_box_key    dd  ?
  661. edit_box_mouse  dd  ?
  662. edit_box_set_text   dd  ?
  663. opendialog_init     dd  ?
  664. opendialog_start    dd  ?
  665.  
  666. sc:
  667. .frames         dd  ?
  668. .grab           dd  ?
  669. .grab_button    dd  ?
  670. .grab_button_text   dd  ?
  671. .grab_text      dd  ?
  672. .work           dd  ?
  673. .work_button    dd  ?
  674. .work_button_text   dd  ?
  675. .work_text      dd  ?
  676. .work_graph     dd  ?
  677.  
  678. window:
  679. .left   dd  ?
  680. .top    dd  ?
  681. .width  dd  ?
  682. .height dd  ?
  683.  
  684. screen:
  685. .height dw  ?
  686. .width  dw  ?
  687.  
  688. file_info:
  689.         dd  ?
  690.         dd  ?
  691. runparams:
  692.         dd  ?
  693.         dd  ?
  694.         dd  ?
  695.         db  ?
  696. runpath:
  697.         dd  ?
  698.  
  699. lastendpath db  ?
  700. sz_empty    db  ?
  701.  
  702. align 4
  703. end_:
  704.