Subversion Repositories Kolibri OS

Rev

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