Notify 3.3: add controllers support, a lot of fixes, optimizations and great refactoring

git-svn-id: svn://kolibrios.org@5892 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
eAndrew 2015-11-07 20:44:13 +00:00
parent e1ca5a0f1e
commit 1dce2c44d5
4 changed files with 477 additions and 184 deletions

11
programs/notify.inc Normal file
View File

@ -0,0 +1,11 @@
NTCTRL_READY = 0
NTCTRL_APPLY_TEXT = 1
NTCTRL_APPLY_ICON = 2
NTCTRL_APPLY_TITLE = 3
NTCTRL_CLOSE = 32
NTCTRL_ICON = 64
NTCTRL_TITLE = 65
NTCTRL_TEXT = 128

View File

@ -1,171 +1,122 @@
use32 use32
org 0 org 0
db 'MENUET01' db 'MENUET01'
dd 1, @entry, @end, @memory, @stack, @params, 0 dd 1, @ENTRY, @end, @memory, @stack, @params, 0
include "../../macros.inc" include "../../macros.inc"
include "../../cmp.inc"
include "../../proc32.inc" include "../../proc32.inc"
include "../../dll.inc" include "../../dll.inc"
; include "../../debug.inc" ; include "../../debug.inc"
include "../../notify.inc"
macro cmpe a, b, c { include "../../string.inc"
cmp a, b
je c }
macro cmpl a, b, c {
cmp a, b
jl c }
macro cmpne a, b, c {
cmp a, b
jne c }
macro cmple a, b, c {
cmp a, b
jle c }
macro cmpge a, b, c {
cmp a, b
jge c }
LINEH equ 12 LINEH equ 12
MARGIN equ 12
ICONS equ 11 ICONS equ 11
;===================================================================== ;-------------------------------------------------------------------------------
@entry: @ENTRY:
;; INIT HEAP
;; GET PID OF ACTIVE mcall 68, 11
;; SAVE FOCUSED WINDOW
mcall 18, 7 mcall 18, 7
mov ecx, eax mov ecx, eax
mcall 9, buffer mcall 9, buffer
m2m dword [prev_pid], dword [buffer + 30]
m2m dword[prev_pid], dword[buffer + 30] ;; MAKE IT ALWAYS ON TOP
;; ALWAYS TOP
mcall 18, 25, 2, -1, 1 mcall 18, 25, 2, -1, 1
;; CHECK FOR PARAMS ;; SET STD PARAMS, IF IT NEEDS
mov eax, @params mov eax, @params
cmpne [@params], byte 0, @f cmpne byte [@params], 0, @f
mov eax, sz_std mov eax, sz_std
@@: @@:
mov [params.source], eax
;; TEXT ;; PARSE ARGUMENTS
mov esi, 0
parse:
call parse_text call parse_text
call parse_flags
movzx ebx, [params.icon]
;; PARAMS ;; GET PID
mcall 9, buffer, -1
mov eax, dword [buffer + 30]
.params: ;; CONVERT PID TO STR
mov dl, [eax] mov ebx, 10
mov ecx, 0
cmpe dl, 0, .params.end
cmpe dl, "d", .set_atcl
cmpe dl, "t", .set_title
cmpe dl, "c", .set_ctrl
mov ebx, 1
mov ecx, sz_icons
@@: @@:
cmpe dl, [ecx], .set_icon mov edx, 0
inc ebx div ebx
push edx
inc ecx inc ecx
cmpne [ecx], byte 0, @b cmpne eax, 0, @b
jmp .next_char mov ebx, ctrl.name
@@:
pop eax
add al, "0"
mov [ebx], al
inc ebx
loop @b
.set_atcl: mov dword [ebx + 0], "-NOT"
mov [params.atcl], byte 1 mov dword [ebx + 4], "IFY"
jmp .next_char
.set_title: ;; LOAD LIBRARIES
mov [params.title], byte 1
jmp .next_char
.set_ctrl:
mov [params.ctrl], byte 1
jmp .next_char
.set_icon:
mov [params.icon], ebx
.next_char:
inc eax
jmp .params
.params.end:
;----------------------------
mcall 68, 11
stdcall dll.Load, @imports stdcall dll.Load, @imports
mov dword [fi + 00], 5 ;; GET SIZE OF ICONS
mov dword [fi + 16], buffer
mov dword [fi + 21], sz_ifile
mcall 70, fi mcall 70, fi
mov edx, dword [buffer + 32] mov edx, dword [buffer + 32]
shl edx, 2 shl edx, 2
;; ALLOCATE MEMORY FOR THIS
stdcall mem.Alloc, edx stdcall mem.Alloc, edx
mov [img_data.rgb_obj], eax mov [img_data.rgb_obj], eax
;; READ ICONS
mov dword [fi + 00], 0 mov dword [fi + 00], 0
mov dword [fi + 12], edx mov dword [fi + 12], edx
m2m dword [fi + 16], [img_data.rgb_obj] mov dword [fi + 16], eax
mov dword [fi + 21], sz_ifile
mcall 70, fi mcall 70, fi
;; DECODE ICONS
stdcall dword [img.decode], dword [img_data.rgb_obj], ebx, 0 stdcall dword [img.decode], dword [img_data.rgb_obj], ebx, 0
mov dword [img_data.obj], eax mov dword [img_data.obj], eax
;; alpha
add eax, 24
mov eax, [eax] ;; eax - data [argb]
mov ecx, 24 * 24 * ICONS
alpha:
mov ebx, [eax]
shr ebx, 24
cmpne bl, 0x00, @f
mov [eax], dword 0x222222
@@:
add eax, 4
loop alpha
;; end alpha
stdcall dword [img.to_rgb], dword [img_data.obj], dword [img_data.rgb_obj] stdcall dword [img.to_rgb], dword [img_data.obj], dword [img_data.rgb_obj]
stdcall dword [img.destroy], dword [img_data.obj] stdcall dword [img.destroy], dword [img_data.obj]
;----------------------------
mov [text.offset], LINEH
;; CALC HEIGHT
mov eax, [text.lines] mov eax, [text.lines]
add eax, 2 add eax, 2
imul eax, LINEH imul eax, LINEH
mov [window.height], eax mov [window.height], eax
mov eax, [text.max_len] ;; CALC OFFSET OF TEXT
imul eax, 6 mov dword [text.offset], MARGIN
add eax, LINEH * 2 cmpe byte [params.icon], 0, @f
cmpe [params.icon], dword 0, @f add dword [text.offset], MARGIN + 24
add eax, 24 + LINEH
add [text.offset], 24 + LINEH
@@: @@:
;; CALC WIDTH
mov eax, [text.max_len]
dec eax
imul eax, 6
add eax, MARGIN
add eax, [text.offset]
mov [window.width], eax mov [window.width], eax
mcall 14 mcall 14
mov ebx, eax mov ebx, eax
and ebx, 0xFFFF movzx ebx, bx
mov [scr.height], ebx mov [scr.height], ebx
shr eax, 16 shr eax, 16
mov [scr.width], eax mov [scr.width], eax
@ -173,9 +124,8 @@
sub eax, LINEH sub eax, LINEH
mov [window.x], eax mov [window.x], eax
;; CALC WINDOW.Y ;; CALC Y
mcall 68, 22, sz_shname, 256 + 512, 4 + 1 ;OPEN_ALWAYS AND WRITE
mcall 68, 22, sz_shname, 256 + 512, 4 + 1 ;OPEN_ALWAYS and WRITE
add eax, 512 add eax, 512
mov [shm], eax mov [shm], eax
@ -202,15 +152,15 @@
s_area: s_area:
cmpe [eax], byte 1, .is_1 cmpe [eax], byte 1, .is_1
.is_0: .is_0:
inc ebx inc ebx
cmpe ebx, ecx, s_ok cmpe ebx, ecx, s_ok
jmp .next jmp .next
.is_1: .is_1:
mov ebx, 0 mov ebx, 0
.next: .next:
inc eax inc eax
cmple eax, edx, s_area cmple eax, edx, s_area
@ -241,19 +191,22 @@
;---------------------------- ;----------------------------
;; SET EVENT MASK
mcall 40, 101b
;; INIT TIMER
mov eax, 60 mov eax, 60
imul eax, [text.lines] imul eax, [text.lines]
mov [timer], eax mov [timer], eax
mov dword [timer.step], 1
mov [timer.step], dword 1 cmpne byte [params.atcl], 1, @f
cmpne [params.atcl], byte 1, @f mov dword [timer.step], 0
mov [timer.step], dword 0
@@: @@:
;---------------------------- ;; INIT WINDOW
call init_window call init_window
;; RESTORE FOCUS
mcall 18, 21, [prev_pid] mcall 18, 21, [prev_pid]
mov ecx, eax mov ecx, eax
mcall 18, 3 mcall 18, 3
@ -265,12 +218,97 @@
update: update:
mcall 23, 10 mcall 23, 10
cmpe al, EV_REDRAW, redraw cmpe al, EV_REDRAW, redraw
cmpe al, EV_KEY, key cmpe al, EV_BUTTON, button
cmpe al, EV_BUTTON, exit
mov edi, update
;; TRY OPEN CONTROLLER
cmpe byte [params.ctrl], 1, .fail_controller_open
mcall 68, 22, ctrl.name, , 0x01
cmpe eax, 0, .fail_controller_open
mov byte [params.ctrl], 1
mov [ctrl.addr], eax
;; COPY TEXT TO CTRL
add eax, NTCTRL_TEXT
mov ebx, text.buffer
mov ecx, [text.lines]
.copy_start:
cmpe ecx, 0, .copy_end
mov dl, [ebx]
cmpne dl, 0, @f
mov dl, "|"
dec ecx
@@:
mov [eax], dl
inc eax
inc ebx
jmp .copy_start
.copy_end:
mov byte [eax - 1], 0
;; COPY FLAGS TO CTRL
mov eax, [ctrl.addr]
add eax, NTCTRL_ICON
mov dl, [params.icon]
mov [eax], dl
mov eax, [ctrl.addr]
add eax, NTCTRL_TITLE
mov dl, [params.title]
mov [eax], dl
;; SET CONTROLLER READY
mov eax, [ctrl.addr]
add eax, NTCTRL_READY
mov byte [eax], 1
.fail_controller_open:
cmpe [params.ctrl], 0, .no_ctrl
;; TEST TEXT
mov eax, [ctrl.addr]
add eax, NTCTRL_APPLY_TEXT
cmpne byte [eax], 1, @f
mov byte [eax], 0
mov eax, [ctrl.addr]
add eax, NTCTRL_TEXT
mov esi, 1
call parse_text
mov edi, redraw
@@:
;; TEST ICON
mov eax, [ctrl.addr]
add eax, NTCTRL_APPLY_ICON
cmpne byte [eax], 1, @f
mov eax, [ctrl.addr]
add eax, NTCTRL_ICON
mov dl, [eax]
mov [params.icon], dl
@@:
;; TEST TITLE
mov eax, [ctrl.addr]
add eax, NTCTRL_APPLY_TITLE
cmpne byte [eax], 1, @f
mov eax, [ctrl.addr]
add eax, NTCTRL_TITLE
mov dl, [eax]
mov [params.title], dl
@@:
;; TEST CLOSE
mov eax, [ctrl.addr]
add eax, NTCTRL_CLOSE
cmpe byte [eax], 1, exit
.no_ctrl:
mov eax, [timer.step] mov eax, [timer.step]
sub [timer], eax sub [timer], eax
cmpne [timer], dword 0, update cmpe [timer], dword 0, exit
jmp edi
;---------------------------- ;----------------------------
@ -289,10 +327,10 @@
;---------------------------- ;----------------------------
key: button:
mcall 2 mcall 17
cmpne ah, 27, update cmpe byte [params.clcl], 0, exit
jmp exit jmp update
;---------------------------- ;----------------------------
@ -307,8 +345,8 @@
draw_window: draw_window:
call init_window call init_window
and ebx, 0xFFFF movzx ebx, bx
and ecx, 0xFFFF movzx ecx, cx
inc ebx inc ebx
inc ecx inc ecx
mcall 8, , , 0x61000001 mcall 8, , , 0x61000001
@ -330,7 +368,7 @@
pop ebx eax pop ebx eax
cmpne esi, 0, @b cmpne esi, 0, @b
.draw_full: .draw_full:
mcall mcall
mcall , , 1, 0x121212 mcall , , 1, 0x121212
@ -415,9 +453,8 @@
;----- ;-----
cmpe [params.icon], dword 0, @f cmpe byte [params.icon], 0, @f
movzx ebx, byte [params.icon]
mov ebx, [params.icon]
dec ebx dec ebx
imul ebx, 24 * 24 * 3 imul ebx, 24 * 24 * 3
add ebx, [img_data.rgb_obj] add ebx, [img_data.rgb_obj]
@ -428,7 +465,6 @@
add edx, LINEH shl 16 add edx, LINEH shl 16
mcall 7, , <24, 24> mcall 7, , <24, 24>
@@: @@:
ret ret
@ -444,7 +480,7 @@
add ebx, LINEH + (LINEH - 6) / 2 add ebx, LINEH + (LINEH - 6) / 2
mov edx, text.buffer mov edx, text.buffer
.draw_lines: .draw_lines:
mov ecx, 0x80111111 mov ecx, 0x80111111
add ebx, 0x00010000 add ebx, 0x00010000
@ -474,9 +510,9 @@
inc edx inc edx
jmp .draw_lines jmp .draw_lines
.draw_lines.end: .draw_lines.end:
cmpne [params.title], byte 1, @f cmpne byte [params.title], 1, @f
mov edx, text.buffer mov edx, text.buffer
mov ecx, 0x80111111 mov ecx, 0x80111111
and ebx, 0xFFFF0000 and ebx, 0xFFFF0000
@ -511,6 +547,7 @@
mov dl, 0 mov dl, 0
mov dh, 0 mov dh, 0
cmpe esi, 1, .parse_loop
cmpne byte [eax], "'", @f cmpne byte [eax], "'", @f
mov dl, "'" mov dl, "'"
mov dh, 1 mov dh, 1
@ -523,35 +560,44 @@
inc eax inc eax
@@: @@:
.parse_loop: .parse_loop:
cmpe byte [eax], 0, .parse_loop.end cmpe byte [eax], 0, .parse_loop.end
cmpe byte [eax], dl, .parse_loop.end cmpe byte [eax], dl, .parse_loop.end
mov dh, [eax]
cmpe byte [eax], 10, .newline cmpe byte [eax], 10, .newline
cmpe esi, 1, .next_set_char
cmpne byte [eax], "\", @f
cmpe byte [eax + 1], dl, .quote
cmpe byte [eax + 1], "n", .newline_esc
jmp @f
cmpne byte [eax + 0], "\", @f .quote:
cmpne byte [eax + 1], "n", @f inc eax
jmp .next_set_char
.newline_esc:
inc eax inc eax
.newline: .newline:
mov byte [ebx], 0 mov byte [ebx], 0
cmple ecx, dword [text.max_len], .skip_max_len cmple ecx, dword [text.max_len], .skip_max_len
mov dword [text.max_len], ecx mov dword [text.max_len], ecx
.skip_max_len: .skip_max_len:
mov ecx, 0 mov ecx, 0
inc dword [text.lines] inc dword [text.lines]
jmp .next jmp .next
@@: @@:
.next_set_char:
mov dh, [eax]
mov [ebx], dh mov [ebx], dh
.next: .next:
inc eax inc eax
inc ebx inc ebx
inc ecx inc ecx
jmp .parse_loop jmp .parse_loop
.parse_loop.end: .parse_loop.end:
cmple ecx, dword [text.max_len], @f cmple ecx, dword [text.max_len], @f
mov dword [text.max_len], ecx mov dword [text.max_len], ecx
@ -567,11 +613,56 @@
;---------------------------- ;----------------------------
parse_flags:
mov byte [params.atcl], 0
mov byte [params.title], 0
mov byte [params.icon], 0
.loop:
mov dl, [eax]
cmpe dl, 0, .exit
cmpe dl, "d", .set_atcl
cmpe dl, "c", .set_clcl
cmpe dl, "t", .set_title
mov bl, 1
mov ecx, sz_icons
@@:
cmpe dl, [ecx], .set_icon
inc bl
inc ecx
cmpne [ecx], byte 0, @b
jmp .next_char
.set_atcl:
mov byte [params.atcl], 1
jmp .next_char
.set_clcl:
mov byte [params.clcl], 1
jmp .next_char
.set_title:
mov byte [params.title], 1
jmp .next_char
.set_icon:
mov [params.icon], bl
.next_char:
inc eax
jmp .loop
.exit:
ret
;----------------------------
@imports: @imports:
library img, "libimg.obj" library img, "libimg.obj"
import img, img.init, "lib_init", \ import img, img.to_rgb, "img_to_rgb2", \
img.to_rgb, "img_to_rgb2", \ img.decode, "img_decode", \
img.decode, "img_decode", \
img.destroy, "img_destroy" img.destroy, "img_destroy"
;---------------------------- ;----------------------------
@ -579,24 +670,32 @@
sz_icons db "AEWONIFCMDS", 0 sz_icons db "AEWONIFCMDS", 0
sz_ifile db "/sys/notify3.png", 0 sz_ifile db "/sys/notify3.png", 0
sz_shname db "notify-mem-v01", 0 sz_shname db "notify-mem-v01", 0
sz_std db "'NOTIFY 3\n", \ sz_std db "'NOTIFY 3\n", \
"d - disable auto-closing\n", \ "d - disable auto-closing\n", \
"t - title\n", \ "c - disable click-closing\n", \
" \n", \ "t - title\n", \
"ICONS:\n", \ " \n", \
"A - application\n", \ "ICONS:\n", \
"E - error\n", \ "A - application\n", \
"W - warning\n", \ "E - error\n", \
"O - ok\n", \ "W - warning\n", \
"N - network\n", \ "O - ok\n", \
"I - info\n", \ "N - network\n", \
"F - folder\n", \ "I - info\n", \
"C - component\n", \ "F - folder\n", \
"M - mail\n", \ "C - component\n", \
"D - download\n", \ "M - mail\n", \
"S - audio player", \ "D - download\n", \
"S - audio player", \
"' -td", 0 "' -td", 0
fi:
dd 5
dd 0, 0, 0
dd buffer
db 0
dd sz_ifile
;---------------------------- ;----------------------------
@end: @end:
@ -604,40 +703,45 @@
;===================================================================== ;=====================================================================
window: window:
.x rd 1 .x rd 1
.y rd 1 .y rd 1
.width rd 1 .width rd 1
.height rd 1 .height rd 1
scr: scr:
.width rd 1 .width rd 1
.height rd 1 .height rd 1
text: text:
.buffer rb 2048 .buffer rb 2048
.lines rd 1 .lines rd 1
.max_len rd 1 .max_len rd 1
.offset rd 1 .offset rd 1
params: params:
.atcl rb 1 .source rd 1
.title rb 1 .atcl rb 1
.icon rd 1 .clcl rb 1
.ctrl rb 1 .title rb 1
.icon rb 1
.ctrl rb 1
img_data: img_data:
.rgb_obj rd 1 .rgb_obj rd 1
.obj rd 1 .obj rd 1
timer: timer:
.value rd 1 .value rd 1
.step rd 1 .step rd 1
shm: shm:
.addr rd 1 .addr rd 1
.our rd 1 .our rd 1
ctrl:
.name rb 31
.addr rd 1
fi rb 26
buffer rb 1024 buffer rb 1024
first_draw rb 1 first_draw rb 1
prev_pid rd 1 prev_pid rd 1

View File

@ -13,6 +13,7 @@
2.3 <KEYS> 2.3 <KEYS>
d - disable auto-closing d - disable auto-closing
c - disable closing by click
t - title t - title
2.3.1 ICONS: 2.3.1 ICONS:

View File

@ -0,0 +1,177 @@
use32
org 0
db 'MENUET01'
dd 1, @entry, @end, @memory, @stack, 0, 0
include "../../macros.inc"
include "../../proc32.inc"
; include "../../debug.inc"
include "../../notify.inc"
include "../../string.inc"
include "../../cmp.inc"
@entry:
mcall 68, 11
;; RUN NOTIFY
call make_param
mcall 70, fi_launch
;; CONVERT PID TO STR
mov ebx, 10
mov ecx, 0
@@:
mov edx, 0
div ebx
push edx
inc ecx
cmpne eax, 0, @b
mov ebx, ctrl.name
@@:
pop eax
add al, "0"
mov [ebx], al
inc ebx
loop @b
;; ADD POSTFIX TO STR
mov dword [ebx + 0], "-NOT"
mov dword [ebx + 4], "IFY"
;; OPEN CONTROLLER (0x08 + 0x01 -- CREATE AND READ/WRITE)
mcall 68, 22, ctrl.name, 2048, 0x09
mov [ctrl.addr], eax
;; WAIT UNTIL CONTROLLER BECOMES READY TO USE
add eax, NTCTRL_READY
@@:
mcall 5, 1
cmpe byte [eax], 0, @b
;; LOOP OF NOTIFIES CHANGES
@@:
;; SHIFT TEXT
call shift
;; ADD UNSHIFTABLE TEXT
mov byte [params], 0
call make_text
;; SEND TEXT TO NOTIFY
mov eax, [ctrl.addr]
add eax, NTCTRL_TEXT
stdcall string.copy, params, eax
;; APPLY NEW TEXT
mov eax, [ctrl.addr]
add eax, NTCTRL_APPLY_TEXT
mov byte [eax], 1
;; CLOSE NOTIFY IF TIME IS END
cmpe byte [sz_time], "0" - 1, .exit
;; WAIT AND DO NEXT ITERATION
mcall 5, 10
jmp @b
.exit:
;; CLOSE NOTIFY
mov eax, [ctrl.addr]
add eax, NTCTRL_CLOSE
mov byte [eax], 1
mcall -1
;-------------------------------------------------------------------------------
shift:
;; SHIFT TEXT
mov eax, sz_text
mov dh, [eax]
@@:
mov dl, [eax + 1]
mov [eax], dl
inc eax
cmpne byte [eax + 1], 0, @b
mov [eax], dh
inc byte [timer]
cmpne byte [timer], 10, .skip_changes
sub byte [timer], 10
;; CHANGE TIMER TEXT
dec byte [sz_time]
;; CHANGE ICON
mov eax, [ctrl.addr]
add eax, NTCTRL_ICON
inc byte [eax]
cmpne byte [eax], 12, @f
sub byte [eax], 11
@@:
;; APPLY NEW ICON
mov eax, [ctrl.addr]
add eax, NTCTRL_APPLY_ICON
mov byte [eax], 1
;; CHANGE TITLE
mov eax, [ctrl.addr]
add eax, NTCTRL_TITLE
mov dl, 1
sub dl, [eax]
mov [eax], dl
;; APPLY NEW TITLE
mov eax, [ctrl.addr]
add eax, NTCTRL_APPLY_TITLE
mov byte [eax], 1
.skip_changes:
ret
;-------------------------------------------------------------------------------
make_text:
stdcall string.concatenate, sz_text, params
stdcall string.concatenate, sz_sec_line_start, params
stdcall string.concatenate, sz_time, params
stdcall string.concatenate, sz_sec_line_end, params
ret
;-------------------------------------------------------------------------------
make_param:
stdcall string.copy, sz_quote, params
call make_text
stdcall string.concatenate, sz_quote, params
stdcall string.concatenate, sz_flags, params
ret
;-------------------------------------------------------------------------------
sz_time:
db "5", 0
sz_text:
db "Hello, World!!! It is a marquee! ", 0
sz_quote:
db "'", 0
sz_sec_line_start:
db 10, "Will close after ", 0
sz_sec_line_end:
db " seconds", 0
sz_flags:
db "Idc", 0
fi_launch:
dd 7, 0, params, 0, 0
db "@notify", 0
@end:
;=====================================================================
timer rb 1
params rb 256
ctrl:
.name rb 32
.addr rd 1
rb 2048
@stack:
@memory: