diff --git a/data/Tupfile.lua b/data/Tupfile.lua index 2b4c8f2c0..7ea3f061b 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -397,7 +397,7 @@ tup.append_table(iso_extra_files, { if tup.getconfig('NO_FASM') ~= 'full' then tup.append_table(img_files, { {"KERNEL.MNT", VAR_PROGS .. "/../kernel/trunk/kernel.mnt"}, - {"@DOCKY", VAR_PROGS .. "/system/docky/trunk/docky"}, + {"@DOCKY", VAR_PROGS .. "/system/docky/docky"}, {"@HA", VAR_PROGS .. "/other/ha/HA"}, {"@ICON", VAR_PROGS .. "/system/icon_new/icon"}, {"@MENU", VAR_PROGS .. "/system/menu/trunk/menu"}, diff --git a/programs/system/docky/trunk/DATA.INC b/programs/system/docky/DATA.INC similarity index 100% rename from programs/system/docky/trunk/DATA.INC rename to programs/system/docky/DATA.INC diff --git a/programs/system/docky/trunk/MEMORY.INC b/programs/system/docky/MEMORY.INC similarity index 100% rename from programs/system/docky/trunk/MEMORY.INC rename to programs/system/docky/MEMORY.INC diff --git a/programs/system/docky/trunk/NAME.INC b/programs/system/docky/NAME.INC similarity index 100% rename from programs/system/docky/trunk/NAME.INC rename to programs/system/docky/NAME.INC diff --git a/programs/system/docky/trunk/Tupfile.lua b/programs/system/docky/Tupfile.lua similarity index 100% rename from programs/system/docky/trunk/Tupfile.lua rename to programs/system/docky/Tupfile.lua diff --git a/programs/system/docky/trunk/build.bat b/programs/system/docky/build.bat similarity index 100% rename from programs/system/docky/trunk/build.bat rename to programs/system/docky/build.bat diff --git a/programs/system/docky/trunk/docky.asm b/programs/system/docky/docky.asm similarity index 93% rename from programs/system/docky/trunk/docky.asm rename to programs/system/docky/docky.asm index 3fa0756a2..b300f9981 100644 --- a/programs/system/docky/trunk/docky.asm +++ b/programs/system/docky/docky.asm @@ -1,726 +1,730 @@ - use32 - org 0x0 -;------------------------------------------------------------------------------- - db "MENUET01" - dd 1, main, __dataend, __memend, __stackend, 0, sys_path -;------------------------------------------------------------------------------- - include "../../../macros.inc" - include "../../../proc32.inc" - include "../../../dll.inc" - include "../../../KOSfuncs.inc" - include "../../../load_lib.mac" - ;include "../../../debug.inc" - - include "DATA.INC" - include "NAME.INC" - - @use_library \ - mem.Alloc, mem.Free, mem.ReAlloc, dll.Load -;================================================================================ - -main: -; ==== Init ==== - mcall SF_SYS_MISC, SSF_HEAP_INIT - mcall SF_STYLE_SETTINGS, SSF_GET_COLORS, sc, sizeof.system_colors - call LOAD_ICONS - - mcall SF_SYSTEM, SSF_GET_ACTIVE_WINDOW - mov [win.psid], eax - - mcall SF_SET_EVENTS_MASK, EVM_REDRAW+EVM_BUTTON+EVM_MOUSE ;+EVM_DEKSTOP to update colors on skin change - -; ==== 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, 2 - test eax,eax - jz exit - mov [dock_items.location], eax - invoke ini.get_int, ini_data.file_name, ini_data.settings_name, ini_data.fsize_name, 0 - mov [dock_items.fsize], eax - invoke ini.get_int, ini_data.file_name, ini_data.settings_name, ini_data.ashow_name, 0 - mov [dock_items.ashow], eax - - invoke ini.sections, ini_data.file_name, sections_callback - -; ==== 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: - cmp [dock_items.fsize], byte 1 - je @f - mov eax, BUTTON_SIZE - mov ebx, [dock_items.count] - imul eax, ebx - add eax, 24 - dec eax - jmp .set_hw - @@: - mcall SF_GET_SCREEN_SIZE - shr eax, 16 - .set_hw: - mov [win.w_opn], eax - mov [win.w_hdn], eax - - ret - -;------------------------------------------------------------------------------- - .HORZ_X: - mcall SF_GET_SCREEN_SIZE - shr eax, 17 - mov ecx, [win.w_opn] - shr ecx, 1 - sub eax, ecx - mov [win.x_opn], eax - mov [win.x_hdn], eax - - ret - -;------------------------------------------------------------------------------- - .HORZ_HEIGHT: - mov dword[win.h_hdn], 3 - mov dword[win.h_opn], BUTTON_SIZE - - ret - -;------------------------------------------------------------------------------- - .HORZ_Y_BOTTOM: - mcall SF_GET_SCREEN_SIZE - and eax, 0xFFFF - dec eax - mov [win.y_hdn], eax - sub eax, 43 - 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.w_opn], BUTTON_SIZE - mov dword[win.w_hdn], 3 - - ret - -;------------------------------------------------------------------------------- - .VERT_X_LEFT: - mov dword[win.x_opn], 0 - mov dword[win.x_hdn], 0 - - ret - - .VERT_X_RIGHT: - mcall SF_GET_SCREEN_SIZE - and eax, 0xFFFF0000 - shr eax, 16 - mov [win.x_hdn], eax - sub eax, BUTTON_SIZE - mov [win.x_opn], eax - - ret - -;------------------------------------------------------------------------------- - .VERT_HEIGHT: - cmp [dock_items.fsize], byte 1 - je @f - mov eax, BUTTON_SIZE - mov ebx, [dock_items.count] - imul eax, ebx - dec eax - jmp .set_vh - @@: - mcall SF_GET_SCREEN_SIZE - and eax, 0xFFFF - .set_vh: - mov [win.h_opn], eax - mov [win.h_hdn], eax - - ret - -;------------------------------------------------------------------------------- - .VERT_Y: - mcall SF_GET_SCREEN_SIZE - and eax, 0xFFFF - shr eax, 1 - - mov esi, [win.h_opn] - shr esi, 1 - sub eax, esi - - mov [win.y_hdn], eax - mov [win.y_opn], eax - - ret - -;------------------------------------------------------------------------------- - .SETDEF: - mov eax, [win.w_hdn] - mov [win.w], eax - - mov eax, [win.x_hdn] - mov [win.x], eax - - mov eax, [win.h_hdn] - mov [win.h], eax - - mov eax, [win.y_hdn] - mov [win.y], eax - - cmp byte[dock_items.ashow],1 - jne .not_ashow - - mov eax, [win.w_opn] - mov [win.w], eax - - mov eax, [win.x_opn] - mov [win.x], eax - - mov eax, [win.h_opn] - mov [win.h], eax - - mov eax, [win.y_opn] - mov [win.y], eax - - .not_ashow: - - -;------------------------------------------------------------------------------- -; ==== START ==== - mcall SF_THREAD_INFO, win.procinfo, -1 - mov ecx, [win.procinfo + 30] - mcall SF_SYSTEM, SSF_GET_THREAD_SLOT - and eax, 0xFFFF - mov [win.sid], eax - - call main_loop -;------------------------------------------------------------------------------- -exit: - mcall SF_SYSTEM, SSF_TERMINATE_THREAD, [nwin.sid] - mcall SF_TERMINATE_PROCESS -;------------------------------------------------------------------------------- -error_exit: - push .notify - dec esp - push 0 - push 0 - push .error_message - push 0 - push SSF_START_APP - - mcall SF_FILE, esp - add esp, 6*4 + 1 - mcall SF_SYSTEM, SSF_TERMINATE_THREAD, [nwin.sid] - mcall SF_TERMINATE_PROCESS -.error_message: - db '"@DOCKY\nError load @RESHARE" -tdE',0 -.notify: - db '/sys/@notify',0 -;------------------------------------------------------------------------------- -align 4 -main_loop: - mcall SF_WAIT_EVENT - - cmp eax, EV_REDRAW - je event_redraw - - cmp eax, EV_BUTTON - je event_button - - cmp eax, EV_MOUSE - je event_mouse - - jmp main_loop -;------------------------------------------------------------------------------- -event_redraw: - call DRAW_WINDOW - jmp main_loop -;------------------------------------------------------------------------------- -DRAW_WINDOW: - mcall SF_REDRAW, SSF_BEGIN_DRAW - - push dword [sc.work] - mcall SF_STYLE_SETTINGS, SSF_GET_COLORS, sc, sizeof.system_colors - pop eax - cmp dword [sc.work], eax - je @f - call LOAD_ICONS - @@: - mov esi, [sc.work] - or esi, 0x01000000 - mcall SF_CREATE_WINDOW, <[win.x], [win.w]>, <[win.y], [win.h]>, [sc.work], , [sc.work_dark] - - xor edi, edi - @@: - cmp edi, [dock_items.count] - je @f - - push edi - mov eax, SF_DEFINE_BUTTON - mov edx, 0x60000002 - mov esi, [sc.work] - imul edi, BUTTON_SIZE - add edi, 12 - shl edi, 16 - add edi, BUTTON_SIZE - cmp byte[win.isvert], 1 - je .vert_btn - mcall , edi, <0, BUTTON_SIZE> - jmp .endbtn - .vert_btn: - sub edi, 12 shl 16 - mcall , <0, BUTTON_SIZE>, edi - .endbtn: - pop edi - - cmp byte[dock_items.separator + edi], 1 - jne .end_separator - - .draw_separator: - push ebx - push ecx - - mov eax, SF_DRAW_RECT - mov ebx, edi - imul ebx, BUTTON_SIZE - add ebx, BUTTON_SIZE - add ebx, 12-1 - shl ebx, 16 - add ebx, 2 - - cmp byte[win.isvert], 1 - je .vert_draw_sep - mcall , , <4, 36>, [sc.work_dark] - jmp .end_inner_sep - .vert_draw_sep: - sub ebx, 12 shl 16 - mov ecx, ebx - mcall , <4, 36>, , [sc.work_dark] - .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, 0x00060006 - jmp .digend - .vert_dig: - mov edx, ecx - and edx, 0xFFFF0000 - shr edx, 16 - add edx, 0x00060006 - .digend: - - imul ebx, edi, 4 - add ebx, dock_items.icon - mov ebx, [ebx] - - push edi - imul ebx, 32*32*4 - add ebx, [icons_inactive] - mcall SF_PUT_IMAGE_EXT, , <32, 32>, , 32, 0, 0 - pop edi - - inc edi - jmp @b - @@: - - mcall SF_REDRAW, SSF_END_DRAW - - ret -;------------------------------------------------------------------------------- -event_button: - mcall SF_GET_BUTTON - - ;; it must not be possible to close dock - ;cmp ah, 1 - ;je .button_close - - cmp ah, 2 - je .button_dock - - jmp @f - - ;.button_close: - ; jmp exit - - .button_dock: - mov edi, [win.btn_index] - imul edi, 256 - - mov dword[fi.p00], SSF_START_APP - - mov esi, edi - add esi, dock_items.path - mov dword[fi.p21], esi - - mov esi, edi - add esi, dock_items.param - mov dword[fi.p08], esi - - mcall SF_FILE, fi - - mov ecx, eax - mcall SF_SYSTEM, SSF_GET_THREAD_SLOT - and eax, 0xFFFF - mov [win.psid], eax - - jmp wnd_hide - - @@: - jmp main_loop -;------------------------------------------------------------------------------- -event_mouse: - ; ==== IS MOUSE INNER ==== - mcall SF_MOUSE_GET, SSF_WINDOW_POSITION - mov edi, eax - mov esi, eax - shr edi, 16 - and esi, 0xFFFF - - cmp edi, 0 - jl wnd_hide - dec edi - cmp edi, [win.w] - jg wnd_hide - cmp esi, 0 - jl wnd_hide - dec esi - cmp esi, [win.h] - jg wnd_hide - - ; ==== COUNT INDEX ==== - - mov eax, [dock_items.location] - and eax, 1b - cmp eax, 1 - jne .vert - mov eax, edi - jmp .nxt - - .vert: - mov eax, esi - add eax, 12 - - .nxt: - sub eax, 12 - mov edx, 0 - mov ebx, BUTTON_SIZE - div ebx - - cmp eax, [dock_items.count] - jge .set0 - jmp .nxtcmp - - .set0: - mov eax, 100 - - .nxtcmp: - cmp [win.btn_index], eax - je .nxt2 - - push dword[win.btn_index] - pop dword[win.prev_index] - - mov [win.btn_index], eax - - ; ==== DRAW SELECTION ==== - call DRAW_SELECTION - - .nxt2: - mov eax, [win.btn_index] - imul eax, BUTTON_SIZE - cmp byte[win.isvert], 1 - je .vert_name - add eax, [win.x] - mov [nwin.x], eax - mov byte[nwin.swap_shape], 1 - mcall SF_DRAW_RECT, <0, [win.w]>, <[win.h], 1>, [sc.work_dark] - jmp .vert_end - .vert_name: - add eax, [win.y] - add eax, 14 - mov [nwin.y], eax - mov byte[nwin.swap_shape], 1 - mcall SF_DRAW_RECT, <[win.w], 1>, <0, [win.h]>, [sc.work_dark] - .vert_end: - - ; ==== OPEN/CLOSE WINDOW ==== - cmp byte[win.state], 1 - je main_loop - - mov edx, esp - add edx, 512 - mcall SF_CREATE_THREAD, 1, n_main - - mcall SF_SYSTEM, SSF_GET_ACTIVE_WINDOW - mov [win.psid], eax - - mcall SF_SYSTEM, SSF_FOCUS_WINDOW, [win.sid] - - mov byte[win.state], 1 - - m2m dword [win.x], dword [win.x_opn] - m2m dword [win.y], dword [win.y_opn] - m2m dword [win.w], dword [win.w_opn] - m2m dword [win.h], dword [win.h_opn] - - cmp byte[dock_items.ashow],1 - je .change_nothing - mcall SF_CHANGE_WINDOW, [win.x], [win.y], [win.w], [win.h] - - .change_nothing: - call DRAW_WINDOW - call DRAW_SELECTION - jmp main_loop - -;------------------------------------------------------------------------------- -wnd_hide: - cmp byte[win.state], 0 - je main_loop - - mov byte[nwin.close], 1 - - mcall SF_SYSTEM, SSF_FOCUS_WINDOW, [win.psid] - - mov byte[win.state], 0 - mov byte[win.btn_index], -1 - - cmp byte[dock_items.ashow],1 - je .do_no_hide - - m2m dword [win.x], dword [win.x_hdn] - m2m dword [win.y], dword [win.y_hdn] - m2m dword [win.w], dword [win.w_hdn] - m2m dword [win.h], dword [win.h_hdn] - - mcall SF_CHANGE_WINDOW, [win.x], [win.y], [win.w], [win.h] - - .do_no_hide: - call DRAW_WINDOW - jmp main_loop -;------------------------------------------------------------------------------- -DRAW_SELECTION: - mov ebx, [win.prev_index] - imul ebx, BUTTON_SIZE - add ebx, 14 - shl ebx, 16 - add ebx, 40 - mov ecx, 0x00020028 - - cmp byte[win.isvert], 1 - jne @f - xchg ebx, ecx - sub ecx, 0x000C0000 - @@: - - mcall SF_DRAW_RECT, , , [sc.work] - - mov edx, ebx - shr ecx, 16 - mov dx, cx - add edx, 0x00040004 - - mov ebx, [win.prev_index] - imul ebx, 4 - add ebx, dock_items.icon - mov ebx, [ebx] - imul ebx, 32*32*4 - add ebx, [icons_inactive] - mcall SF_PUT_IMAGE_EXT, , <32, 32>, , 32, 0, 0 - - mov ebx, [win.btn_index] - imul ebx, BUTTON_SIZE - add ebx, 14 - shl ebx, 16 - add ebx, 40 - mov ecx, 0x00020028 - - cmp byte[win.isvert], 1 - jne @f - xchg ebx, ecx - sub ecx, 0x000C0000 - @@: - - mcall SF_DRAW_RECT, , , [sc.work_button] - - mov edx, ebx - shr ecx, 16 - mov dx, cx - add edx, 0x00040004 - - mov ebx, [win.btn_index] - imul ebx, 4 - add ebx, dock_items.icon - mov ebx, [ebx] - imul ebx, 32*32*4 - add ebx, [icons_active] - mcall SF_PUT_IMAGE_EXT, , <32, 32>, , 32, 0, 0 - - ret -;------------------------------------------------------------------------------- -proc icon32cpy uses ecx edx edi esi, dest:dword, src:dword, len:dword, bgcol:dword - mov edi, [dest] - mov esi, [src] - mov ecx, [len] - mov edx, [bgcol] -.loop: - m2m dword [edi], dword [esi] - cmp dword [edi], 0 - jne @f - mov dword [edi], edx - @@: - add edi, 4 - add esi, 4 - sub ecx, 4 - cmp ecx, 4 - jg .loop - - ret -endp -;------------------------------------------------------------------------------- -LOAD_ICONS: - mov esi, 0 ; esi is a counter of mem_open attempts - mov edi, esi - @@: - ; try to open shr memory, if failed then make 5 attempts more - mcall SF_SYS_MISC, SSF_MEM_OPEN,icons_resname ; 0 = SHM_READ - - cmp eax,0 - jne @f - inc edi - cmp edi,10 - je error_exit - mcall SF_SLEEP, 70 - jmp @b - @@: - mov [shr_icons_ptr], eax - mov [shr_icons_len], edx - - mcall SF_SYS_MISC, SSF_MEM_FREE, [icons_active] - mcall SF_SYS_MISC, SSF_MEM_ALLOC, [shr_icons_len] - mov [icons_active], eax - - mcall SF_SYS_MISC, SSF_MEM_FREE, [icons_inactive] - mcall SF_SYS_MISC, SSF_MEM_ALLOC, [shr_icons_len] - mov [icons_inactive], eax - - stdcall icon32cpy, [icons_inactive], [shr_icons_ptr], [shr_icons_len], [sc.work] - stdcall icon32cpy, [icons_active], [shr_icons_ptr], [shr_icons_len], [sc.work_button] - - mcall SF_SYS_MISC, SSF_MEM_CLOSE,icons_resname - - ret -;------------------------------------------------------------------------------- -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 -;------------------------------------------------------------------------------- - include "MEMORY.INC" \ No newline at end of file +; SPDX-License-Identifier: NOASSERTION +; + + + use32 + org 0x0 +;------------------------------------------------------------------------------- + db "MENUET01" + dd 1, main, __dataend, __memend, __stackend, 0, sys_path +;------------------------------------------------------------------------------- + include "../../macros.inc" + include "../../proc32.inc" + include "../../dll.inc" + include "../../KOSfuncs.inc" + include "../../load_lib.mac" + ;include "../../debug.inc" + + include "DATA.INC" + include "NAME.INC" + + @use_library \ + mem.Alloc, mem.Free, mem.ReAlloc, dll.Load +;================================================================================ + +main: +; ==== Init ==== + mcall SF_SYS_MISC, SSF_HEAP_INIT + mcall SF_STYLE_SETTINGS, SSF_GET_COLORS, sc, sizeof.system_colors + call LOAD_ICONS + + mcall SF_SYSTEM, SSF_GET_ACTIVE_WINDOW + mov [win.psid], eax + + mcall SF_SET_EVENTS_MASK, EVM_REDRAW+EVM_BUTTON+EVM_MOUSE ;+EVM_DEKSTOP to update colors on skin change + +; ==== 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, 2 + test eax,eax + jz exit + mov [dock_items.location], eax + invoke ini.get_int, ini_data.file_name, ini_data.settings_name, ini_data.fsize_name, 0 + mov [dock_items.fsize], eax + invoke ini.get_int, ini_data.file_name, ini_data.settings_name, ini_data.ashow_name, 0 + mov [dock_items.ashow], eax + + invoke ini.sections, ini_data.file_name, sections_callback + +; ==== 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: + cmp [dock_items.fsize], byte 1 + je @f + mov eax, BUTTON_SIZE + mov ebx, [dock_items.count] + imul eax, ebx + add eax, 24 + dec eax + jmp .set_hw + @@: + mcall SF_GET_SCREEN_SIZE + shr eax, 16 + .set_hw: + mov [win.w_opn], eax + mov [win.w_hdn], eax + + ret + +;------------------------------------------------------------------------------- + .HORZ_X: + mcall SF_GET_SCREEN_SIZE + shr eax, 17 + mov ecx, [win.w_opn] + shr ecx, 1 + sub eax, ecx + mov [win.x_opn], eax + mov [win.x_hdn], eax + + ret + +;------------------------------------------------------------------------------- + .HORZ_HEIGHT: + mov dword[win.h_hdn], 3 + mov dword[win.h_opn], BUTTON_SIZE + + ret + +;------------------------------------------------------------------------------- + .HORZ_Y_BOTTOM: + mcall SF_GET_SCREEN_SIZE + and eax, 0xFFFF + dec eax + mov [win.y_hdn], eax + sub eax, 43 + 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.w_opn], BUTTON_SIZE + mov dword[win.w_hdn], 3 + + ret + +;------------------------------------------------------------------------------- + .VERT_X_LEFT: + mov dword[win.x_opn], 0 + mov dword[win.x_hdn], 0 + + ret + + .VERT_X_RIGHT: + mcall SF_GET_SCREEN_SIZE + and eax, 0xFFFF0000 + shr eax, 16 + mov [win.x_hdn], eax + sub eax, BUTTON_SIZE + mov [win.x_opn], eax + + ret + +;------------------------------------------------------------------------------- + .VERT_HEIGHT: + cmp [dock_items.fsize], byte 1 + je @f + mov eax, BUTTON_SIZE + mov ebx, [dock_items.count] + imul eax, ebx + dec eax + jmp .set_vh + @@: + mcall SF_GET_SCREEN_SIZE + and eax, 0xFFFF + .set_vh: + mov [win.h_opn], eax + mov [win.h_hdn], eax + + ret + +;------------------------------------------------------------------------------- + .VERT_Y: + mcall SF_GET_SCREEN_SIZE + and eax, 0xFFFF + shr eax, 1 + + mov esi, [win.h_opn] + shr esi, 1 + sub eax, esi + + mov [win.y_hdn], eax + mov [win.y_opn], eax + + ret + +;------------------------------------------------------------------------------- + .SETDEF: + mov eax, [win.w_hdn] + mov [win.w], eax + + mov eax, [win.x_hdn] + mov [win.x], eax + + mov eax, [win.h_hdn] + mov [win.h], eax + + mov eax, [win.y_hdn] + mov [win.y], eax + + cmp byte[dock_items.ashow],1 + jne .not_ashow + + mov eax, [win.w_opn] + mov [win.w], eax + + mov eax, [win.x_opn] + mov [win.x], eax + + mov eax, [win.h_opn] + mov [win.h], eax + + mov eax, [win.y_opn] + mov [win.y], eax + + .not_ashow: + + +;------------------------------------------------------------------------------- +; ==== START ==== + mcall SF_THREAD_INFO, win.procinfo, -1 + mov ecx, [win.procinfo + 30] + mcall SF_SYSTEM, SSF_GET_THREAD_SLOT + and eax, 0xFFFF + mov [win.sid], eax + + call main_loop +;------------------------------------------------------------------------------- +exit: + mcall SF_SYSTEM, SSF_TERMINATE_THREAD, [nwin.sid] + mcall SF_TERMINATE_PROCESS +;------------------------------------------------------------------------------- +error_exit: + push .notify + dec esp + push 0 + push 0 + push .error_message + push 0 + push SSF_START_APP + + mcall SF_FILE, esp + add esp, 6*4 + 1 + mcall SF_SYSTEM, SSF_TERMINATE_THREAD, [nwin.sid] + mcall SF_TERMINATE_PROCESS +.error_message: + db '"@DOCKY\nError load @RESHARE" -tdE',0 +.notify: + db '/sys/@notify',0 +;------------------------------------------------------------------------------- +align 4 +main_loop: + mcall SF_WAIT_EVENT + + cmp eax, EV_REDRAW + je event_redraw + + cmp eax, EV_BUTTON + je event_button + + cmp eax, EV_MOUSE + je event_mouse + + jmp main_loop +;------------------------------------------------------------------------------- +event_redraw: + call DRAW_WINDOW + jmp main_loop +;------------------------------------------------------------------------------- +DRAW_WINDOW: + mcall SF_REDRAW, SSF_BEGIN_DRAW + + push dword [sc.work] + mcall SF_STYLE_SETTINGS, SSF_GET_COLORS, sc, sizeof.system_colors + pop eax + cmp dword [sc.work], eax + je @f + call LOAD_ICONS + @@: + mov esi, [sc.work] + or esi, 0x01000000 + mcall SF_CREATE_WINDOW, <[win.x], [win.w]>, <[win.y], [win.h]>, [sc.work], , [sc.work_dark] + + xor edi, edi + @@: + cmp edi, [dock_items.count] + je @f + + push edi + mov eax, SF_DEFINE_BUTTON + mov edx, 0x60000002 + mov esi, [sc.work] + imul edi, BUTTON_SIZE + add edi, 12 + shl edi, 16 + add edi, BUTTON_SIZE + cmp byte[win.isvert], 1 + je .vert_btn + mcall , edi, <0, BUTTON_SIZE> + jmp .endbtn + .vert_btn: + sub edi, 12 shl 16 + mcall , <0, BUTTON_SIZE>, edi + .endbtn: + pop edi + + cmp byte[dock_items.separator + edi], 1 + jne .end_separator + + .draw_separator: + push ebx + push ecx + + mov eax, SF_DRAW_RECT + mov ebx, edi + imul ebx, BUTTON_SIZE + add ebx, BUTTON_SIZE + add ebx, 12-1 + shl ebx, 16 + add ebx, 2 + + cmp byte[win.isvert], 1 + je .vert_draw_sep + mcall , , <4, 36>, [sc.work_dark] + jmp .end_inner_sep + .vert_draw_sep: + sub ebx, 12 shl 16 + mov ecx, ebx + mcall , <4, 36>, , [sc.work_dark] + .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, 0x00060006 + jmp .digend + .vert_dig: + mov edx, ecx + and edx, 0xFFFF0000 + shr edx, 16 + add edx, 0x00060006 + .digend: + + imul ebx, edi, 4 + add ebx, dock_items.icon + mov ebx, [ebx] + + push edi + imul ebx, 32*32*4 + add ebx, [icons_inactive] + mcall SF_PUT_IMAGE_EXT, , <32, 32>, , 32, 0, 0 + pop edi + + inc edi + jmp @b + @@: + + mcall SF_REDRAW, SSF_END_DRAW + + ret +;------------------------------------------------------------------------------- +event_button: + mcall SF_GET_BUTTON + + ;; it must not be possible to close dock + ;cmp ah, 1 + ;je .button_close + + cmp ah, 2 + je .button_dock + + jmp @f + + ;.button_close: + ; jmp exit + + .button_dock: + mov edi, [win.btn_index] + imul edi, 256 + + mov dword[fi.p00], SSF_START_APP + + mov esi, edi + add esi, dock_items.path + mov dword[fi.p21], esi + + mov esi, edi + add esi, dock_items.param + mov dword[fi.p08], esi + + mcall SF_FILE, fi + + mov ecx, eax + mcall SF_SYSTEM, SSF_GET_THREAD_SLOT + and eax, 0xFFFF + mov [win.psid], eax + + jmp wnd_hide + + @@: + jmp main_loop +;------------------------------------------------------------------------------- +event_mouse: + ; ==== IS MOUSE INNER ==== + mcall SF_MOUSE_GET, SSF_WINDOW_POSITION + mov edi, eax + mov esi, eax + shr edi, 16 + and esi, 0xFFFF + + cmp edi, 0 + jl wnd_hide + dec edi + cmp edi, [win.w] + jg wnd_hide + cmp esi, 0 + jl wnd_hide + dec esi + cmp esi, [win.h] + jg wnd_hide + + ; ==== COUNT INDEX ==== + + mov eax, [dock_items.location] + and eax, 1b + cmp eax, 1 + jne .vert + mov eax, edi + jmp .nxt + + .vert: + mov eax, esi + add eax, 12 + + .nxt: + sub eax, 12 + mov edx, 0 + mov ebx, BUTTON_SIZE + div ebx + + cmp eax, [dock_items.count] + jge .set0 + jmp .nxtcmp + + .set0: + mov eax, 100 + + .nxtcmp: + cmp [win.btn_index], eax + je .nxt2 + + push dword[win.btn_index] + pop dword[win.prev_index] + + mov [win.btn_index], eax + + ; ==== DRAW SELECTION ==== + call DRAW_SELECTION + + .nxt2: + mov eax, [win.btn_index] + imul eax, BUTTON_SIZE + cmp byte[win.isvert], 1 + je .vert_name + add eax, [win.x] + mov [nwin.x], eax + mov byte[nwin.swap_shape], 1 + mcall SF_DRAW_RECT, <0, [win.w]>, <[win.h], 1>, [sc.work_dark] + jmp .vert_end + .vert_name: + add eax, [win.y] + add eax, 14 + mov [nwin.y], eax + mov byte[nwin.swap_shape], 1 + mcall SF_DRAW_RECT, <[win.w], 1>, <0, [win.h]>, [sc.work_dark] + .vert_end: + + ; ==== OPEN/CLOSE WINDOW ==== + cmp byte[win.state], 1 + je main_loop + + mov edx, esp + add edx, 512 + mcall SF_CREATE_THREAD, 1, n_main + + mcall SF_SYSTEM, SSF_GET_ACTIVE_WINDOW + mov [win.psid], eax + + mcall SF_SYSTEM, SSF_FOCUS_WINDOW, [win.sid] + + mov byte[win.state], 1 + + m2m dword [win.x], dword [win.x_opn] + m2m dword [win.y], dword [win.y_opn] + m2m dword [win.w], dword [win.w_opn] + m2m dword [win.h], dword [win.h_opn] + + cmp byte[dock_items.ashow],1 + je .change_nothing + mcall SF_CHANGE_WINDOW, [win.x], [win.y], [win.w], [win.h] + + .change_nothing: + call DRAW_WINDOW + call DRAW_SELECTION + jmp main_loop + +;------------------------------------------------------------------------------- +wnd_hide: + cmp byte[win.state], 0 + je main_loop + + mov byte[nwin.close], 1 + + mcall SF_SYSTEM, SSF_FOCUS_WINDOW, [win.psid] + + mov byte[win.state], 0 + mov byte[win.btn_index], -1 + + cmp byte[dock_items.ashow],1 + je .do_no_hide + + m2m dword [win.x], dword [win.x_hdn] + m2m dword [win.y], dword [win.y_hdn] + m2m dword [win.w], dword [win.w_hdn] + m2m dword [win.h], dword [win.h_hdn] + + mcall SF_CHANGE_WINDOW, [win.x], [win.y], [win.w], [win.h] + + .do_no_hide: + call DRAW_WINDOW + jmp main_loop +;------------------------------------------------------------------------------- +DRAW_SELECTION: + mov ebx, [win.prev_index] + imul ebx, BUTTON_SIZE + add ebx, 14 + shl ebx, 16 + add ebx, 40 + mov ecx, 0x00020028 + + cmp byte[win.isvert], 1 + jne @f + xchg ebx, ecx + sub ecx, 0x000C0000 + @@: + + mcall SF_DRAW_RECT, , , [sc.work] + + mov edx, ebx + shr ecx, 16 + mov dx, cx + add edx, 0x00040004 + + mov ebx, [win.prev_index] + imul ebx, 4 + add ebx, dock_items.icon + mov ebx, [ebx] + imul ebx, 32*32*4 + add ebx, [icons_inactive] + mcall SF_PUT_IMAGE_EXT, , <32, 32>, , 32, 0, 0 + + mov ebx, [win.btn_index] + imul ebx, BUTTON_SIZE + add ebx, 14 + shl ebx, 16 + add ebx, 40 + mov ecx, 0x00020028 + + cmp byte[win.isvert], 1 + jne @f + xchg ebx, ecx + sub ecx, 0x000C0000 + @@: + + mcall SF_DRAW_RECT, , , [sc.work_button] + + mov edx, ebx + shr ecx, 16 + mov dx, cx + add edx, 0x00040004 + + mov ebx, [win.btn_index] + imul ebx, 4 + add ebx, dock_items.icon + mov ebx, [ebx] + imul ebx, 32*32*4 + add ebx, [icons_active] + mcall SF_PUT_IMAGE_EXT, , <32, 32>, , 32, 0, 0 + + ret +;------------------------------------------------------------------------------- +proc icon32cpy uses ecx edx edi esi, dest:dword, src:dword, len:dword, bgcol:dword + mov edi, [dest] + mov esi, [src] + mov ecx, [len] + mov edx, [bgcol] +.loop: + m2m dword [edi], dword [esi] + cmp dword [edi], 0 + jne @f + mov dword [edi], edx + @@: + add edi, 4 + add esi, 4 + sub ecx, 4 + cmp ecx, 4 + jg .loop + + ret +endp +;------------------------------------------------------------------------------- +LOAD_ICONS: + mov esi, 0 ; esi is a counter of mem_open attempts + mov edi, esi + @@: + ; try to open shr memory, if failed then make 5 attempts more + mcall SF_SYS_MISC, SSF_MEM_OPEN,icons_resname ; 0 = SHM_READ + + cmp eax,0 + jne @f + inc edi + cmp edi,10 + je error_exit + mcall SF_SLEEP, 70 + jmp @b + @@: + mov [shr_icons_ptr], eax + mov [shr_icons_len], edx + + mcall SF_SYS_MISC, SSF_MEM_FREE, [icons_active] + mcall SF_SYS_MISC, SSF_MEM_ALLOC, [shr_icons_len] + mov [icons_active], eax + + mcall SF_SYS_MISC, SSF_MEM_FREE, [icons_inactive] + mcall SF_SYS_MISC, SSF_MEM_ALLOC, [shr_icons_len] + mov [icons_inactive], eax + + stdcall icon32cpy, [icons_inactive], [shr_icons_ptr], [shr_icons_len], [sc.work] + stdcall icon32cpy, [icons_active], [shr_icons_ptr], [shr_icons_len], [sc.work_button] + + mcall SF_SYS_MISC, SSF_MEM_CLOSE,icons_resname + + ret +;------------------------------------------------------------------------------- +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 +;------------------------------------------------------------------------------- + include "MEMORY.INC"