0,0 → 1,450 |
WIN_SIZE equ 120 |
TIMER equ 60 |
|
use32 |
org 0 |
db 'MENUET01' |
dd 1, @entry, @end, @memory, @stack, @params, 0 |
|
include "../../macros.inc" |
include "../../proc32.inc" |
include "../../dll.inc" |
; include "../../debug.inc" |
include "macros.inc" |
|
;===================================================================== |
|
@entry: |
mcall 68, 11 |
mcall 68, 22, shm_name, 512, 5 |
mov [shm], eax |
|
mcall 9, buffer, -1 |
mov esi, dword[buffer + 30] |
mov edi, eax |
|
@@: |
mcall 9, buffer, edi |
cmpe dword[buffer + 30], esi, .next |
cmpe dword[buffer + 10], dword "@Vol", @open_1 |
cmpe dword[buffer + 10], dword "@VOL", @open_1 |
cmpe dword[buffer + 10], dword "@vol", @open_1 |
.next: |
dec edi |
jnz @b |
|
mov eax, [shm] |
mov [eax], dword 0 |
mcall 40, 10b |
mcall 66, 1, 1 |
;mcall 66, 4, 16, 0x110 |
mcall 66, 4, 77, 0x110 |
mcall 66, 4, 75, 0x110 |
mcall 66, 4, 80, 0x110 |
|
stdcall dll.Load, @imports |
stdcall dword[img.decode], icons, icons.size, 0 |
mov dword[image.data], eax |
stdcall dword[img.to_rgb], dword[image.data], image |
stdcall dword[img.destroy], dword[image.data] |
|
; load driver |
mcall 68, 16, snd_driver.name |
mov [snd_driver], eax |
cmpe eax, 0, exit |
|
@update: |
mcall 23, 5 |
cmpe al, EV_KEY, @key |
mov eax, [shm] |
cmpne [eax], dword 0, @open_2 |
jmp @update |
|
@open_1: |
mov ebx, 1 |
cmpne [@params], byte '+', @f |
mov ebx, 2 |
@@: |
cmpne [@params], byte '-', @f |
mov ebx, 3 |
@@: |
cmpne [@params], byte 'm', @f |
mov ebx, 4 |
@@: |
cmpne [@params], byte 's', @f |
mov ebx, 5 |
@@: |
mov eax, [shm] |
mov [eax], ebx |
jmp @exit |
|
@open_2: |
mov eax, [shm] |
mov ebx, [eax] |
mov [command], ebx |
mov [eax], dword 0 |
cmpne [win.pid], dword 0, @update |
mcall 51, 1, _entry, _stack |
jmp @update |
|
@key: |
mcall 2 |
;cmpe ah, 16, @exit |
mov edx, [shm] |
cmpne ah, 77, @f |
.cm_1: |
cmpne [win.pid], 0, .else_1 |
mov [edx], dword 2 |
jmp @open_2 |
.else_1: |
mov [command], 2 |
@@: |
cmpne ah, 75, @f |
.cm_2: |
cmpne [win.pid], 0, .else_2 |
mov [edx], dword 3 |
jmp @open_2 |
.else_2: |
mov [command], 3 |
@@: |
cmpne ah, 80, @f |
.cm_3: |
mov [edx], dword 4 |
jmp @open_2 |
@@: |
jmp @update |
|
@exit: |
mcall -1 |
|
;===================================================================== |
|
_entry: |
mcall 40, 100111b |
|
mcall 9, buffer, -1 |
mov ecx, eax |
mov edx, dword [buffer + 30] |
mov [win.pid], edx |
|
mcall 14 |
movzx ebx, ax |
shr eax, 17 |
shr ebx, 1 |
sub eax, WIN_SIZE / 2 |
sub ebx, WIN_SIZE / 2 |
mov [win.x], eax |
mov [win.y], ebx |
|
mcall 70, is_load |
cmpe eax, 0, @f |
mov dword[volume], 5 |
@@: |
mov dword[timer], TIMER |
|
jmp set_sound |
|
;---------------------------- |
|
_update: |
mcall 23, 5 |
cmpe al, EV_REDRAW, _redraw |
cmpe al, EV_KEY, _key |
cmpe al, EV_BUTTON, _button |
cmpe al, EV_MOUSE, _mouse |
|
cmpne [command], 2, @f |
mov [mute], 0 |
cmpe [volume], dword 10, @f |
inc dword[volume] |
jmp .apply |
@@: |
cmpne [command], 3, @f |
mov [mute], 0 |
cmpe [volume], dword 0, @f |
dec dword[volume] |
jmp .apply |
@@: |
cmpne [command], 4, @f |
mov [mute], 1 |
jmp .apply |
@@: |
cmpne [command], 5, @f |
mov [mute], 0 |
jmp .apply |
|
.apply: |
mov [command], 0 |
jmp set_sound |
@@: |
|
mcall 18, 7 |
mov ecx, eax |
mcall 9, buffer |
mov eax, dword[buffer + 30] |
cmpne [win.pid], eax, exit |
|
dec dword[timer] |
jnz _update |
|
;---------------------------- |
|
exit: |
mov [win.pid], 0 |
mcall 70, is_save |
mcall -1 |
|
;---------------------------- |
|
_button: |
mcall 17 |
cmpe ah, 1, exit |
cmpe ah, 3, toggle_mute |
jmp _update |
|
;---------------------------- |
|
_key: |
mcall 2 |
cmpe ah, 027, exit |
cmpe ah, 176, dec_volume ; <- |
cmpe ah, 183, dec_volume ; PgDown |
cmpe ah, 179, inc_volume ; -> |
cmpe ah, 184, inc_volume ; PgUp |
cmpe ah, 178, unmute_volume ; ^ |
cmpe ah, 180, unmute_volume ; Home |
cmpe ah, 177, mute_volume ; v |
cmpe ah, 181, mute_volume ; End |
|
jmp _update |
|
;---------------------------- |
|
_mouse: |
mcall 37, 7 |
cmpe eax, 0, _update |
|
mov esi, eax |
mcall 37, 1 |
movzx ebx, ax |
shr eax, 16 |
cmpg eax, WIN_SIZE, _update |
cmpg ebx, WIN_SIZE, _update |
|
cmpe si, 1, dec_volume |
jne inc_volume |
|
;---------------------------- |
|
dec_volume: |
cmpe dword[volume], 0, _update |
dec dword[volume] |
jmp unmute_volume |
|
inc_volume: |
cmpe dword[volume], 10, _update |
inc dword[volume] |
|
unmute_volume: |
mov [mute], 0 |
jmp @f |
|
toggle_mute: |
mov eax, 1 |
sub eax, [mute] |
mov [mute], eax |
jmp @f |
|
mute_volume: |
mov [mute], 1 |
|
set_sound: |
@@: |
mov [snd_driver.command], 6 |
mov [snd_driver.inputsz], 4 |
mov [snd_driver.output], 0 |
mov [snd_driver.outputsz], 0 |
mov [snd_driver.input], buffer |
mov edi, 10 |
cmpe [mute], 1, .set_sound |
sub edi, [volume] |
.set_sound: |
imul edi, 479 |
neg edi |
mov dword[buffer], edi |
mcall 68, 17, snd_driver |
|
mov dword[timer], TIMER |
call draw_icon |
call draw_bar |
jmp _update |
|
;---------------------------- |
|
_redraw: |
call draw_window |
call draw_icon |
call draw_bar |
|
jmp _update |
|
;---------------------------- |
|
draw_window: |
mcall 0, <[win.x], WIN_SIZE + 1>, <[win.y], WIN_SIZE + 1>, 0x61000000 |
|
mcall 13, <0, WIN_SIZE>, <1, WIN_SIZE - 2>, 0x3D3D3D |
mcall , <1, WIN_SIZE - 2>, <0, 1> |
mcall , , <WIN_SIZE - 1, 1> |
|
mcall 8, <0, WIN_SIZE>, <0, WIN_SIZE>, 0x60000002 |
mcall , <20, 80>, <22, 60>, 0x60000003 |
|
ret |
|
;---------------------------- |
|
draw_icon: |
mcall 7, image, <30, 45>, <31, 30> |
|
cmpe dword[mute], 0, @f |
mov ebx, 30 * 45 * 3 * 5 + image |
jmp .draw |
@@: |
cmpne dword[volume], 0, @f |
mov ebx, 30 * 45 * 3 * 1 + image |
jmp .draw |
@@: |
cmpge dword[volume], 5, @f |
mov ebx, 30 * 45 * 3 * 2 + image |
jmp .draw |
@@: |
cmpge dword[volume], 9, @f |
mov ebx, 30 * 45 * 3 * 3 + image |
jmp .draw |
@@: |
mov ebx, 30 * 45 * 3 * 4 + image |
.draw: |
mcall , , , <61, 30> |
|
ret |
|
;---------------------------- |
|
draw_bar: |
;; draw shadow |
mov eax, 13 |
mov ebx, 11 shl 16 + 9 |
mov ecx, 100 shl 16 + 1 |
mov edx, 0x252525 |
mov esi, 10 |
@@: |
cmpe esi, 0, @f |
mcall |
add ebx, 10 shl 16 |
dec esi |
jmp @b |
@@: |
|
;; draw active |
mov ebx, 11 shl 16 + 9 |
mov ecx, 96 shl 16 + 4 |
mov edx, 0xE5E5E5 |
mov esi, [volume] |
@@: |
cmpe esi, 0, @f |
mcall |
add ebx, 10 shl 16 |
dec esi |
jmp @b |
@@: |
|
;; draw inactive |
mov ebx, 11 shl 16 + 9 |
mov edx, 0x737373 |
mov esi, 10 |
sub esi, [volume] |
imul edi, [volume], 10 |
shl edi, 16 |
add ebx, edi |
@@: |
cmpe esi, 0, @f |
mcall |
add ebx, 10 shl 16 |
dec esi |
jmp @b |
@@: |
|
ret |
|
;---------------------------- |
|
@imports: |
library img, "libimg.obj" |
import img, \ |
img.init, "lib_init", \ |
img.to_rgb, "img_to_rgb2", \ |
img.decode, "img_decode", \ |
img.destroy, "img_destroy" |
|
;---------------------------- |
|
volume_dat db "/sys/settings/volume.dat", 0 |
|
is_save: |
dd 2 |
dd 0 |
dd 0 |
dd 8 |
dd volume |
db 0 |
dd volume_dat |
|
is_load: |
dd 0 |
dd 0 |
dd 0 |
dd 8 |
dd volume |
db 0 |
dd volume_dat |
|
icons file "icon.png" |
.size = $-icons |
snd_driver.name: |
db "SOUND", 0 |
shm_name db "volume-man", 0 |
|
@end: |
|
;===================================================================== |
|
win: |
.x rd 1 |
.y rd 1 |
.pid rd 1 |
|
image rb 45 * 30 * 6 * 3 |
.data rd 1 |
|
shm rd 1 |
volume rd 1 |
timer rd 1 |
mute rd 1 |
command rd 1 |
buffer rb 1024 |
snd_driver rd 1 |
.command rd 1 |
.input rd 1 |
.inputsz rd 1 |
.output rd 1 |
.outputsz rd 1 |
|
;===================================================================== |
rb 2048 |
_stack: |
rb 2048 |
@stack: |
@params rb 256 |
|
@memory: |