diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index c28e750130..753fe70335 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -635,6 +635,15 @@ в формате подфункции 2 функции 37 в момент начала нажатия на кнопку, за исключением младшего бита (соответствующего левой кнопке мыши), который сбрасывается. +====================================================================== += Функция 18, подфункция 1 - сделать самым нижним окно потока. ======= +====================================================================== +Параметры: + * eax = 18 - номер функции + * ebx = 1 - номер подфункции + * ecx = номер слота потока +Возвращаемое значение: + * функция не возвращает значения ====================================================================== ==== Функция 18, подфункция 2 - завершить процесс/поток по слоту. ==== diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 93165f1f3c..250ee9e764 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -626,6 +626,17 @@ Remarks: as in subfunction 2 of function 37 at the beginning of button press, excluding lower bit, which is cleared. +====================================================================== +===================== Function 18, subfunction 1 ===================== +============= Make deactive the window of the given thread. ========== +====================================================================== +Parameters: + * eax = 18 - function number + * ebx = 1 - subfunction number + * ecx = number of the thread slot +Returned value: + * function does not return value + ====================================================================== = Function 18, subfunction 2 - terminate process/thread by the slot. = ====================================================================== diff --git a/kernel/trunk/gui/window.inc b/kernel/trunk/gui/window.inc index f66598534b..8bfc01ca42 100644 --- a/kernel/trunk/gui/window.inc +++ b/kernel/trunk/gui/window.inc @@ -1812,6 +1812,9 @@ window._.window_activate: ;//////////////////////////////////////////////////// ; if type of current active window is 3 or 4, it must be redrawn mov ebx, [TASK_COUNT] + +; DEBUGF 1, "K : TASK_COUNT (0x%x)\n", ebx + movzx ebx, word[WIN_POS + ebx * 2] shl ebx, 5 add eax, window_data @@ -1838,6 +1841,13 @@ window._.window_activate: ;//////////////////////////////////////////////////// cmp eax, [TASK_COUNT] jae .move_self_up inc eax + +; push ebx +; xor ebx,ebx +; mov bx,[WIN_STACK + eax * 2] +; DEBUGF 1, "K : DEC WIN_STACK (0x%x)\n",ebx +; pop ebx + cmp [WIN_STACK + eax * 2], bx jbe .next_stack_window dec word[WIN_STACK + eax * 2] @@ -1870,6 +1880,53 @@ window._.window_activate: ;//////////////////////////////////////////////////// pop ebx eax ret +;------------------------------------------------------------------------------ +window._.window_deactivate: ;//////////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? Deactivate window +;------------------------------------------------------------------------------ +;> esi = pointer to WIN_POS+ window data +;------------------------------------------------------------------------------ + push eax ebx +;------------------------------------------------------------------------------ +.move_others_up: + ; ax <- process no + movzx ebx, word[esi] + ; ax <- position in window stack + movzx ebx, word[WIN_STACK + ebx * 2] + ; up others + xor eax, eax +.next_stack_window: + cmp eax, [TASK_COUNT] + jae .move_self_down + inc eax + cmp [WIN_STACK + eax * 2], bx + jae .next_stack_window + inc word[WIN_STACK + eax * 2] + jmp .next_stack_window +;---------------------------------------------- +.move_self_down: + movzx ebx, word[esi] + ; this is the last (and the low) + mov [WIN_STACK + ebx * 2], word 1 + ; update on screen - window stack + xor eax, eax +.next_window_pos: + cmp eax, [TASK_COUNT] + jae .reset_vars + inc eax + movzx ebx, word[WIN_STACK + eax * 2] + mov [WIN_POS + ebx * 2], ax + jmp .next_window_pos +;----------------------------------------------- +.reset_vars: + mov byte[KEY_COUNT], 0 + mov byte[BTN_COUNT], 0 + mov word[MOUSE_SCROLL_H], 0 + mov word[MOUSE_SCROLL_V], 0 + pop ebx eax + ret +;------------------------------------------------------------------------------ align 4 ;------------------------------------------------------------------------------ window._.check_window_draw: ;////////////////////////////////////////////////// diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index e94783fde3..7d0a94ce6d 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -1941,7 +1941,7 @@ sys_end: iglobal align 4 sys_system_table: - dd exit_for_anyone ; 1 = obsolete + dd sysfn_deactivate ; 1 = deactivate window dd sysfn_terminate ; 2 = terminate thread dd sysfn_activate ; 3 = activate window dd sysfn_getidletime ; 4 = get idle time @@ -1966,7 +1966,7 @@ sys_system_table: dd sysfn_min_rest_window ; 22 = minimize and restore any window sysfn_num = ($ - sys_system_table)/4 endg - +;------------------------------------------------------------------------------ sys_system: dec ebx cmp ebx, sysfn_num @@ -1974,8 +1974,7 @@ sys_system: jmp dword [sys_system_table + ebx*4] @@: ret - - +;------------------------------------------------------------------------------ sysfn_shutdown: ; 18.9 = system shutdown cmp ecx,1 jl exit_for_anyone @@ -1992,7 +1991,7 @@ sysfn_shutdown: ; 18.9 = system shutdown uglobal shutdown_processes: dd 0x0 endg - +;------------------------------------------------------------------------------ sysfn_terminate: ; 18.2 = TERMINATE cmp ecx,2 jb noprocessterminate @@ -2016,7 +2015,7 @@ sysfn_terminate: ; 18.2 = TERMINATE noatsc: noprocessterminate: ret - +;------------------------------------------------------------------------------ sysfn_terminate2: ;lock application_table_status mutex .table_status: @@ -2043,7 +2042,34 @@ sysfn_terminate2: mov [application_table_status],0 or dword [esp+32],-1 ret +;------------------------------------------------------------------------------ +sysfn_deactivate: ; 18.1 = DEACTIVATE WINDOW + cmp ecx,2 + jb .nowindowdeactivate + cmp ecx,[TASK_COUNT] + ja .nowindowdeactivate + + movzx esi, word [WIN_STACK + ecx*2] + cmp esi, 1 + je .nowindowdeactivate ; already deactive + mov edi, ecx + shl edi, 5 + add edi, window_data + movzx esi, word [WIN_STACK + ecx * 2] + lea esi, [WIN_POS + esi * 2] + call window._.window_deactivate + + xor eax, eax + mov byte[MOUSE_BACKGROUND], al + mov byte[DONT_DRAW_MOUSE], al + mov byte[MOUSE_DOWN], 0 + + call syscall_display_settings._.calculate_whole_screen + call syscall_display_settings._.redraw_whole_screen +.nowindowdeactivate: + ret + ;------------------------------------------------------------------------------ sysfn_activate: ; 18.3 = ACTIVATE WINDOW cmp ecx,2 jb .nowindowactivate @@ -2064,28 +2090,29 @@ sysfn_activate: ; 18.3 = ACTIVATE WINDOW call waredraw .nowindowactivate: ret - +;------------------------------------------------------------------------------ sysfn_getidletime: ; 18.4 = GET IDLETIME mov eax,[idleusesec] mov [esp+32], eax ret - +;------------------------------------------------------------------------------ sysfn_getcpuclock: ; 18.5 = GET TSC/SEC mov eax,[CPU_FREQ] mov [esp+32], eax ret - +;------------------------------------------------------------------------------ ; SAVE ramdisk to /hd/1/menuet.img ;!!!!!!!!!!!!!!!!!!!!!!!! include 'blkdev/rdsave.inc' ;!!!!!!!!!!!!!!!!!!!!!!!! +;------------------------------------------------------------------------------ align 4 sysfn_getactive: ; 18.7 = get active window mov eax, [TASK_COUNT] movzx eax, word [WIN_POS + eax*2] mov [esp+32],eax ret - +;------------------------------------------------------------------------------ sysfn_sound_flag: ; 18.8 = get/set sound_flag ; cmp ecx,1 dec ecx @@ -2100,10 +2127,11 @@ sysfn_sound_flag: ; 18.8 = get/set sound_flag xor byte [sound_flag], 1 nosoundflag: ret - +;------------------------------------------------------------------------------ sysfn_minimize: ; 18.10 = minimize window mov [window_minimize],1 ret +;------------------------------------------------------------------------------ align 4 sysfn_getdiskinfo: ; 18.11 = get disk info table ; cmp ecx,1 @@ -2128,18 +2156,18 @@ sysfn_getdiskinfo: ; 18.11 = get disk info table cld rep movsd ret - +;------------------------------------------------------------------------------ sysfn_lastkey: ; 18.12 = return 0 (backward compatibility) and dword [esp+32], 0 ret - +;------------------------------------------------------------------------------ sysfn_getversion: ; 18.13 = get kernel ID and version mov edi,ecx mov esi,version_inf mov ecx,version_end-version_inf rep movsb ret - +;------------------------------------------------------------------------------ sysfn_waitretrace: ; 18.14 = sys wait retrace ;wait retrace functions sys_wait_retrace: @@ -2150,7 +2178,7 @@ sysfn_waitretrace: ; 18.14 = sys wait retrace jz WaitRetrace_loop and [esp+32],dword 0 ret - +;------------------------------------------------------------------------------ align 4 sysfn_centermouse: ; 18.15 = mouse centered ; removed here by @@ -2169,8 +2197,8 @@ sysfn_centermouse: ; 18.15 = mouse centered xor eax,eax and [esp+32],eax ; pop eax - ret +;------------------------------------------------------------------------------ align 4 sysfn_mouse_acceleration: ; 18.19 = set/get mouse features test ecx,ecx ; get mouse speed factor @@ -2217,7 +2245,7 @@ sysfn_mouse_acceleration: ; 18.19 = set/get mouse features mov [mouse_active],1 .end: ret - +;------------------------------------------------------------------------------ sysfn_getfreemem: mov eax, [pg_data.pages_free] shl eax, 2