Subversion Repositories Kolibri OS

Rev

Rev 7961 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 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
;
2510 mario79 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
;------------------------------------------------------------------------------
31 halyavin 17
include 'lang.inc'
7961 leency 18
include '..\..\..\..\macros.inc'
2510 mario79 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
604 Rus 38
still:		     ; главный цикл основного процесса
2510 mario79 39
	mcall	10	; ждём события
31 halyavin 40
 
2510 mario79 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
31 halyavin 54
 
2510 mario79 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
2512 mario79 60
; кому принадлежит точка?
61
	mcall	34,[curx1],[cury1]
62
	cmp	al,1 ; 1 - ядро
63
	jne	still
2510 mario79 64
;--------------------------------------
65
align 4
604 Rus 66
@@:		; подождём, пока пользователь не отпустил правую кнопку мыши
2510 mario79 67
	mcall	37,2    ;   нажаты ли кнопки мыши?
68
	test	eax,ebx ; если отпустил, (eax != 2)
69
	jz	@f	;   идём в начало главного цикла
31 halyavin 70
 
2510 mario79 71
	mcall	68,1	; иначе переключимся на следующий поток системы и когда
72
	jmp	@b	; выполнение вернется этому потоку, проверим мышь опять
73
;--------------------------------------
74
align 4
31 halyavin 75
@@:
2510 mario79 76
; если уже было открыто меню, нужно подождать, пока оно закроется:
77
	cmp	[menu_opened],0
78
	je	@f
31 halyavin 79
 
2510 mario79 80
	mcall	68,1	; переключимся на следующий поток системы
81
			; более эффективный способ задержки чем mcall 5
82
	jmp	@b
83
;--------------------------------------
84
align 4
31 halyavin 85
@@:
2510 mario79 86
; а теперь можно смело запускать процесс (поток) меню
87
	mcall	51,1,start_wnd,stack_wnd
88
	jmp	still
89
;------------------------------------------------------------------------------
90
align 4
604 Rus 91
exit_menu:	      ; если выходим из меню, надо записать в [menu_opened] 0
2510 mario79 92
	mov	[menu_opened],0
93
;--------------------------------------
94
align 4
604 Rus 95
exit:		      ; сюда мы идём, когда выходим из основного процесса
2510 mario79 96
	or	eax,-1	      ; eax = -1
97
	mcall
98
;------------------------------------------------------------------------------
31 halyavin 99
; здесь стартует процесс меню
2510 mario79 100
;------------------------------------------------------------------------------
101
align 4
31 halyavin 102
start_wnd:
2510 mario79 103
	mov	[menu_opened],1
104
; установим маску желаемых событий: меню + кнопки + перерисовка
105
	mcall	40,100101b
106
;------------------------------------------------------------------------------
107
align 4
142 diamond 108
red:
2510 mario79 109
	call	draw_window
110
;------------------------------------------------------------------------------
111
align 4
604 Rus 112
still2: 	    ; главный цикл процесса меню
2510 mario79 113
	mcall	10	; ждём события
31 halyavin 114
 
2510 mario79 115
	cmp	eax,1	    ; перерисовка?
116
	je	red
117
 
118
	cmp	eax,3	    ; кнопка?
119
	je	button
120
 
121
	cmp	eax,6	    ; мышь?
122
	je	mouse
31 halyavin 123
 
2510 mario79 124
	jmp	still2	    ; вернёмся в начало главного цикла
125
;------------------------------------------------------------------------------
126
align 4
31 halyavin 127
; ОБРАБОТЧИК МЫШИ
604 Rus 128
mouse:		  ; когда пользователь нажмёт кнопку мыши, закроемся
2510 mario79 129
	mcall	37,2	; какие кнопки нажаты?
130
	test	eax,eax   ; никакие? - тогда прекрасно! вернёмся в главный цикл
131
	jz	still2
31 halyavin 132
 
2510 mario79 133
        mcall   37,0
134
 
1411 mikedld 135
        mov     esi, eax
136
        shr     esi, 16
137
        movzx   edi, ax
2510 mario79 138
        mcall   9, procinfo, -1
139
 
140
        mov     eax, [procinfo.box.left]
1411 mikedld 141
        cmp     esi, eax
142
        jl      exit_menu
2510 mario79 143
 
144
        add     eax, [procinfo.box.width]
1411 mikedld 145
        cmp     esi, eax
146
        jge     exit_menu
2510 mario79 147
 
148
        mov     eax, [procinfo.box.top]
1411 mikedld 149
        cmp     edi, eax
150
        jl      exit_menu
2510 mario79 151
 
152
        add     eax, [procinfo.box.height]
1411 mikedld 153
        cmp     edi, eax
154
        jge     exit_menu
31 halyavin 155
 
1411 mikedld 156
        jmp     still2
2510 mario79 157
;------------------------------------------------------------------------------
158
align 4
31 halyavin 159
; НАЖАТА КНОПКА
160
button:
2510 mario79 161
	mcall	17	; получить идентификатор нажатой кнопки
31 halyavin 162
 
2510 mario79 163
	sub	ah,10	      ; сравниваем с 10
164
	jl	nofuncbtns    ; если меньше - закрываем меню
31 halyavin 165
 
2510 mario79 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
31 halyavin 178
 
2510 mario79 179
;	mov	eax,5         ; подождём, пока программа запуститься
180
;	mov	ebx,1         ; а то её окно не будет отрисовано (баг в ядре???)
181
;	mcall          ; раскомментируйте эти строки, если у вас проблемы
604 Rus 182
		       ; с отрисовкой
2510 mario79 183
;--------------------------------------
184
align 4
604 Rus 185
nofuncbtns:	      ; закрываем меню
2510 mario79 186
	jmp	exit_menu
187
;------------------------------------------------------------------------------
604 Rus 188
_BTNS_		  = 6	  ; количество кнопок ("пунктов меню")
31 halyavin 189
 
190
if lang eq ru
604 Rus 191
  font		  = 0x00000000
192
  string_length   = 20		; длина строки
193
  wnd_x_size	  = 133 	; ширина окна
194
  title_pos	 = 36 shl 16 + 7
31 halyavin 195
else
604 Rus 196
  font		  = 0x10000000
197
  string_length   = 12		; длина строки
198
  wnd_x_size	  = 105 	; ширина окна
199
  title_pos	 = 23 shl 16 + 7
31 halyavin 200
end if
2510 mario79 201
;------------------------------------------------------------------------------
31 halyavin 202
;*******************************
203
;********  РИСУЕМ ОКНО  ********
204
;*******************************
205
draw_window:
2510 mario79 206
	mcall	12,1	; начинаем "рисовать"
31 halyavin 207
 
2510 mario79 208
	mov	eax,[curx1]	 ; текущие координаты курсора
209
	mov	[curx],eax	 ; запишем в координаты окна
210
	mov	eax,[cury1]
211
	mov	[cury],eax
31 halyavin 212
; теперь будем считать координаты окна, чтобы оно за край экрана не вылезло
2510 mario79 213
	mcall	14		; получим размер экрана
31 halyavin 214
 
2510 mario79 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 - высота окна]
31 halyavin 220
 
2510 mario79 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
31 halyavin 245
 
2510 mario79 246
	mov	eax, 4		   ; заголовок
247
	mov	ebx, title_pos	  ;  [x] shl 16 + [y]
248
	mov	ecx, [sc.grab_text];  шрифт и цвет (серый)
249
	or	ecx, 0x10000000
31 halyavin 250
 
2510 mario79 251
	push	ecx
252
	push	ecx
253
	xor	edx,edx
254
;--------------------------------------
255
align 4
142 diamond 256
.dec_color:
2510 mario79 257
	sub	byte [esp+edx], 0x33
258
	jae	@f
259
	mov	byte [esp+edx], 0
260
;--------------------------------------
261
align 4
142 diamond 262
@@:
2510 mario79 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
31 halyavin 272
 
2510 mario79 273
	mov	ebx, 1*65536+wnd_x_size-2  ; начинаем делать кнопки
274
	mov	ecx, 20*65536+15
275
	mov	edx, 10 or 0x40000000 ; бит 30 установлен => кнопка не рисуется
31 halyavin 276
 
2510 mario79 277
	mov	edi,_BTNS_	     ; количество кнопок (счётчик)
278
;--------------------------------------
279
align 4
280
newbtn:		     ; начало цикла
281
	mcall	8		;  создаём кнопку
31 halyavin 282
 
604 Rus 283
			     ;  пишем текст на кнопке
2510 mario79 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
31 halyavin 297
 
2510 mario79 298
	inc	edx		     ;  номер кнопки++;
299
	add	ecx,15*65536	     ;  увеличим смещение по y
300
	dec	edi		     ;  уменьшим счётчик
301
	jnz	newbtn		     ; если не ноль, повторим всё ещё раз
31 halyavin 302
 
2510 mario79 303
	mcall	12,2	; закончили "рисовать"
304
	ret			     ; возврат
305
;------------------------------------------------------------------------------
306
align 4
31 halyavin 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
 
604 Rus 320
  strtbl startapps	 ,\
321
    <"/sys/PIC4",0>	,\
322
    <"/sys/DESKTOP",0>	,\
2135 leency 323
    <"/sys/ICON",0>,\
604 Rus 324
    <"/sys/SETUP",0>	,\
2533 mario79 325
    <"/sys/DEVELOP/BOARD",0> ,\
529 spraid 326
    <"/sys/CPU",0>
318 heavyiron 327
 
485 heavyiron 328
  sz title, "KolibriOS"
31 halyavin 329
 
330
  lsz text,\
331
    en, 'Background  ',\
318 heavyiron 332
    en, 'Desktop     ',\
31 halyavin 333
    en, 'Icon manager',\
318 heavyiron 334
    en, 'Device setup',\
2533 mario79 335
    en, 'Debug board ',\
318 heavyiron 336
    en, 'Processes   ',\
31 halyavin 337
    \
338
    ru, 'Генератор обоев     ',\
318 heavyiron 339
    ru, 'Настройка окон      ',\
31 halyavin 340
    ru, 'Управление иконками ',\
318 heavyiron 341
    ru, 'Настройка устройств ',\
2533 mario79 342
    ru, 'Панель отладки      ',\
3927 kaitz 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
 
2510 mario79 352
;------------------------------------------------------------------------------
353
align 4
142 diamond 354
start_info:
2510 mario79 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
31 halyavin 365
; НЕИНИЦИАЛИЗИРОВАННЫЕ ДАННЫЕ
2510 mario79 366
  curx1		dd ?	; координаты курсора
367
  cury1		dd ?
368
  curx		dd ?	; координаты окна меню
369
  cury		dd ?
31 halyavin 370
 
2510 mario79 371
  menu_opened	db ?	; открыто меню или нет? (1-да, 0-нет)
372
;------------------------------------------------------------------------------
142 diamond 373
align 4
2510 mario79 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
;------------------------------------------------------------------------------
1411 mikedld 392
; КОНЕЦ ПРОГРАММЫ
2510 mario79 393
;------------------------------------------------------------------------------