Subversion Repositories Kolibri OS

Rev

Rev 6224 | 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'
8236 IgorA 19
include '../../../../load_lib.mac'
6224 IgorA 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
 
8236 IgorA 26
@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
6224 IgorA 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
align 4
268
l_libs_start:
8236 IgorA 269
	lib_0 l_libs lib_name_0, file_name, system_dir_0, import_libkmenu
6224 IgorA 270
l_libs_end:
31 halyavin 271
 
6224 IgorA 272
align 4
273
import_libkmenu:
274
	kmenu_init      dd akmenu_init
275
	kmainmenu_draw  dd akmainmenu_draw
276
	kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
277
	ksubmenu_new    dd aksubmenu_new
278
	ksubmenu_delete dd aksubmenu_delete
279
	ksubmenu_draw   dd aksubmenu_draw
280
	ksubmenu_add    dd aksubmenu_add
281
	kmenuitem_new   dd akmenuitem_new
282
	kmenuitem_delete dd akmenuitem_delete
283
	kmenuitem_draw  dd akmenuitem_draw
284
dd 0,0
285
	akmenu_init     db 'kmenu_init',0
286
	akmainmenu_draw db 'kmainmenu_draw',0
287
	akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
288
	aksubmenu_new   db 'ksubmenu_new',0
289
	aksubmenu_delete db 'ksubmenu_delete',0
290
	aksubmenu_draw  db 'ksubmenu_draw',0
291
	aksubmenu_add   db 'ksubmenu_add',0
292
	akmenuitem_new  db 'kmenuitem_new',0
293
	akmenuitem_delete db 'kmenuitem_delete',0
294
	akmenuitem_draw  db 'kmenuitem_draw',0
31 halyavin 295
 
6224 IgorA 296
i_end:
297
	sc system_colors
298
	rb 2048
299
stacktop:
300
	sys_path rb 2048
301
	file_name rb 4096
302
mem: