diff --git a/programs/system/docky/trunk/build_ru.bat b/programs/system/docky/trunk/build_ru.bat new file mode 100644 index 0000000000..44e6ba59f9 --- /dev/null +++ b/programs/system/docky/trunk/build_ru.bat @@ -0,0 +1,3 @@ +@fasm docky.asm @docky +@kpack @docky +@pause \ No newline at end of file diff --git a/programs/system/docky/trunk/docky.asm b/programs/system/docky/trunk/docky.asm new file mode 100644 index 0000000000..ea4948b069 --- /dev/null +++ b/programs/system/docky/trunk/docky.asm @@ -0,0 +1,972 @@ + ;;; Docky v0.4 by eAndrew + + use32 + org 0x0 +;------------------------------------------------------------------------------- + db "MENUET01" + dd 1, main, __dataend, __memend, __stackend, 0, sys_path +;------------------------------------------------------------------------------- + include "../../../macros.inc" + include "../../../proc32.inc" + include "../../../dll.inc" + include "../../../develop/libraries/box_lib/load_lib.mac" + + @use_library_mem \ + mem.Alloc, \ + mem.Free, \ + mem.ReAlloc, \ + dll.Load +;------------------------------------------------------------------------------- +ICON_SIZE equ 32 * 32 * 3 +IMAGE_FILE_SIZE equ ICON_SIZE * 29 +IMAGE_DATA_SIZE equ 32 * 32 * 4 * 29 +;================================================================================ +proc main +; ==== Init ==== + mcall 18, 7 + mov [win.psid], eax + + mcall 40, 100101b + + mov dword[file_exec.proc], 7 + +; ==== Load libs ==== + load_libraries load_lib_start, load_lib_end + +; ==== Config LibINI ==== + invoke ini.get_int, ini_data.file_name, ini_data.settings_name, ini_data.location_name, -1 + mov [dock_items.location], eax + + invoke ini.get_str, ini_data.file_name, ini_data.settings_name, ini_data.skin_name, ini_data.skin_file, 32, 0 + + invoke ini.get_color, ini_data.skin_dir, ini_data.skin_name, ini_data.color_bg, 0x0 + mov [color.bg], eax + invoke ini.get_color, ini_data.skin_dir, ini_data.skin_name, ini_data.color_frame, 0xFFFFFF + mov [color.frame], eax + invoke ini.get_color, ini_data.skin_dir, ini_data.skin_name, ini_data.color_framein, 0x888888 + mov [color.framein], eax + invoke ini.get_color, ini_data.skin_dir, ini_data.skin_name, ini_data.color_text, 0xFFFFFF + or eax, 0x80000000 + mov [color.text], eax + + invoke ini.sections, ini_data.file_name, sections_callback + +; ==== Config LibIMG ==== + stdcall mem.Alloc, dword IMAGE_FILE_SIZE + mov [img_data.rgb_object], eax + + mov dword[img_data.file.proc], 0 + mov dword[img_data.file.position], 0 + mov dword[img_data.file.size], dword IMAGE_FILE_SIZE + m2m dword[img_data.file.buffer], dword[img_data.rgb_object] + mov byte[img_data.file + 20], 0 + mov dword[img_data.file.name], img_data.file_name + + mcall 70, img_data.file + + cmp ebx, 0xFFFFFFFF + je @f + + stdcall dword[img.decode], dword[img_data.rgb_object], ebx, 0 + mov dword[img_data.object], eax + + ; === ALPHA === + mov edi, 0 + add eax, 24 + mov eax, [eax] + mov ecx, [color.bg] + .setalpha: + mov ebx, [eax + edi] + shr ebx, 24 + cmp ebx, 0 + jne .nonalpha + mov [eax + edi], ecx + .nonalpha: + add edi, 4 + cmp edi, IMAGE_DATA_SIZE + jne .setalpha + + ; === CONVERTING TO BGR + stdcall dword[img.toRGB], dword[img_data.object], dword[img_data.rgb_object] + stdcall dword[img.destroy], dword[img_data.object] + +; ==== Config window ==== + mov eax, dword[dock_items.location] + and eax, 1b + cmp eax, 0 + je .vert + jmp .setshape + + .vert: + mov byte[win.isvert], 1 + + .setshape: + cmp byte[win.isvert], 1 + je .vert_sp + + .horz_sp: + call .HORZ_WIDTH + call .HORZ_X + call .HORZ_HEIGHT + cmp dword[dock_items.location], 1 + je .settop + + .setbottom: + call .HORZ_Y_BOTTOM + jmp .SETDEF + + .settop: + call .HORZ_Y_TOP + jmp .SETDEF + + + .vert_sp: + call .VERT_WIDTH + call .VERT_HEIGHT + call .VERT_Y + cmp dword[dock_items.location], 2 + je .setleft + + .setright: + call .VERT_X_RIGHT + jmp .SETDEF + + .setleft: + call .VERT_X_LEFT + jmp .SETDEF + + .HORZ_WIDTH: + mov eax, 42 + mov ebx, [dock_items.count] + imul eax, ebx + dec eax + mov [win.width_opn], eax + mov [win.width_hdn], eax + + ret + + .HORZ_X: + mcall 14 + shr eax, 16 + mov ebx, 2 + mov edx, 0 + div ebx + mov edx, 0 + mov ecx, eax + + mov eax, [win.width_opn] + div ebx + sub ecx, eax + mov [win.x_opn], ecx + mov [win.x_hdn], ecx + + ret + + .HORZ_HEIGHT: + mov dword[win.height_opn], 42 + mov dword[win.height_hdn], 0 + + ret + + .HORZ_Y_BOTTOM: + mcall 14 + and eax, 0xFFFF + dec eax + mov [win.y_hdn], eax + sub eax, 42 + mov [win.y_opn], eax + + ret + + .HORZ_Y_TOP: + mov dword[win.y_opn], 0 + mov dword[win.y_hdn], 0 + + ret + + .VERT_WIDTH: + mov dword[win.width_opn], 42 + mov dword[win.width_hdn], 0 + + ret + + .VERT_X_LEFT: + + mov dword[win.x_opn], 0 + mov dword[win.x_hdn], 0 + + ret + + .VERT_X_RIGHT: + mcall 14 + and eax, 0xFFFF0000 + shr eax, 16 + mov [win.x_hdn], eax + sub eax, 42 + mov [win.x_opn], eax + + ret + + .VERT_HEIGHT: + mov eax, 42 + mov ebx, [dock_items.count] + imul eax, ebx + dec eax + mov [win.height_opn], eax + mov [win.height_hdn], eax + + ret + + .VERT_Y: + mcall 14 + and eax, 0xFFFF + mov edx, 0 + mov ebx, 2 + div ebx + mov esi, eax + + mov eax, [win.height_opn] + mov edx, 0 + mov ebx, 2 + div ebx + sub esi, eax + + mov [win.y_hdn], esi + mov [win.y_opn], esi + + ret + + .SETDEF: + mov eax, [win.width_hdn] + mov [win.width], eax + + mov eax, [win.x_hdn] + mov [win.x], eax + + mov eax, [win.height_hdn] + mov [win.height], eax + + mov eax, [win.y_hdn] + mov [win.y], eax + +; ==== START ==== + mcall 9, win.procinfo, -1 + mov ecx, [win.procinfo + 30] + mcall 18, 21 + and eax, 0xFFFF + mov [win.sid], eax + + call main_loop + +exit: + stdcall mem.Free, [img_data.rgb_object] + mcall 18, 2, [nwin.sid] + mcall -1 +endp +;------------------------------------------------------------------------------- +proc main_loop + mcall 10 + + cmp eax, EV_REDRAW + je event_redraw + + cmp eax, EV_BUTTON + je event_button + + cmp eax, EV_MOUSE + je event_mouse + + jmp main_loop + + .end: + ret +endp +;------------------------------------------------------------------------------- +proc event_redraw + mcall 12, 1 + + mcall 0, <[win.x], [win.width]>, <[win.y], [win.height]>, [color.frame], [color.frame], [color.frame] + + and ebx, 0x0000FFFF + add ebx, 0x00010000 + sub ebx, 0x00000001 + + and ecx, 0x0000FFFF + add ecx, 0x00010000 + sub ecx, 0x00000001 + + mcall 13, , , [color.framein] + + + add ebx, 0x00010000 + sub ebx, 0x00000002 + + add ecx, 0x00010000 + sub ecx, 0x00000002 + + mcall 13, , , [color.bg] + + mov edi, 0 + @@: + cmp edi, [dock_items.count] + je @f + + push edi + imul esi, edi, 42 + shl esi, 16 + add esi, 41 + cmp byte[win.isvert], 1 + je .vert_btn + mcall 8, esi, <0, 42>, 0x60000002, [color.bg] + jmp .endbtn + .vert_btn: + mcall 8, <0, 42>, esi, 0x60000002, [color.bg] + .endbtn: + pop edi + + cmp byte[dock_items.separator + edi], 1 + je .draw_separator + jmp .end_separator + + .draw_separator: + push ebx + push ecx + mov ebx, edi + imul ebx, 42 + add ebx, 41 + shl ebx, 16 + add ebx, 1 + cmp byte[win.isvert], 1 + je .vert_draw_sep + mcall 13, , <0, 43>, [color.frame] + sub ebx, 0x00010000 + mcall 13, , <1, 41>, [color.framein] + add ebx, 0x00020000 + mcall 13, , <1, 41>, [color.framein] + jmp .end_inner_sep + .vert_draw_sep: + mov ecx, ebx + mcall 13, <0, 43>, , [color.frame] + sub ecx, 0x00010000 + mcall 13, <1, 41>, , [color.framein] + add ecx, 0x00020000 + mcall 13, <1, 41>, , [color.framein] + .end_inner_sep: + pop ecx + pop ebx + .end_separator: + + cmp byte[win.isvert], 1 + je .vert_dig + mov edx, ebx + and edx, 0xFFFF0000 + add edx, 0x00050005 + jmp .digend + .vert_dig: + mov edx, ecx + and edx, 0xFFFF0000 + shr edx, 16 + add edx, 0x00050005 + .digend: + + imul ebx, edi, 4 + add ebx, dock_items.icon + mov ebx, [ebx] + imul ebx, ICON_SIZE + add ebx, [img_data.rgb_object] + + mcall 7, , <32, 32> + + inc edi + jmp @b + @@: + + mcall 12, 2 + + jmp main_loop +endp +;------------------------------------------------------------------------------- +proc event_button + mcall 17 + + cmp ah, 1 + je .button_close + + cmp ah, 2 + je .button_dock + + jmp @f + + .button_close: + jmp exit + + .button_dock: + mov edi, [win.button_index] + imul edi, 256 + + mov esi, edi + add esi, dock_items.path + mov dword[file_exec.file], esi + + mov esi, edi + add esi, dock_items.param + mov dword[file_exec.param], esi + + mcall 70, file_exec + + @@: + jmp main_loop +endp +;------------------------------------------------------------------------------- +proc event_mouse + mcall 37, 1 + mov edi, eax + mov esi, eax + shr edi, 16 + and esi, 0xFFFF + + cmp edi, 0 + jl @f + dec edi + cmp edi, [win.width] + jg @f + cmp esi, 0 + jl @f + dec esi + cmp esi, [win.height] + jg @f + + mov eax, [dock_items.location] + and eax, 1b + cmp eax, 1 + jne .vert + mov eax, edi + jmp .nxt + + .vert: + mov eax, esi + + .nxt: + mov edx, 0 + mov ebx, 42 + div ebx + + cmp eax, [dock_items.count] + jge .set0 + jmp .nxtcmp + + .set0: + mov eax, 100 + + .nxtcmp: + cmp [win.button_index], eax + je .nxt2 + + mov [win.button_index], eax + + .nxt2: + mov eax, [win.button_index] + imul eax, 42 + cmp byte[win.isvert], 1 + je .vert_name + sub eax, 13 + add eax, [win.x] + mov [nwin.x], eax + jmp .vert_end + .vert_name: + add eax, 13 + add eax, [win.y] + mov [nwin.y], eax + .vert_end: + mov byte[nwin.change_shape], 1 + + cmp byte[win.state], 1 + je .end_cmp + + mov edx, esp + add edx, 512 + mcall 51, 1, n_main + + mcall 18, 7 + mov [win.psid], eax + + mcall 18, 3, [win.sid] + + mov byte[win.state], 1 + + mov eax, [win.width_opn] + mov [win.width], eax + + mov eax, [win.x_opn] + mov [win.x], eax + + mov eax, [win.height_opn] + mov [win.height], eax + + mov eax, [win.y_opn] + mov [win.y], eax + + mcall 67, [win.x], [win.y], [win.width], [win.height] + + call event_redraw + + @@: + cmp byte[win.state], 0 + je .end_cmp + + mov byte[nwin.close], 1 + + mcall 18, 3, [win.psid] + + mov byte[win.state], 0 + mov byte[win.button_index], -1 + + mov eax, [win.width_hdn] + mov [win.width], eax + + mov eax, [win.x_hdn] + mov [win.x], eax + + mov eax, [win.height_hdn] + mov [win.height], eax + + mov eax, [win.y_hdn] + mov [win.y], eax + + mcall 67, [win.x], [win.y], [win.width], [win.height] + + call event_redraw + + .end_cmp: + jmp main_loop +endp +;------------------------------------------------------------------------------- +proc sections_callback, _file_name, _section_name + mov eax, [_section_name] + cmp byte[eax], '@' + jne @f + + dec dword[dock_items.count] + jmp .endproc + + @@: + ; ==== GET NAME ==== + mov ebx, [dock_items.count] + imul ebx, 16 + add ebx, dock_items.name + + mov eax, [_section_name] + + mov edi, 0 + @@: + mov cl, byte[eax] + mov byte[ebx + edi], cl + + inc eax + inc edi + cmp edi, 10 + jne @b + + ; ==== GET PATH ==== + mov ebx, [dock_items.count] + imul ebx, 256 + add ebx, dock_items.path + + invoke ini.get_str, [_file_name], [_section_name], ini_data.path_name, ebx, 256, 0 + + ; === GET PARAM === + mov ebx, [dock_items.count] + imul ebx, 256 + add ebx, dock_items.param + + invoke ini.get_str, [_file_name], [_section_name], ini_data.param_name, ebx, 256, 0 + + ; ==== GET ICON ==== + invoke ini.get_int, [_file_name], [_section_name], ini_data.icon_name, 0 + + mov ebx, [dock_items.count] + imul ebx, 4 + mov [dock_items.icon + ebx], eax + + ; ==== GET SEPARATOR ==== + invoke ini.get_int, [_file_name], [_section_name], ini_data.separator_name, 0 + + mov ebx, [dock_items.count] + mov byte[dock_items.separator + ebx], al + + ; ====== END ======= + .endproc: + mov eax, 1 + inc dword[dock_items.count] + ret +endp +;------------------------------------------------------------------------------- +n_main: + cmp dword[dock_items.location], 1 + je .top + cmp dword[dock_items.location], 4 + je .right + cmp dword[dock_items.location], 3 + je .bottom + jmp .left + .top: + mov eax, [win.height_opn] + add eax, 5 + mov [nwin.y], eax + jmp @f + .right: + mov eax, [win.x_opn] + sub eax, 73 + mov [nwin.x], eax + jmp @f + .bottom: + mov eax, [win.y_opn] + sub eax, 21 + mov [nwin.y], eax + jmp @f + .left: + mov eax, [win.width_opn] + add eax, 5 + mov [nwin.x], eax + @@: + mov dword[nwin.width], 68 + mov dword[nwin.height], 16 + + mcall 40, 1b + + mcall 9, win.procinfo, -1 + mov ecx, [win.procinfo + 30] + mcall 18, 21 + and eax, 0xFFFF + mov [nwin.sid], eax +;------------------------------------------------------------------------------- +n_main_loop: + mcall 23, 1 + + cmp eax, EV_IDLE + je n_event_idle + cmp eax, EV_REDRAW + je n_event_redraw + + jmp n_main_loop +;------------------------------------------------------------------------------- +n_event_idle: + cmp byte[nwin.close], 1 + jne @f + + mov byte[nwin.close], 0 + mcall -1 + + @@: + cmp byte[win.button_index], 100 + jne @f + + mcall 67, 0, 0, 0, 0 + jmp .end + + @@: + cmp byte[nwin.change_shape], 1 + jne .end + + mov byte[nwin.change_shape], 0 + mcall 67, [nwin.x], [nwin.y], [nwin.width], [nwin.height] + + .end: + jmp n_main_loop +;------------------------------------------------------------------------------- +n_event_redraw: + mcall 12, 1 + + mcall 0, <[nwin.x], [nwin.width]>, <[nwin.y], [nwin.height]>, [color.frame], [color.frame], [color.frame] + + and ebx, 0x0000FFFF + add ebx, 0x00010000 + sub ebx, 0x00000001 + + and ecx, 0x0000FFFF + add ecx, 0x00010000 + sub ecx, 0x00000001 + + mcall 13, , , [color.framein] + + + add ebx, 0x00010000 + sub ebx, 0x00000002 + + add ecx, 0x00010000 + sub ecx, 0x00000002 + + mcall 13, , , [color.bg] + + mov edx, [win.button_index] + imul edx, 16 + add edx, dock_items.name + + mov eax, 0 + @@: + inc eax + cmp byte[edx+eax], 0 + jne @b + + imul eax, 3 + mov ebx, 34 + sub ebx, eax + inc ebx + shl ebx, 16 + add ebx, 5 + + mcall 4, , [color.text] + + mcall 12, 2 + + jmp n_main_loop +;------------------------------------------------------------------------------- +img_data: + .file_name: + db "/sys/iconstrp.png", 0 + .cfg_text: + db "R", 0 + .ext_text: + db "X", 0 +;------------------------------------------------------------------------------- +ini_data: + .file_name: + db "/sys/settings/Docky.ini", 0 + .skin_dir: + db "/sys/settings/Docky skins/" + .skin_file: + db 32 dup(0) + .path_name: + db "path", 0 + .param_name: + db "param", 0 + .icon_name: + db "icon", 0 + .separator_name: + db "separator", 0 + + .settings_name: + db "@SETTINGS", 0 + .location_name: + db "location", 0 + .skin_name: + db "skin", 0 + .color_bg: + db "bg", 0 + .color_frame: + db "frame", 0 + .color_framein: + db "framein", 0 + .color_text: + db "text", 0 +;------------------------------------------------------------------------------- +load_lib_start: + lib1 l_libs img.name, \ + sys_path, \ + file_name, \ + img.dir, \ + error, \ + error, \ + img, \ + error, \ + error + + lib2 l_libs ini.name, \ + sys_path, \ + file_name, \ + ini.dir, \ + error, \ + error, \ + ini, \ + error, \ + error +load_lib_end: +;------------------------------------------------------------------------------- +img: + .init \ + dd .init_T + .toRGB \ + dd .toRGB_T + .decode \ + dd .decode_T + .destroy \ + dd .destroy_T + + dd 0, 0 + + .init_T: + db "lib_init", 0 + .toRGB_T: + db "img_to_rgb2", 0 + .decode_T: + db "img_decode", 0 + .destroy_T: + db "img_destroy", 0 + + .dir: + db "/sys/lib/" + .name: + db "libimg.obj", 0 +;------------------------------------------------------------------------------- +ini: + .init \ + dd .init_T + .sections \ + dd .sections_T + .get_int \ + dd .get_int_T + .get_str \ + dd .get_str_T + .get_color\ + dd .get_color_T + + dd 0, 0 + + .init_T: + db "lib_init", 0 + .sections_T: + db "ini_enum_sections", 0 + .get_int_T: + db "ini_get_int", 0 + .get_str_T: + db "ini_get_str", 0 + .get_color_T: + db "ini_get_color", 0 + + .dir: + db "/sys/lib/" + .name: + db "libini.obj", 0 +;------------------------------------------------------------------------------- +error: + db 0 +;------------------------------------------------------------------------------- +__dataend: +;================================================================================ + rb 1024 +__stackend: +;================================================================================ +color: + .bg: + rd 1 + .frame: + rd 1 + .framein: + rd 1 + .text: + rd 1 +;------------------------------------------------------------------------------- +win: + .x: + rd 1 + .y: + rd 1 + .width: + rd 1 + .height: + rd 1 + + .x_hdn: + rd 1 + .y_hdn: + rd 1 + .width_hdn: + rd 1 + .height_hdn: + rd 1 + + .x_opn: + rd 1 + .y_opn: + rd 1 + .width_opn: + rd 1 + .height_opn: + rd 1 + + .sid: + rd 1 + .psid: + rd 1 + .procinfo: + rb 1024 + .state: + rb 1 + .button_index: + rd 1 + + .isvert: + rb 1 +;------------------------------------------------------------------------------- +nwin: + .x: + rd 1 + .y: + rd 1 + .width: + rd 1 + .height: + rd 1 + + .visible: + rd 1 + .sid: + rd 1 + .change_shape: + rb 1 + .close: + rb 1 +;------------------------------------------------------------------------------- +img_data.object: + rd 1 +img_data.rgb_object: + rd 1 +img_data.file: + .proc: + rd 1 + .position: + rd 1 + rd 1 + .size: + rd 1 + .buffer: + rd 1 + rb 1 + .name: + rd 1 +;------------------------------------------------------------------------------- +file_exec: + .proc: + rd 1 + rd 1 + .param: + rd 1 + rd 1 + rd 1 + rb 1 + .file: + rd 1 +;------------------------------------------------------------------------------- +dock_items: + .count: + rd 1 + .name: + rb 16 * 20 + .path: + rb 256 * 20 + .param: + rb 256 * 20 + .icon: + rd 1 * 20 + .separator: + rb 1 * 20 + .location: + rd 1 +;------------------------------------------------------------------------------- +sys_path: + rb 4096 +file_name: + rb 4096 +;------------------------------------------------------------------------------- +__memend: +;================================================================================ \ No newline at end of file