diff --git a/kernel/trunk/core/syscall.inc b/kernel/trunk/core/syscall.inc index bbabd947bd..dc8db96724 100644 --- a/kernel/trunk/core/syscall.inc +++ b/kernel/trunk/core/syscall.inc @@ -213,6 +213,7 @@ iglobal dd sys_debug_services ; 69-Debug dd file_system_lfn ; 70-Common file system interface, version 2 dd syscall_windowsettings ; 71-Window settings + dd sys_sendwindowmsg ; 72-Send window message times 255 - ( ($-servetable) /4 ) dd undefined_syscall diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index 1a667f6695..c4e70e3180 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -2198,14 +2198,15 @@ dd 638 * eax = 47 - номер функции * ebx = параметры преобразования числа в текст: * bl = 0 - ecx содержит число - * bl = 1 - ecx содержит указатель на dword-число, либо qword-число + * bl = 1 - ecx содержит указатель на dword/qword-число * bh = 0 - отображать в десятичной системе счисления * bh = 1 - отображать в шестнадцатеричной системе * bh = 2 - отображать в двоичной системе * биты 16-21 = сколько цифр отображать * биты 22-29 зарезервированы и должны быть установлены в 0 - * бит 30 - установлен в 1, если требуется вывод qword (64-битного) числа - * бит 31 - установлен в 1, если требуется вывод числа без пустых нулей в старших разрядах + * бит 30 установлен = выводить qword (64-битное число); + при этом должно быть bl = 1 + * бит 31 установлен = не выводить ведущие нули числа * ecx = число (при bl=0) или указатель (при bl=1) * edx = [координата по оси x]*65536 + [координата по оси y] * esi = 0xX0RRGGBB: @@ -4592,6 +4593,20 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); строки. * Чтобы убрать заголовок, передайте NULL в ecx. +====================================================================== +================ Функция 72 - послать сообщение окну. ================ +====================================================================== + +--- Подфункция 1 - послать сообщение с параметром активному окну. ---- +Параметры: + * eax = 72 - номер функции + * ebx = 1 - номер подфункции + * ecx = код события: 2 или 3 + * edx = код клавиши для ecx=2, идентификатор кнопки для ecx=3 +Возвращаемое значение: + * eax = 0 - успешно + * eax = 1 - буфер заполнен + ====================================================================== ========== Функция -1 - завершить выполнение потока/процесса ========= ====================================================================== diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 583c126b24..438e7573c3 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -2169,14 +2169,14 @@ Parameters: * eax = 47 - function number * ebx = parameters of conversion number to text: * bl = 0 - ecx contains number - * bl = 1 - ecx contains pointer to dword-number, or qword-number + * bl = 1 - ecx contains pointer to dword/qword-number * bh = 0 - display in decimal number system * bh = 1 - display in hexadecimal system * bh = 2 - display in binary system * bits 16-21 = how many digits to display * bits 22-29 reserved and must be set to 0 - * bit 30 - set in 1, if the output of qword (64-bites) number - * bit 31 - set in 1, if the output of number without empty zero in high bits is required + * bit 30 set = display qword (64-bit) number (must be bl=1) + * bit 31 set = do not display leading zeroes of the number * ecx = number (if bl=0) or pointer (if bl=1) * edx = [coordinate on axis x]*65536 + [coordinate on axis y] * esi = 0xX0RRGGBB: @@ -4547,6 +4547,20 @@ Remarks: length, no more than 255 characters are drawn. * Pass NULL in ecx to remove caption. +====================================================================== +=============== Function 72 - send message to a window. ============== +====================================================================== + +- Subfunction 1 - send message with parameter to the active window. -- +Parameters: + * eax = 72 - function number + * ebx = 1 - subfunction number + * ecx = event code: 2 or 3 + * edx = parameter: key code for ecx=2, button identifier for ecx=3 +Returned value: + * eax = 0 - success + * eax = 1 - buffer is full + ====================================================================== =============== Function -1 - terminate thread/process =============== ====================================================================== diff --git a/kernel/trunk/gui/event.inc b/kernel/trunk/gui/event.inc index bba03f1752..8625c9183f 100644 --- a/kernel/trunk/gui/event.inc +++ b/kernel/trunk/gui/event.inc @@ -493,6 +493,40 @@ eventoccur: mov [esp+36], eax ret +sys_sendwindowmsg: + dec eax + jnz .ret + cmp ebx, 3 + jz .sendbtn + cmp ebx, 2 + jnz .ret +.sendkey: + pushf + cli + movzx eax, byte [KEY_COUNT] + cmp al, 120 + jae .overflow + inc eax + mov [KEY_COUNT], al + mov [KEY_COUNT+eax], cl + jmp .ok +.overflow: + popf + mov dword [esp+36], 1 + ret +.sendbtn: + pushf + cli + cmp byte [BTN_COUNT], 0 + jnz .overflow + mov byte [BTN_COUNT], 1 + mov [BTN_BUFF], ecx +.ok: + popf + and dword [esp+36], 0 +.ret: + ret + get_event_for_app: pushad diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index e860416a8c..32126822cc 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -1454,7 +1454,8 @@ normalize_number: jne .continue dec eax cmp eax,1 - jne @r + ja @r + mov al,1 .continue: and eax,0x3f ret diff --git a/programs/system/panel/trunk/@PANEL.ASM b/programs/system/panel/trunk/@PANEL.ASM index cf7c56d2c4..9e97756982 100644 --- a/programs/system/panel/trunk/@PANEL.ASM +++ b/programs/system/panel/trunk/@PANEL.ASM @@ -91,35 +91,36 @@ begin_1: jmp begin_1.ret kill_active_application: - mcall 18, 7 - mov ecx,eax +; mcall 18, 7 +; mov ecx,eax +; +; ;//{SPraid.simba do not kill panel and icon +; push eax +; mov eax,9 +; mov ebx, process_info_buffer +; int 0x40 +; mov eax,process_info_buffer +; add eax,10 +; mov ebx,[eax] +; cmp ebx,'ICON' +; je no_kill +; cmp ebx,'@PAN' +; jne kill_app +; add eax,4 +; mov ebx,[eax] +; and ebx,0x0000FFFF +; cmp ebx,'EL' +; je no_kill +; kill_app: +; pop ecx +; mcall 18, 2 +; jmp if_kill +; no_kill: +; pop eax +; if_kill: +; ;// }SPraid.simba + mcall 72,1,3,1 - ;//{SPraid.simba do not kill panel and icon - push eax - mov eax,9 - mov ebx, process_info_buffer - int 0x40 - mov eax,process_info_buffer - add eax,10 - mov ebx,[eax] - cmp ebx,'ICON' - je no_kill - cmp ebx,'@PAN' - jne kill_app - add eax,4 - mov ebx,[eax] - and ebx,0x0000FFFF - cmp ebx,'EL' - je no_kill - kill_app: - pop ecx - mcall 18, 2 - jmp if_kill - no_kill: - pop eax - if_kill: - ;// }SPraid.simba - jmp begin_1.ret start_menu_application: