Subversion Repositories Kolibri OS

Rev

Rev 3927 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;   DESKTOP CONTEXT MENU
  3. ;   written by Ivan Poddubny
  4. ;
  5. ;   €¢â®à - ˆ¢ ­ ®¤¤ã¡­ë©
  6. ;   e-mail: ivan-yar@bk.ru
  7. ;
  8. ;   Compile with flat assembler
  9. ;
  10. ;------------------------------------------------------------------------------
  11. ; version:      1.1
  12. ; last update:  27/03/2012
  13. ; changed by:   Marat Zakiyanov aka Mario79, aka Mario
  14. ; changes:      The program uses only 3404 bytes memory is now.
  15. ;               Optimisations and code refactoring.
  16. ;------------------------------------------------------------------------------
  17. include 'lang.inc'
  18. include '..\..\..\..\macros.inc'
  19. ;------------------------------------------------------------------------------
  20.         use32
  21.         org 0x0
  22.         db 'MENUET01'   ; 8 byte id
  23.         dd 0x01         ; header version
  24.         dd START        ; start of code
  25.         dd IM_END       ; size of image
  26.         dd I_END        ; memory for app
  27.         dd stack_area   ; esp
  28.         dd 0            ; boot parameters
  29.         dd 0            ; path
  30. ;------------------------------------------------------------------------------
  31. START:
  32. ; ¯®«ãç¨âì á¨á⥬­ë¥ 梥â 
  33.         mcall   48,3,sc,sizeof.system_colors
  34. ; ãáâ ­®¢¨¬ ¬ áªã ᮡë⨩ - ­ á ¨­â¥à¥áã¥â ⮫쪮 ¬ëèì
  35.         mcall   40,100000b
  36. ;------------------------------------------------------------------------------
  37. align 4
  38. still:               ; £« ¢­ë© 横« ®á­®¢­®£® ¯à®æ¥áá 
  39.         mcall   10      ; ¦¤ñ¬ ᮡëâ¨ï
  40.  
  41.         mcall   37,2    ; ª ª¨¥ ­ ¦ âë ª¯®¯ª¨?
  42.         cmp     eax,ebx ; ¥á«¨ ­¥ ¯à ¢ ï, ¢®§¢à â
  43.         jne     still
  44. ;--------------------------------------
  45. ; íâ® ¤«ï ®â« ¤ª¨ - ¥á«¨ ¬ëèì ¢ â®çª¥ (0;0), § ªà®¥¬áï
  46. ;       xor     ebx,ebx
  47. ;       mcall   37
  48. ;       test    eax,eax ; ªãàá®à ¢ â®çª¥ (0;0), â.¥. eax = 0
  49. ;       je      exit
  50. ;--------------------------------------
  51. ; ª®®à¤¨­ âë ªãàá®à 
  52.         xor     ebx,ebx
  53.         mcall   37
  54.  
  55.         mov     ebx,eax         ; eax = cursor_x
  56.         shr     eax,16          ; ebx = cursor_y
  57.         and     ebx,0xffff
  58.         mov     [curx1],eax     ; curx1 = cursor_x
  59.         mov     [cury1],ebx     ; cury1 = cursor_y
  60. ; ª®¬ã ¯à¨­ ¤«¥¦¨â â®çª ?
  61.         mcall   34,[curx1],[cury1]
  62.         cmp     al,1 ; 1 - ï¤à®
  63.         jne     still
  64. ;--------------------------------------
  65. align 4
  66. @@:             ; ¯®¤®¦¤ñ¬, ¯®ª  ¯®«ì§®¢ â¥«ì ­¥ ®â¯ãá⨫ ¯à ¢ãî ª­®¯ªã ¬ëè¨
  67.         mcall   37,2    ;   ­ ¦ âë «¨ ª­®¯ª¨ ¬ëè¨?
  68.         test    eax,ebx ; ¥á«¨ ®â¯ãá⨫, (eax != 2)
  69.         jz      @f      ;   ¨¤ñ¬ ¢ ­ ç «® £« ¢­®£® 横« 
  70.  
  71.         mcall   68,1    ; ¨­ ç¥ ¯¥à¥ª«î稬áï ­  á«¥¤ãî騩 ¯®â®ª á¨áâ¥¬ë ¨ ª®£¤ 
  72.         jmp     @b      ; ¢ë¯®«­¥­¨¥ ¢¥à­¥âáï í⮬㠯®â®ªã, ¯à®¢¥à¨¬ ¬ëèì ®¯ïâì
  73. ;--------------------------------------
  74. align 4
  75. @@:
  76. ; ¥á«¨ 㦥 ¡ë«® ®âªàëâ® ¬¥­î, ­ã¦­® ¯®¤®¦¤ âì, ¯®ª  ®­® § ªà®¥âáï:
  77.         cmp     [menu_opened],0
  78.         je      @f
  79.  
  80.         mcall   68,1    ; ¯¥à¥ª«î稬áï ­  á«¥¤ãî騩 ¯®â®ª á¨á⥬ë
  81.                         ; ¡®«¥¥ íä䥪⨢­ë© ᯮᮡ § ¤¥à¦ª¨ 祬 mcall 5
  82.         jmp     @b
  83. ;--------------------------------------
  84. align 4
  85. @@:
  86. ;   ⥯¥àì ¬®¦­® ᬥ«® § ¯ã᪠âì ¯à®æ¥áá (¯®â®ª) ¬¥­î
  87.         mcall   51,1,start_wnd,stack_wnd
  88.         jmp     still
  89. ;------------------------------------------------------------------------------
  90. align 4
  91. exit_menu:            ; ¥á«¨ ¢ë室¨¬ ¨§ ¬¥­î, ­ ¤® § ¯¨á âì ¢ [menu_opened] 0
  92.         mov     [menu_opened],0
  93. ;--------------------------------------
  94. align 4
  95. exit:                 ; á ¬ë ¨¤ñ¬, ª®£¤  ¢ë室¨¬ ¨§ ®á­®¢­®£® ¯à®æ¥áá 
  96.         or      eax,-1        ; eax = -1
  97.         mcall
  98. ;------------------------------------------------------------------------------
  99. ; §¤¥áì áâ àâã¥â ¯à®æ¥áá ¬¥­î
  100. ;------------------------------------------------------------------------------
  101. align 4
  102. start_wnd:
  103.         mov     [menu_opened],1
  104. ; ãáâ ­®¢¨¬ ¬ áªã ¦¥« ¥¬ëå ᮡë⨩: ¬¥­î + ª­®¯ª¨ + ¯¥à¥à¨á®¢ª 
  105.         mcall   40,100101b
  106. ;------------------------------------------------------------------------------
  107. align 4
  108. red:
  109.         call    draw_window
  110. ;------------------------------------------------------------------------------
  111. align 4
  112. still2:             ; £« ¢­ë© 横« ¯à®æ¥áá  ¬¥­î
  113.         mcall   10      ; ¦¤ñ¬ ᮡëâ¨ï
  114.  
  115.         cmp     eax,1       ; ¯¥à¥à¨á®¢ª ?
  116.         je      red
  117.        
  118.         cmp     eax,3       ; ª­®¯ª ?
  119.         je      button
  120.        
  121.         cmp     eax,6       ; ¬ëèì?
  122.         je      mouse
  123.  
  124.         jmp     still2      ; ¢¥à­ñ¬áï ¢ ­ ç «® £« ¢­®£® 横« 
  125. ;------------------------------------------------------------------------------
  126. align 4
  127. ; Ž€Ž’—ˆŠ Œ›˜ˆ
  128. mouse:            ; ª®£¤  ¯®«ì§®¢ â¥«ì ­ ¦¬ñâ ª­®¯ªã ¬ëè¨, § ªà®¥¬áï
  129.         mcall   37,2    ; ª ª¨¥ ª­®¯ª¨ ­ ¦ âë?
  130.         test    eax,eax   ; ­¨ª ª¨¥? - ⮣¤  ¯à¥ªà á­®! ¢¥à­ñ¬áï ¢ £« ¢­ë© 横«
  131.         jz      still2
  132.  
  133.         mcall   37,0
  134.  
  135.         mov     esi, eax
  136.         shr     esi, 16
  137.         movzx   edi, ax
  138.         mcall   9, procinfo, -1
  139.        
  140.         mov     eax, [procinfo.box.left]
  141.         cmp     esi, eax
  142.         jl      exit_menu
  143.  
  144.         add     eax, [procinfo.box.width]
  145.         cmp     esi, eax
  146.         jge     exit_menu
  147.  
  148.         mov     eax, [procinfo.box.top]
  149.         cmp     edi, eax
  150.         jl      exit_menu
  151.  
  152.         add     eax, [procinfo.box.height]
  153.         cmp     edi, eax
  154.         jge     exit_menu
  155.  
  156.         jmp     still2
  157. ;------------------------------------------------------------------------------
  158. align 4
  159. ; €†€’€ ŠŽŠ€
  160. button:
  161.         mcall   17      ; ¯®«ãç¨âì ¨¤¥­â¨ä¨ª â®à ­ ¦ â®© ª­®¯ª¨
  162.  
  163.         sub     ah,10         ; áà ¢­¨¢ ¥¬ á 10
  164.         jl      nofuncbtns    ; ¥á«¨ ¬¥­ìè¥ - § ªà뢠¥¬ ¬¥­î
  165.  
  166.         movzx   ebx,ah        ; ¯®«ã稫¨ ­®¬¥à ¯à®£à ¬¬ë ¢ ᯨ᪥ ¢ ebx
  167.         mov     esi,[startapps + ebx*4]
  168.         mov     edi,start_info.path
  169.         cld
  170. ;--------------------------------------
  171. align 4
  172. @@:
  173.         lodsb
  174.         stosb
  175.         test    al,al
  176.         jnz     @b
  177.         mcall   70, start_info
  178.  
  179. ;       mov     eax,5         ; ¯®¤®¦¤ñ¬, ¯®ª  ¯à®£à ¬¬  § ¯ãáâ¨âìáï
  180. ;       mov     ebx,1         ;   â® ¥ñ ®ª­® ­¥ ¡ã¤¥â ®âà¨á®¢ ­® (¡ £ ¢ ï¤à¥???)
  181. ;       mcall          ; à áª®¬¬¥­â¨àã©â¥ í⨠áâப¨, ¥á«¨ ã ¢ á ¯à®¡«¥¬ë
  182.                        ; á ®âà¨á®¢ª®©
  183. ;--------------------------------------
  184. align 4
  185. nofuncbtns:           ; § ªà뢠¥¬ ¬¥­î
  186.         jmp     exit_menu
  187. ;------------------------------------------------------------------------------
  188. _BTNS_            = 6     ; ª®«¨ç¥á⢮ ª­®¯®ª ("¯ã­ªâ®¢ ¬¥­î")
  189.  
  190. if lang eq ru
  191.   font            = 0x00000000
  192.   string_length   = 20          ; ¤«¨­  áâப¨
  193.   wnd_x_size      = 133         ; è¨à¨­  ®ª­ 
  194.   title_pos      = 36 shl 16 + 7
  195. else
  196.   font            = 0x10000000
  197.   string_length   = 12          ; ¤«¨­  áâப¨
  198.   wnd_x_size      = 105         ; è¨à¨­  ®ª­ 
  199.   title_pos      = 23 shl 16 + 7
  200. end if
  201. ;------------------------------------------------------------------------------
  202. ;*******************************
  203. ;********  ˆ‘“…Œ ŽŠŽ  ********
  204. ;*******************************
  205. draw_window:
  206.         mcall   12,1    ; ­ ç¨­ ¥¬ "à¨á®¢ âì"
  207.  
  208.         mov     eax,[curx1]      ; ⥪ã騥 ª®®à¤¨­ âë ªãàá®à 
  209.         mov     [curx],eax       ; § ¯¨è¥¬ ¢ ª®®à¤¨­ âë ®ª­ 
  210.         mov     eax,[cury1]
  211.         mov     [cury],eax
  212. ; ⥯¥àì ¡ã¤¥¬ áç¨â âì ª®®à¤¨­ âë ®ª­ , çâ®¡ë ®­® §  ªà © íªà ­  ­¥ ¢ë«¥§«®
  213.         mcall   14              ; ¯®«ã稬 à §¬¥à íªà ­ 
  214.  
  215.         mov     ebx,eax
  216.         shr     eax,16                  ; ¢ eax - x_screen
  217.         and     ebx,0xffff              ; ¢ ebx - y_screen
  218.         add     eax,-wnd_x_size         ; eax = [x_screen - è¨à¨­  ®ª­ ]
  219.         add     ebx,-_BTNS_*15-21       ; ebx = [y_screen - ¢ëá®â  ®ª­ ]
  220.  
  221.         cmp     eax,[curx]
  222.         jg      .okx                    ; ¥á«¨ ®ª­® ᫨誮¬ ¡«¨§ª® ª ¯à ¢®¬ã ªà î,
  223.         add     [curx],-wnd_x_size      ; ᤢ¨­¥¬ ¥£® ¢«¥¢® ­  100
  224. ;--------------------------------------
  225. align 4
  226. .okx:
  227.         cmp     ebx, [cury]
  228.         jg      .oky                    ; ¯® ¢¥à⨪ «¨ â®ç­® â ª¦¥
  229.         add     [cury], -_BTNS_*15-21
  230. ;--------------------------------------
  231. align 4
  232. .oky:
  233.         xor     eax, eax           ; äã­ªæ¨ï 0 - ᮧ¤ âì ®ª­®
  234.         mov     ebx, [curx]        ;  ebx = [ª®®à¤¨­ â  ¯® x] shl 16 + [è¨à¨­ ]
  235.         shl     ebx, 16
  236.         add     ebx, wnd_x_size
  237.         mov     ecx, [cury]        ;  ecx = [ª®®à¤¨­ â  ¯® y] shl 16 + [¢ëá®â ]
  238.         shl     ecx, 16
  239.         add     ecx, _BTNS_*15+21
  240.         mov     edx, [sc.work]     ;  æ¢¥â à ¡®ç¥© ®¡« áâ¨
  241.         mov     esi, [sc.grab]     ;  æ¢¥â § £®«®¢ª 
  242.         or      esi, 0x81000000
  243.         mov     edi, [sc.frame]    ;  æ¢¥â à ¬ª¨
  244.         mcall
  245.  
  246.         mov     eax, 4             ; § £®«®¢®ª
  247.         mov     ebx, title_pos    ;  [x] shl 16 + [y]
  248.         mov     ecx, [sc.grab_text];  èà¨äâ ¨ 梥â (á¥àë©)
  249.         or      ecx, 0x10000000
  250.  
  251.         push    ecx
  252.         push    ecx
  253.         xor     edx,edx
  254. ;--------------------------------------
  255. align 4
  256. .dec_color:
  257.         sub     byte [esp+edx], 0x33
  258.         jae     @f
  259.         mov     byte [esp+edx], 0
  260. ;--------------------------------------
  261. align 4
  262. @@:
  263.         inc     edx
  264.         jnp     .dec_color
  265.         pop     ecx
  266.         mov     edx, title        ;   ¤à¥á § £®«®¢ª 
  267.         mov     esi, title.size   ;  ¤«¨­  § £®«®¢ª  ("M E N U")
  268.         mcall
  269.         pop     ecx
  270.         add     ebx, 1 shl 16      ;  á¤¢¨­¥¬ ¢¯à ¢® ­  1
  271.         mcall
  272.  
  273.         mov     ebx, 1*65536+wnd_x_size-2  ; ­ ç¨­ ¥¬ ¤¥« âì ª­®¯ª¨
  274.         mov     ecx, 20*65536+15
  275.         mov     edx, 10 or 0x40000000 ; ¡¨â 30 ãáâ ­®¢«¥­ => ª­®¯ª  ­¥ à¨áã¥âáï
  276.  
  277.         mov     edi,_BTNS_           ; ª®«¨ç¥á⢮ ª­®¯®ª (áçñâ稪)
  278. ;--------------------------------------
  279. align 4
  280. newbtn:              ; ­ ç «® 横« 
  281.         mcall   8               ;  á®§¤ ñ¬ ª­®¯ªã
  282.  
  283.                              ;  ¯¨è¥¬ ⥪áâ ­  ª­®¯ª¥
  284.         pushad               ;   ᯠᠥ¬ ॣ¨áâàë
  285.         shr     ecx, 16
  286.         and     ebx, 0xffff0000
  287.         add     ebx, ecx             ;   ebx = [x] shl 16 + [y];
  288.         add     ebx, 10*65536+4      ;   ebx += ᬥ饭¨¥ ®â­®á¨â¥«ì­® ªà ï ª­®¯ª¨;
  289.         mov     ecx, [sc.work_text]  ;   èà¨äâ ¨ 梥â
  290.         or      ecx, font
  291.         add     edx, -10             ;   edx = ­®¬¥à ª­®¯ª¨;
  292.         imul    edx, string_length   ;   edx *= ¤«¨­  áâப¨;
  293.         add     edx, text            ;   edx += text;  â¥¯¥àì ¢ edx  ¤à¥á áâப¨
  294.         mov     esi, string_length   ;   ¢ esi - ¤«¨­  áâப¨
  295.         mcall   4
  296.         popad
  297.  
  298.         inc     edx                  ;  ­®¬¥à ª­®¯ª¨++;
  299.         add     ecx,15*65536         ;  ã¢¥«¨ç¨¬ ᬥ饭¨¥ ¯® y
  300.         dec     edi                  ;  ã¬¥­ì訬 áçñâ稪
  301.         jnz     newbtn               ; ¥á«¨ ­¥ ­®«ì, ¯®¢â®à¨¬ ¢áñ ¥éñ à §
  302.  
  303.         mcall   12,2    ; § ª®­ç¨«¨ "à¨á®¢ âì"
  304.         ret                          ; ¢®§¢à â
  305. ;------------------------------------------------------------------------------
  306. align 4
  307. ; „€›… Žƒ€ŒŒ›
  308.  
  309.   macro strtbl name, [string]
  310.   {
  311.    common
  312.      label name dword
  313.    forward
  314.      local str
  315.      dd str
  316.    forward
  317.      str db string
  318.   }
  319.  
  320.   strtbl startapps       ,\
  321.     <"/sys/PIC4",0>     ,\
  322.     <"/sys/DESKTOP",0>  ,\
  323.     <"/sys/ICON",0>,\
  324.     <"/sys/SETUP",0>    ,\
  325.     <"/sys/DEVELOP/BOARD",0> ,\
  326.     <"/sys/CPU",0>
  327.    
  328.   sz title, "KolibriOS"
  329.  
  330.   lsz text,\
  331.     en, 'Background  ',\
  332.     en, 'Desktop     ',\
  333.     en, 'Icon manager',\
  334.     en, 'Device setup',\
  335.     en, 'Debug board ',\
  336.     en, 'Processes   ',\
  337.     \
  338.     ru, 'ƒ¥­¥à â®à ®¡®¥¢     ',\
  339.     ru, ' áâனª  ®ª®­      ',\
  340.     ru, '“¯à ¢«¥­¨¥ ¨ª®­ª ¬¨ ',\
  341.     ru, ' áâனª  ãáâனá⢠',\
  342.     ru, ' ­¥«ì ®â« ¤ª¨      ',\
  343.     ru, 'à®æ¥ááë            ',\
  344.     \
  345.     et, 'Taust       ',\
  346.     et, 'Töölaud     ',\
  347.     et, 'Ikooni hald.',\
  348.     et, 'Seadme hald.',\
  349.     et, 'Silumis aken',\
  350.     et, 'Protsessid  '
  351.  
  352. ;------------------------------------------------------------------------------
  353. align 4
  354. start_info:
  355.         .mode   dd 7
  356.                 dd 0
  357.         .params dd 0
  358.                 dd 0
  359.                 dd 0
  360.                 db 0
  361.                 dd start_info.path
  362. ;------------------------------------------------------------------------------
  363. IM_END:
  364. align 4
  365. ; …ˆˆ–ˆ€‹ˆ‡ˆŽ‚€›… „€›…
  366.   curx1         dd ?    ; ª®®à¤¨­ âë ªãàá®à 
  367.   cury1         dd ?
  368.   curx          dd ?    ; ª®®à¤¨­ âë ®ª­  ¬¥­î
  369.   cury          dd ?
  370.  
  371.   menu_opened   db ?    ; ®âªàëâ® ¬¥­î ¨«¨ ­¥â? (1-¤ , 0-­¥â)
  372. ;------------------------------------------------------------------------------
  373. align 4
  374. start_info.path rb 256
  375. ;------------------------------------------------------------------------------
  376. align 4
  377. sc      system_colors   ; á¨á⥬­ë¥ 梥â 
  378. ;------------------------------------------------------------------------------
  379. align 4
  380. procinfo process_information    ; ¨­ä®à¬ æ¨ï ® ¯à®æ¥áá¥
  381. ;------------------------------------------------------------------------------
  382. align 4
  383.         rb 512                  ; áâíª ¤«ï ®ª­  ¬¥­î - 墠â¨â ¨ 1 Š¡
  384. stack_wnd:
  385. ;------------------------------------------------------------------------------
  386. align 4
  387.         rb 512
  388. stack_area:
  389. ;------------------------------------------------------------------------------
  390. I_END:
  391. ;------------------------------------------------------------------------------
  392. ; ŠŽ…– Žƒ€ŒŒ›
  393. ;------------------------------------------------------------------------------
  394.