Subversion Repositories Kolibri OS

Rev

Rev 485 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;   MENU EXAMPLE
  3. ;
  4. ;   Compile with FASM for Kolibri
  5. ;
  6.  
  7.   use32
  8.   org    0x0
  9.   db     'MENUET01'    ; 8 byte id
  10.   dd     0x01          ; header version
  11.   dd     start         ; start of code
  12.   dd     i_end         ; size of image
  13.   dd     mem, stacktop, file_name, sys_path
  14.  
  15. include 'lang.inc'
  16. include '../../../../macros.inc'
  17. include '../../../../proc32.inc'
  18. include '../../../../KOSfuncs.inc'
  19. include '../../../../develop/libraries/box_lib/load_lib.mac'
  20. include '../../../../dll.inc'
  21.  
  22. KMENUITEM_NORMAL equ 0
  23. KMENUITEM_SUBMENU equ 1
  24. KMENUITEM_SEPARATOR equ 2
  25.  
  26. @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
  27.  
  28. start:                             ; start of execution
  29.  
  30.         load_libraries l_libs_start,l_libs_end
  31.         mov     ebp,lib_0
  32.         .test_lib_open:
  33.         cmp     dword [ebp+ll_struc_size-4],0
  34.         jz      @f
  35.                 mcall SF_TERMINATE_PROCESS ;exit not correct
  36.         @@:
  37.         add ebp,ll_struc_size
  38.         cmp ebp,l_libs_end
  39.         jl .test_lib_open
  40.  
  41.         mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
  42.         mcall SF_SET_EVENTS_MASK,0x27
  43.  
  44.         ;kmenu initialisation
  45.         stdcall [kmenu_init],sc
  46.         stdcall [ksubmenu_new]
  47.         mov [main_menu], eax
  48.  
  49.         stdcall [ksubmenu_new]
  50.         mov [main_menu_File], eax
  51.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Load, 110
  52.         stdcall [ksubmenu_add], [main_menu_File], eax
  53.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Save, 111
  54.         stdcall [ksubmenu_add], [main_menu_File], eax
  55.         stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
  56.         stdcall [ksubmenu_add], [main_menu_File], eax
  57.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Quit, 112
  58.         stdcall [ksubmenu_add], [main_menu_File], eax
  59.         stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_File, [main_menu_File]
  60.         stdcall [ksubmenu_add], [main_menu], eax
  61.  
  62.         stdcall [ksubmenu_new]
  63.         mov [main_menu_Edit], eax
  64.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Copy, 120
  65.         stdcall [ksubmenu_add], [main_menu_Edit], eax
  66.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Paste, 121
  67.         stdcall [ksubmenu_add], [main_menu_Edit], eax
  68.         stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_Edit, [main_menu_Edit]
  69.         stdcall [ksubmenu_add], [main_menu], eax
  70.  
  71.         stdcall [ksubmenu_new]
  72.         mov [main_menu_Test], eax
  73.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Test1, 130
  74.         stdcall [ksubmenu_add], [main_menu_Test], eax
  75.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Test2, 131
  76.         stdcall [ksubmenu_add], [main_menu_Test], eax
  77.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Test3, 132
  78.         stdcall [ksubmenu_add], [main_menu_Test], eax
  79.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Test4, 133
  80.         stdcall [ksubmenu_add], [main_menu_Test], eax
  81.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Test5, 134
  82.         stdcall [ksubmenu_add], [main_menu_Test], eax
  83.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Test6, 134
  84.         stdcall [ksubmenu_add], [main_menu_Test], eax
  85.         stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_Test, [main_menu_Test]
  86.         stdcall [ksubmenu_add], [main_menu], eax
  87.  
  88.         stdcall [ksubmenu_new]
  89.         mov [main_menu_Help], eax
  90.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_Setup, 140
  91.         stdcall [ksubmenu_add], [main_menu_Help], eax
  92.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_About, 141
  93.         stdcall [ksubmenu_add], [main_menu_Help], eax
  94.         stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_Help, [main_menu_Help]
  95.         stdcall [ksubmenu_add], [main_menu], eax
  96.  
  97.   red:
  98.     call draw_window               ; draw window
  99.         stdcall [kmainmenu_draw], [main_menu]
  100.  
  101. still:
  102.     mcall SF_WAIT_EVENT
  103.  
  104.     cmp  eax,1                     ; redraw request ?
  105.     jz   red                       ; yes jump to it
  106.     cmp  eax,2
  107.     jz   key
  108.     cmp  eax,3
  109.     jz   button
  110.         cmp  eax,6
  111.         jne  @f
  112.                 call mouse
  113.                 jmp still
  114.         @@:
  115.  
  116. key:
  117.     mcall SF_GET_KEY
  118.     jmp  still                     ; start again
  119.  
  120. button:
  121.         mcall SF_GET_BUTTON
  122.  
  123.         mov  [button_press],eax
  124.         shr  dword[button_press],8
  125.         call draw_data
  126.  
  127.         cmp  ah,1                      ; is it the close button
  128.         jne  still                     ; no then jump code
  129.         mcall SF_TERMINATE_PROCESS     ; close this program
  130.  
  131. mouse:
  132.         stdcall [kmainmenu_dispatch_cursorevent], [main_menu]
  133.         ret
  134.  
  135. ;   *********************************************
  136. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  137. ;   *********************************************
  138.  
  139. draw_window:
  140.  
  141.     push eax                       ; save register
  142.     mcall SF_REDRAW,SSF_BEGIN_DRAW
  143.  
  144.     mov  ebx,50*65536              ; [x start] *65536
  145.     add  ebx,[x_size]              ; add [x size]
  146.     mov  ecx,50*65536              ; [y start] *65536
  147.     add  ecx,[y_size]              ; add [y size]
  148.     mcall SF_CREATE_WINDOW,,,0xb3ffffff,,window_text
  149.  
  150.     mov  ebx,1*65536               ; [x start] *65536
  151.     add  ebx,[x_size]              ; add [x size]
  152.     sub  ebx,11                    ; x size - 11
  153.     mov  ecx,[y_size]              ; [y start] *65536
  154.     sub  ecx,47                    ; minus height
  155.     shl  ecx,16                    ; *65536
  156.     add  ecx,17                    ; add height
  157.     mcall SF_DRAW_RECT,,,0x006688dd
  158.  
  159.     mov  ebx,5*65536               ; [x start] *65536
  160.     add  ebx,[y_size]              ; add [y start]
  161.     sub  ebx,42                    ; move up
  162.     xor  ecx,ecx                   ; text colour
  163.     mcall SF_DRAW_TEXT,,,button_no,9
  164.  
  165.         call draw_data
  166.  
  167.     mcall SF_REDRAW,SSF_END_DRAW
  168.     pop  eax                       ; restore register
  169.     ret                            ; return
  170.  
  171. ; *********** DRAW DATA ***********
  172.  
  173. draw_data:
  174.  
  175.     push eax                       ; save register
  176.     mov  ecx,[y_size]              ; [y start]
  177.     sub  ecx,45                    ; move position
  178.     shl  ecx,16                    ; *65536
  179.     add  ecx,13                    ; [y size]
  180.     mov  edx,0x00aaaaaa            ; bar colour
  181.     mcall SF_DRAW_RECT, (67 shl 16)+23
  182.  
  183.     mov  ebx,0x00030000            ; display 3 decimal characters
  184.     mov  ecx,[button_press]        ; menu id
  185.     mov  edx,70*65536              ; [x start] *65536
  186.     add  edx,[y_size]              ; +[y start]
  187.     sub  edx,42                    ; move position
  188.     xor  esi,esi                   ; text colour
  189.     mcall SF_DRAW_NUMBER
  190.     pop  eax                       ; restore register
  191.  
  192.     ret                            ; return
  193.  
  194. ; ***************** DATA AREA ******************
  195.  
  196. x_size:       dd 381               ; window x size
  197. y_size:       dd 200               ; window y size
  198.  
  199. if lang eq ru
  200. window_text   db 'à¨¬¥à ¬¥­î',0
  201. button_no     db 'Š­®¯ª  N:'
  202. else
  203. window_text   db 'Menu example',0  ; grab bar text
  204. button_no     db 'Button N:'  ; status bar text
  205. end if
  206.  
  207. main_menu dd 0
  208. main_menu_File dd 0
  209. main_menu_Edit dd 0
  210. main_menu_Test dd 0
  211. main_menu_Help dd 0
  212.  
  213. if lang eq ru
  214.  
  215. sz_File db '” ©«',0
  216. sz_Load db 'Žâªàëâì',0
  217. sz_Save db '‘®åà ­¨âì',0
  218. sz_Quit db '‚ë室',0
  219.  
  220. sz_Edit db 'à ¢ª ',0
  221. sz_Copy db 'Š®¯¨à®¢ âì',0
  222. sz_Paste db '‚áâ ¢¨âì',0
  223.  
  224. sz_Test db '’¥áâ',0
  225. sz_Test1 db '’¥áâ 1',0
  226. sz_Test2 db '’¥áâ 2',0
  227. sz_Test3 db '’¥áâ 3',0
  228. sz_Test4 db '’¥áâ 4',0
  229. sz_Test5 db '’¥áâ 5',0
  230. sz_Test6 db '’¥áâ 6',0
  231.  
  232. sz_Help db '®¬®éì',0
  233. sz_Setup db ' áâனª¨',0
  234. sz_About db 'Ž ¯à®£à ¬¬¥..',0
  235.  
  236. else
  237.  
  238. sz_File db 'File',0
  239. sz_Load db 'Load',0
  240. sz_Save db 'Save',0
  241. sz_Quit db 'Quit',0
  242.  
  243. sz_Edit db 'Edit',0
  244. sz_Copy db 'Copy',0
  245. sz_Paste db 'Paste',0
  246.  
  247. sz_Test db 'Test',0
  248. sz_Test1 db 'Test 1',0
  249. sz_Test2 db 'Test 2',0
  250. sz_Test3 db 'Test 3',0
  251. sz_Test4 db 'Test 4',0
  252. sz_Test5 db 'Test 5',0
  253. sz_Test6 db 'Test 6',0
  254.  
  255. sz_Help db 'Help',0
  256. sz_Setup db 'Setup',0
  257. sz_About db 'About..',0
  258.  
  259. end if
  260.  
  261. button_press  dd 0
  262.  
  263. align 4
  264. system_dir_0 db '/sys/lib/'
  265. lib_name_0 db 'kmenu.obj',0
  266.  
  267. if lang eq ru
  268.         head_f_i:
  269.         head_f_l db '‘¨á⥬­ ï ®è¨¡ª ',0
  270.         err_msg_found_lib_0 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'kmenu.obj',39,0
  271.         err_msg_import_0 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'kmenu',39,0
  272. else
  273.         head_f_i:
  274.         head_f_l db 'System error',0
  275.         err_msg_found_lib_0 db 'Sorry I cannot found library ',39,'kmenu.obj',39,0
  276.         err_msg_import_0 db 'Error on load import library ',39,'kmenu.obj',39,0
  277. end if
  278.  
  279. align 4
  280. l_libs_start:
  281.         lib_0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
  282.                 err_msg_found_lib_0, head_f_l, import_libkmenu,err_msg_import_0,head_f_i
  283. l_libs_end:
  284.  
  285. align 4
  286. import_libkmenu:
  287.         kmenu_init      dd akmenu_init
  288.         kmainmenu_draw  dd akmainmenu_draw
  289.         kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
  290.         ksubmenu_new    dd aksubmenu_new
  291.         ksubmenu_delete dd aksubmenu_delete
  292.         ksubmenu_draw   dd aksubmenu_draw
  293.         ksubmenu_add    dd aksubmenu_add
  294.         kmenuitem_new   dd akmenuitem_new
  295.         kmenuitem_delete dd akmenuitem_delete
  296.         kmenuitem_draw  dd akmenuitem_draw
  297. dd 0,0
  298.         akmenu_init     db 'kmenu_init',0
  299.         akmainmenu_draw db 'kmainmenu_draw',0
  300.         akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
  301.         aksubmenu_new   db 'ksubmenu_new',0
  302.         aksubmenu_delete db 'ksubmenu_delete',0
  303.         aksubmenu_draw  db 'ksubmenu_draw',0
  304.         aksubmenu_add   db 'ksubmenu_add',0
  305.         akmenuitem_new  db 'kmenuitem_new',0
  306.         akmenuitem_delete db 'kmenuitem_delete',0
  307.         akmenuitem_draw  db 'kmenuitem_draw',0
  308.  
  309. i_end:
  310.         sc system_colors
  311.         rb 2048
  312. stacktop:
  313.         sys_path rb 2048
  314.         file_name rb 4096
  315. mem:
  316.