Subversion Repositories Kolibri OS

Rev

Rev 2135 | 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     ecx,ecx
  53.         mcall   9,procinfo
  54.  
  55.         inc     eax          ; ⥯¥àì ¢ eax ᮤ¥à¦¨âáï ç¨á«® ¯à®æ¥áᮢ + 1
  56.         mov     [processes],eax
  57.         mov     ecx,1
  58. ;--------------------------------------
  59. align 4
  60. new_process:
  61.         pushad
  62. ; ¯®«ã稬 ¨­ä®à¬ æ¨î ® ¯à®æ¥áá¥; ­®¬¥à - ¢ ecx
  63.         mcall   9,procinfo
  64. ; ª®®à¤¨­ âë ªãàá®à 
  65.         xor     ebx,ebx
  66.         mcall   37
  67.  
  68.         mov     ebx,eax         ; eax = cursor_x
  69.         shr     eax,16          ; ebx = cursor_y
  70.         and     ebx,0xffff
  71.         mov     [curx1],eax     ; curx1 = cursor_x
  72.         mov     [cury1],ebx     ; cury1 = cursor_y
  73. ; \begin{diamond}[18.09.2006]
  74. ; ignore minimized windows
  75.         test    [procinfo.wnd_state], 2
  76.         jnz     ne_goden
  77. ; \end{diamond}[18.09.2006]
  78.         mov     eax,[procinfo.box.left]   ; eax = wnd_x_start
  79.         mov     ebx,[procinfo.box.top]    ; ebx = wnd_y_start
  80.  
  81.         mov     ecx,[procinfo.box.width]
  82.         add     ecx,eax                  ; ecx = wnd_x_end
  83.         mov     edx,[procinfo.box.height]
  84.         add     edx,ebx                  ; ecx = wnd_y_end
  85.  
  86.         cmp     eax,[curx1]  ; wnd_x_start > cursor_x => ªãàá®à «¥¢¥¥ ®ª­ 
  87.         jg      ne_goden
  88.  
  89.         cmp     ecx,[curx1]  ; wnd_x_end   < cursor_x => ªãàá®à ¯à ¢¥¥ ®ª­ 
  90.         jl      ne_goden
  91.  
  92.         cmp     ebx,[cury1]  ; wnd_y_start > cursor_y => ªãàá®à ¢ëè¥ ®ª­ 
  93.         jg      ne_goden
  94.  
  95.         cmp     edx,[cury1]  ; wnd_y_end   < cursor_y => ªãàá®à ­¨¦¥ ®ª­ 
  96.         jl      ne_goden
  97. ;--------------------------------------
  98. align 4
  99. goden:               ; ª«¨ª ¡ë« ¢­ãâਠª ª®£®-â® ®ª­ , ¯®í⮬㠭¨ç¥£® ­¥ ¤¥« ¥¬
  100.         popad
  101.         jmp     still
  102. ;--------------------------------------
  103. align 4
  104. ne_goden:            ; ª«¨ª ¡ë« á­ à㦨 à áᬠâਢ ¥¬®£® ®ª­ , ¯®í⮬ã
  105.         popad
  106.         inc     ecx
  107.         cmp     ecx,[processes]
  108.         jl      new_process  ; «¨¡® ᬮਬ á«¥¤ãî饥 ®ª­®, «¨¡® § ¯ã᪠¥¬ ¬¥­î
  109. ;--------------------------------------
  110. align 4
  111. @@:             ; ¯®¤®¦¤ñ¬, ¯®ª  ¯®«ì§®¢ â¥«ì ­¥ ®â¯ãá⨫ ¯à ¢ãî ª­®¯ªã ¬ëè¨
  112.         mcall   37,2    ;   ­ ¦ âë «¨ ª­®¯ª¨ ¬ëè¨?
  113.         test    eax,ebx ; ¥á«¨ ®â¯ãá⨫, (eax != 2)
  114.         jz      @f      ;   ¨¤ñ¬ ¢ ­ ç «® £« ¢­®£® 横« 
  115.  
  116.         mcall   68,1    ; ¨­ ç¥ ¯¥à¥ª«î稬áï ­  á«¥¤ãî騩 ¯®â®ª á¨áâ¥¬ë ¨ ª®£¤ 
  117.         jmp     @b      ; ¢ë¯®«­¥­¨¥ ¢¥à­¥âáï í⮬㠯®â®ªã, ¯à®¢¥à¨¬ ¬ëèì ®¯ïâì
  118. ;--------------------------------------
  119. align 4
  120. @@:
  121. ; ¥á«¨ 㦥 ¡ë«® ®âªàëâ® ¬¥­î, ­ã¦­® ¯®¤®¦¤ âì, ¯®ª  ®­® § ªà®¥âáï:
  122.         cmp     [menu_opened],0
  123.         je      @f
  124.  
  125.         mcall   68,1    ; ¯¥à¥ª«î稬áï ­  á«¥¤ãî騩 ¯®â®ª á¨á⥬ë
  126.                         ; ¡®«¥¥ íä䥪⨢­ë© ᯮᮡ § ¤¥à¦ª¨ 祬 mcall 5
  127.         jmp     @b
  128. ;--------------------------------------
  129. align 4
  130. @@:
  131. ;   ⥯¥àì ¬®¦­® ᬥ«® § ¯ã᪠âì ¯à®æ¥áá (¯®â®ª) ¬¥­î
  132.         mcall   51,1,start_wnd,stack_wnd
  133.         jmp     still
  134. ;------------------------------------------------------------------------------
  135. align 4
  136. exit_menu:            ; ¥á«¨ ¢ë室¨¬ ¨§ ¬¥­î, ­ ¤® § ¯¨á âì ¢ [menu_opened] 0
  137.         mov     [menu_opened],0
  138. ;--------------------------------------
  139. align 4
  140. exit:                 ; á ¬ë ¨¤ñ¬, ª®£¤  ¢ë室¨¬ ¨§ ®á­®¢­®£® ¯à®æ¥áá 
  141.         or      eax,-1        ; eax = -1
  142.         mcall
  143. ;------------------------------------------------------------------------------
  144. ; §¤¥áì áâ àâã¥â ¯à®æ¥áá ¬¥­î
  145. ;------------------------------------------------------------------------------
  146. align 4
  147. start_wnd:
  148.         mov     [menu_opened],1
  149. ; ãáâ ­®¢¨¬ ¬ áªã ¦¥« ¥¬ëå ᮡë⨩: ¬¥­î + ª­®¯ª¨ + ¯¥à¥à¨á®¢ª 
  150.         mcall   40,100101b
  151. ;------------------------------------------------------------------------------
  152. align 4
  153. red:
  154.         call    draw_window
  155. ;------------------------------------------------------------------------------
  156. align 4
  157. still2:             ; £« ¢­ë© 横« ¯à®æ¥áá  ¬¥­î
  158.         mcall   10      ; ¦¤ñ¬ ᮡëâ¨ï
  159.  
  160.         cmp     eax,1       ; ¯¥à¥à¨á®¢ª ?
  161.         je      red
  162.        
  163.         cmp     eax,3       ; ª­®¯ª ?
  164.         je      button
  165.        
  166.         cmp     eax,6       ; ¬ëèì?
  167.         je      mouse
  168.  
  169.         jmp     still2      ; ¢¥à­ñ¬áï ¢ ­ ç «® £« ¢­®£® 横« 
  170. ;------------------------------------------------------------------------------
  171. align 4
  172. ; Ž€Ž’—ˆŠ Œ›˜ˆ
  173. mouse:            ; ª®£¤  ¯®«ì§®¢ â¥«ì ­ ¦¬ñâ ª­®¯ªã ¬ëè¨, § ªà®¥¬áï
  174.         mcall   37,2    ; ª ª¨¥ ª­®¯ª¨ ­ ¦ âë?
  175.         test    eax,eax   ; ­¨ª ª¨¥? - ⮣¤  ¯à¥ªà á­®! ¢¥à­ñ¬áï ¢ £« ¢­ë© 横«
  176.         jz      still2
  177.  
  178.         mcall   37,0
  179.  
  180.         mov     esi, eax
  181.         shr     esi, 16
  182.         movzx   edi, ax
  183.         mcall   9, procinfo, -1
  184.        
  185.         mov     eax, [procinfo.box.left]
  186.         cmp     esi, eax
  187.         jl      exit_menu
  188.  
  189.         add     eax, [procinfo.box.width]
  190.         cmp     esi, eax
  191.         jge     exit_menu
  192.  
  193.         mov     eax, [procinfo.box.top]
  194.         cmp     edi, eax
  195.         jl      exit_menu
  196.  
  197.         add     eax, [procinfo.box.height]
  198.         cmp     edi, eax
  199.         jge     exit_menu
  200.  
  201.         jmp     still2
  202. ;------------------------------------------------------------------------------
  203. align 4
  204. ; €†€’€ ŠŽŠ€
  205. button:
  206.         mcall   17      ; ¯®«ãç¨âì ¨¤¥­â¨ä¨ª â®à ­ ¦ â®© ª­®¯ª¨
  207.  
  208.         sub     ah,10         ; áà ¢­¨¢ ¥¬ á 10
  209.         jl      nofuncbtns    ; ¥á«¨ ¬¥­ìè¥ - § ªà뢠¥¬ ¬¥­î
  210.  
  211.         movzx   ebx,ah        ; ¯®«ã稫¨ ­®¬¥à ¯à®£à ¬¬ë ¢ ᯨ᪥ ¢ ebx
  212.         mov     esi,[startapps + ebx*4]
  213.         mov     edi,start_info.path
  214.         cld
  215. ;--------------------------------------
  216. align 4
  217. @@:
  218.         lodsb
  219.         stosb
  220.         test    al,al
  221.         jnz     @b
  222.         mcall   70, start_info
  223.  
  224. ;       mov     eax,5         ; ¯®¤®¦¤ñ¬, ¯®ª  ¯à®£à ¬¬  § ¯ãáâ¨âìáï
  225. ;       mov     ebx,1         ;   â® ¥ñ ®ª­® ­¥ ¡ã¤¥â ®âà¨á®¢ ­® (¡ £ ¢ ï¤à¥???)
  226. ;       mcall          ; à áª®¬¬¥­â¨àã©â¥ í⨠áâப¨, ¥á«¨ ã ¢ á ¯à®¡«¥¬ë
  227.                        ; á ®âà¨á®¢ª®©
  228. ;--------------------------------------
  229. align 4
  230. nofuncbtns:           ; § ªà뢠¥¬ ¬¥­î
  231.         jmp     exit_menu
  232. ;------------------------------------------------------------------------------
  233. _BTNS_            = 6     ; ª®«¨ç¥á⢮ ª­®¯®ª ("¯ã­ªâ®¢ ¬¥­î")
  234.  
  235. if lang eq ru
  236.   font            = 0x00000000
  237.   string_length   = 20          ; ¤«¨­  áâப¨
  238.   wnd_x_size      = 133         ; è¨à¨­  ®ª­ 
  239.   title_pos      = 36 shl 16 + 7
  240. else
  241.   font            = 0x10000000
  242.   string_length   = 12          ; ¤«¨­  áâப¨
  243.   wnd_x_size      = 105         ; è¨à¨­  ®ª­ 
  244.   title_pos      = 23 shl 16 + 7
  245. end if
  246. ;------------------------------------------------------------------------------
  247. ;*******************************
  248. ;********  ˆ‘“…Œ ŽŠŽ  ********
  249. ;*******************************
  250. draw_window:
  251.         mcall   12,1    ; ­ ç¨­ ¥¬ "à¨á®¢ âì"
  252.  
  253.         mov     eax,[curx1]      ; ⥪ã騥 ª®®à¤¨­ âë ªãàá®à 
  254.         mov     [curx],eax       ; § ¯¨è¥¬ ¢ ª®®à¤¨­ âë ®ª­ 
  255.         mov     eax,[cury1]
  256.         mov     [cury],eax
  257. ; ⥯¥àì ¡ã¤¥¬ áç¨â âì ª®®à¤¨­ âë ®ª­ , çâ®¡ë ®­® §  ªà © íªà ­  ­¥ ¢ë«¥§«®
  258.         mcall   14              ; ¯®«ã稬 à §¬¥à íªà ­ 
  259.  
  260.         mov     ebx,eax
  261.         shr     eax,16                  ; ¢ eax - x_screen
  262.         and     ebx,0xffff              ; ¢ ebx - y_screen
  263.         add     eax,-wnd_x_size         ; eax = [x_screen - è¨à¨­  ®ª­ ]
  264.         add     ebx,-_BTNS_*15-21       ; ebx = [y_screen - ¢ëá®â  ®ª­ ]
  265.  
  266.         cmp     eax,[curx]
  267.         jg      .okx                    ; ¥á«¨ ®ª­® ᫨誮¬ ¡«¨§ª® ª ¯à ¢®¬ã ªà î,
  268.         add     [curx],-wnd_x_size      ; ᤢ¨­¥¬ ¥£® ¢«¥¢® ­  100
  269. ;--------------------------------------
  270. align 4
  271. .okx:
  272.         cmp     ebx, [cury]
  273.         jg      .oky                    ; ¯® ¢¥à⨪ «¨ â®ç­® â ª¦¥
  274.         add     [cury], -_BTNS_*15-21
  275. ;--------------------------------------
  276. align 4
  277. .oky:
  278.         xor     eax, eax           ; äã­ªæ¨ï 0 - ᮧ¤ âì ®ª­®
  279.         mov     ebx, [curx]        ;  ebx = [ª®®à¤¨­ â  ¯® x] shl 16 + [è¨à¨­ ]
  280.         shl     ebx, 16
  281.         add     ebx, wnd_x_size
  282.         mov     ecx, [cury]        ;  ecx = [ª®®à¤¨­ â  ¯® y] shl 16 + [¢ëá®â ]
  283.         shl     ecx, 16
  284.         add     ecx, _BTNS_*15+21
  285.         mov     edx, [sc.work]     ;  æ¢¥â à ¡®ç¥© ®¡« áâ¨
  286.         mov     esi, [sc.grab]     ;  æ¢¥â § £®«®¢ª 
  287.         or      esi, 0x81000000
  288.         mov     edi, [sc.frame]    ;  æ¢¥â à ¬ª¨
  289.         mcall
  290.  
  291.         mov     eax, 4             ; § £®«®¢®ª
  292.         mov     ebx, title_pos    ;  [x] shl 16 + [y]
  293.         mov     ecx, [sc.grab_text];  èà¨äâ ¨ 梥â (á¥àë©)
  294.         or      ecx, 0x10000000
  295.  
  296.         push    ecx
  297.         push    ecx
  298.         xor     edx,edx
  299. ;--------------------------------------
  300. align 4
  301. .dec_color:
  302.         sub     byte [esp+edx], 0x33
  303.         jae     @f
  304.         mov     byte [esp+edx], 0
  305. ;--------------------------------------
  306. align 4
  307. @@:
  308.         inc     edx
  309.         jnp     .dec_color
  310.         pop     ecx
  311.         mov     edx, title        ;   ¤à¥á § £®«®¢ª 
  312.         mov     esi, title.size   ;  ¤«¨­  § £®«®¢ª  ("M E N U")
  313.         mcall
  314.         pop     ecx
  315.         add     ebx, 1 shl 16      ;  á¤¢¨­¥¬ ¢¯à ¢® ­  1
  316.         mcall
  317.  
  318.         mov     ebx, 1*65536+wnd_x_size-2  ; ­ ç¨­ ¥¬ ¤¥« âì ª­®¯ª¨
  319.         mov     ecx, 20*65536+15
  320.         mov     edx, 10 or 0x40000000 ; ¡¨â 30 ãáâ ­®¢«¥­ => ª­®¯ª  ­¥ à¨áã¥âáï
  321.  
  322.         mov     edi,_BTNS_           ; ª®«¨ç¥á⢮ ª­®¯®ª (áçñâ稪)
  323. ;--------------------------------------
  324. align 4
  325. newbtn:              ; ­ ç «® 横« 
  326.         mcall   8               ;  á®§¤ ñ¬ ª­®¯ªã
  327.  
  328.                              ;  ¯¨è¥¬ ⥪áâ ­  ª­®¯ª¥
  329.         pushad               ;   ᯠᠥ¬ ॣ¨áâàë
  330.         shr     ecx, 16
  331.         and     ebx, 0xffff0000
  332.         add     ebx, ecx             ;   ebx = [x] shl 16 + [y];
  333.         add     ebx, 10*65536+4      ;   ebx += ᬥ饭¨¥ ®â­®á¨â¥«ì­® ªà ï ª­®¯ª¨;
  334.         mov     ecx, [sc.work_text]  ;   èà¨äâ ¨ 梥â
  335.         or      ecx, font
  336.         add     edx, -10             ;   edx = ­®¬¥à ª­®¯ª¨;
  337.         imul    edx, string_length   ;   edx *= ¤«¨­  áâப¨;
  338.         add     edx, text            ;   edx += text;  â¥¯¥àì ¢ edx  ¤à¥á áâப¨
  339.         mov     esi, string_length   ;   ¢ esi - ¤«¨­  áâப¨
  340.         mcall   4
  341.         popad
  342.  
  343.         inc     edx                  ;  ­®¬¥à ª­®¯ª¨++;
  344.         add     ecx,15*65536         ;  ã¢¥«¨ç¨¬ ᬥ饭¨¥ ¯® y
  345.         dec     edi                  ;  ã¬¥­ì訬 áçñâ稪
  346.         jnz     newbtn               ; ¥á«¨ ­¥ ­®«ì, ¯®¢â®à¨¬ ¢áñ ¥éñ à §
  347.  
  348.         mcall   12,2    ; § ª®­ç¨«¨ "à¨á®¢ âì"
  349.         ret                          ; ¢®§¢à â
  350. ;------------------------------------------------------------------------------
  351. align 4
  352. ; „€›… Žƒ€ŒŒ›
  353.  
  354.   macro strtbl name, [string]
  355.   {
  356.    common
  357.      label name dword
  358.    forward
  359.      local str
  360.      dd str
  361.    forward
  362.      str db string
  363.   }
  364.  
  365.   strtbl startapps       ,\
  366.     <"/sys/PIC4",0>     ,\
  367.     <"/sys/DESKTOP",0>  ,\
  368.     <"/sys/ICON",0>,\
  369.     <"/sys/SETUP",0>    ,\
  370.     <"/sys/VRR",0> ,\
  371.     <"/sys/CPU",0>
  372.    
  373.   sz title, "KolibriOS"
  374.  
  375.   lsz text,\
  376.     en, 'Background  ',\
  377.     en, 'Desktop     ',\
  378.     en, 'Icon manager',\
  379.     en, 'Device setup',\
  380.     en, 'VRR         ',\
  381.     en, 'Processes   ',\
  382.     \
  383.     ru, 'ƒ¥­¥à â®à ®¡®¥¢     ',\
  384.     ru, ' áâனª  ®ª®­      ',\
  385.     ru, '“¯à ¢«¥­¨¥ ¨ª®­ª ¬¨ ',\
  386.     ru, ' áâனª  ãáâனá⢠',\
  387.     ru, ' áâனª  ¬®­¨â®à   ',\
  388.     ru, 'à®æ¥ááë            '
  389. ;------------------------------------------------------------------------------
  390. align 4
  391. start_info:
  392.         .mode   dd 7
  393.                 dd 0
  394.         .params dd 0
  395.                 dd 0
  396.                 dd 0
  397.                 db 0
  398.                 dd start_info.path
  399. ;------------------------------------------------------------------------------
  400. IM_END:
  401. align 4
  402. ; …ˆˆ–ˆ€‹ˆ‡ˆŽ‚€›… „€›…
  403.   processes     dd ?    ; ª®«¨ç¥á⢮ ¯à®æ¥áᮢ ¢ á¨á⥬¥
  404.   curx1         dd ?    ; ª®®à¤¨­ âë ªãàá®à 
  405.   cury1         dd ?
  406.   curx          dd ?    ; ª®®à¤¨­ âë ®ª­  ¬¥­î
  407.   cury          dd ?
  408.  
  409.   menu_opened   db ?    ; ®âªàëâ® ¬¥­î ¨«¨ ­¥â? (1-¤ , 0-­¥â)
  410. ;------------------------------------------------------------------------------
  411. align 4
  412. start_info.path rb 256
  413. ;------------------------------------------------------------------------------
  414. align 4
  415. sc      system_colors   ; á¨á⥬­ë¥ 梥â 
  416. ;------------------------------------------------------------------------------
  417. align 4
  418. procinfo process_information    ; ¨­ä®à¬ æ¨ï ® ¯à®æ¥áá¥
  419. ;------------------------------------------------------------------------------
  420. align 4
  421.         rb 512                  ; áâíª ¤«ï ®ª­  ¬¥­î - 墠â¨â ¨ 1 Š¡
  422. stack_wnd:
  423. ;------------------------------------------------------------------------------
  424. align 4
  425.         rb 512
  426. stack_area:
  427. ;------------------------------------------------------------------------------
  428. I_END:
  429. ;------------------------------------------------------------------------------
  430. ; ŠŽ…– Žƒ€ŒŒ›
  431. ;------------------------------------------------------------------------------
  432.