Rev 485 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ; |
2 | ; MENU EXAMPLE |
||
3 | ; |
||
6224 | IgorA | 4 | ; Compile with FASM for Kolibri |
31 | halyavin | 5 | ; |
6 | |||
7 | use32 |
||
8 | org 0x0 |
||
9 | db 'MENUET01' ; 8 byte id |
||
10 | dd 0x01 ; header version |
||
6224 | IgorA | 11 | dd start ; start of code |
12 | dd i_end ; size of image |
||
13 | dd mem, stacktop, file_name, sys_path |
||
31 | halyavin | 14 | |
6224 | IgorA | 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' |
||
31 | halyavin | 21 | |
6224 | IgorA | 22 | KMENUITEM_NORMAL equ 0 |
23 | KMENUITEM_SUBMENU equ 1 |
||
24 | KMENUITEM_SEPARATOR equ 2 |
||
31 | halyavin | 25 | |
6224 | IgorA | 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 | |||
485 | heavyiron | 97 | red: |
31 | halyavin | 98 | call draw_window ; draw window |
6224 | IgorA | 99 | stdcall [kmainmenu_draw], [main_menu] |
31 | halyavin | 100 | |
101 | still: |
||
6224 | IgorA | 102 | mcall SF_WAIT_EVENT |
31 | halyavin | 103 | |
104 | cmp eax,1 ; redraw request ? |
||
485 | heavyiron | 105 | jz red ; yes jump to it |
6224 | IgorA | 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 | @@: |
||
31 | halyavin | 115 | |
6224 | IgorA | 116 | key: |
117 | mcall SF_GET_KEY |
||
31 | halyavin | 118 | jmp still ; start again |
119 | |||
6224 | IgorA | 120 | button: |
121 | mcall SF_GET_BUTTON |
||
31 | halyavin | 122 | |
6224 | IgorA | 123 | mov [button_press],eax |
124 | shr dword[button_press],8 |
||
125 | call draw_data |
||
31 | halyavin | 126 | |
6224 | IgorA | 127 | cmp ah,1 ; is it the close button |
128 | jne still ; no then jump code |
||
129 | mcall SF_TERMINATE_PROCESS ; close this program |
||
31 | halyavin | 130 | |
6224 | IgorA | 131 | mouse: |
132 | stdcall [kmainmenu_dispatch_cursorevent], [main_menu] |
||
133 | ret |
||
31 | halyavin | 134 | |
135 | ; ********************************************* |
||
136 | ; ******* WINDOW DEFINITIONS AND DRAW ******** |
||
137 | ; ********************************************* |
||
138 | |||
139 | draw_window: |
||
140 | |||
141 | push eax ; save register |
||
6224 | IgorA | 142 | mcall SF_REDRAW,SSF_BEGIN_DRAW |
31 | halyavin | 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] |
||
6224 | IgorA | 148 | mcall SF_CREATE_WINDOW,,,0xb3ffffff,,window_text |
31 | halyavin | 149 | |
150 | mov ebx,1*65536 ; [x start] *65536 |
||
151 | add ebx,[x_size] ; add [x size] |
||
6224 | IgorA | 152 | sub ebx,11 ; x size - 11 |
31 | halyavin | 153 | mov ecx,[y_size] ; [y start] *65536 |
6224 | IgorA | 154 | sub ecx,47 ; minus height |
31 | halyavin | 155 | shl ecx,16 ; *65536 |
156 | add ecx,17 ; add height |
||
6224 | IgorA | 157 | mcall SF_DRAW_RECT,,,0x006688dd |
31 | halyavin | 158 | |
159 | mov ebx,5*65536 ; [x start] *65536 |
||
160 | add ebx,[y_size] ; add [y start] |
||
6224 | IgorA | 161 | sub ebx,42 ; move up |
31 | halyavin | 162 | xor ecx,ecx ; text colour |
6224 | IgorA | 163 | mcall SF_DRAW_TEXT,,,button_no,9 |
31 | halyavin | 164 | |
6224 | IgorA | 165 | call draw_data |
31 | halyavin | 166 | |
6224 | IgorA | 167 | mcall SF_REDRAW,SSF_END_DRAW |
31 | halyavin | 168 | pop eax ; restore register |
169 | ret ; return |
||
170 | |||
171 | ; *********** DRAW DATA *********** |
||
172 | |||
173 | draw_data: |
||
174 | |||
175 | push eax ; save register |
||
6224 | IgorA | 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 | |||
31 | halyavin | 183 | mov ebx,0x00030000 ; display 3 decimal characters |
6224 | IgorA | 184 | mov ecx,[button_press] ; menu id |
31 | halyavin | 185 | mov edx,70*65536 ; [x start] *65536 |
186 | add edx,[y_size] ; +[y start] |
||
6224 | IgorA | 187 | sub edx,42 ; move position |
31 | halyavin | 188 | xor esi,esi ; text colour |
6224 | IgorA | 189 | mcall SF_DRAW_NUMBER |
31 | halyavin | 190 | pop eax ; restore register |
191 | |||
192 | ret ; return |
||
193 | |||
6224 | IgorA | 194 | ; ***************** DATA AREA ****************** |
31 | halyavin | 195 | |
6224 | IgorA | 196 | x_size: dd 381 ; window x size |
197 | y_size: dd 200 ; window y size |
||
31 | halyavin | 198 | |
6224 | IgorA | 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 |
||
31 | halyavin | 206 | |
6224 | IgorA | 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 |
||
31 | halyavin | 212 | |
6224 | IgorA | 213 | if lang eq ru |
31 | halyavin | 214 | |
6224 | IgorA | 215 | sz_File db 'Файл',0 |
216 | sz_Load db 'Открыть',0 |
||
217 | sz_Save db 'Сохранить',0 |
||
218 | sz_Quit db 'Выход',0 |
||
31 | halyavin | 219 | |
6224 | IgorA | 220 | sz_Edit db 'Правка',0 |
221 | sz_Copy db 'Копировать',0 |
||
222 | sz_Paste db 'Вставить',0 |
||
31 | halyavin | 223 | |
6224 | IgorA | 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 |
||
31 | halyavin | 231 | |
6224 | IgorA | 232 | sz_Help db 'Помощь',0 |
233 | sz_Setup db 'Настройки',0 |
||
234 | sz_About db 'О программе..',0 |
||
31 | halyavin | 235 | |
6224 | IgorA | 236 | else |
31 | halyavin | 237 | |
6224 | IgorA | 238 | sz_File db 'File',0 |
239 | sz_Load db 'Load',0 |
||
240 | sz_Save db 'Save',0 |
||
241 | sz_Quit db 'Quit',0 |
||
31 | halyavin | 242 | |
6224 | IgorA | 243 | sz_Edit db 'Edit',0 |
244 | sz_Copy db 'Copy',0 |
||
245 | sz_Paste db 'Paste',0 |
||
31 | halyavin | 246 | |
6224 | IgorA | 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 |
||
31 | halyavin | 254 | |
6224 | IgorA | 255 | sz_Help db 'Help',0 |
256 | sz_Setup db 'Setup',0 |
||
257 | sz_About db 'About..',0 |
||
31 | halyavin | 258 | |
6224 | IgorA | 259 | end if |
31 | halyavin | 260 | |
261 | button_press dd 0 |
||
262 | |||
6224 | IgorA | 263 | align 4 |
264 | system_dir_0 db '/sys/lib/' |
||
265 | lib_name_0 db 'kmenu.obj',0 |
||
31 | halyavin | 266 | |
6224 | IgorA | 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 |
||
31 | halyavin | 278 | |
6224 | IgorA | 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: |
||
31 | halyavin | 284 | |
6224 | IgorA | 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 |
||
31 | halyavin | 308 | |
6224 | IgorA | 309 | i_end: |
310 | sc system_colors |
||
311 | rb 2048 |
||
312 | stacktop: |
||
313 | sys_path rb 2048 |
||
314 | file_name rb 4096 |
||
315 | mem: |