From 7e19914ef467fa6b761c051a18e320f57a2dbd87 Mon Sep 17 00:00:00 2001 From: "Evgeny Grechnikov (Diamond)" Date: Tue, 29 Aug 2006 12:52:52 +0000 Subject: [PATCH] Kernel: fixed work with zero-size windows launcher, @rb: modified to use function 70 git-svn-id: svn://kolibrios.org@142 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/core/sys32.inc | 9 ++- kernel/trunk/docs/sysfuncr.txt | 37 ++++++++--- kernel/trunk/docs/sysfuncs.txt | 17 ++++- kernel/trunk/gui/window.inc | 12 ++++ programs/system/launcher/trunk/launcher.asm | 24 +++---- programs/system/rb/trunk/@RB.ASM | 71 ++++++++++----------- 6 files changed, 100 insertions(+), 70 deletions(-) diff --git a/kernel/trunk/core/sys32.inc b/kernel/trunk/core/sys32.inc index abc29fde74..d0cb673fa5 100644 --- a/kernel/trunk/core/sys32.inc +++ b/kernel/trunk/core/sys32.inc @@ -816,12 +816,11 @@ terminate: ; terminate application add eax,[esi+WDATA.box.height] mov [dlye],eax - mov [esi+WDATA.box.left], 0 - mov [esi+WDATA.box.width], 5 - mov eax,[0xFE04] - mov [esi+WDATA.box.top],eax - mov [esi+WDATA.box.height], 5 xor eax, eax + mov [esi+WDATA.box.left],eax + mov [esi+WDATA.box.width],eax + mov [esi+WDATA.box.top],eax + mov [esi+WDATA.box.height],eax mov [esi+WDATA.cl_workarea],eax mov [esi+WDATA.cl_titlebar],eax mov [esi+WDATA.cl_frames],eax diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index 65842c7ebc..ae1e23bef7 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -191,16 +191,17 @@ * ebx = [координата по оси x]*65536 + [координата по оси y] * ecx = 0xX0RRGGBB, где * RR, GG, BB задают цвет текста - * X задает используемый шрифт: 0=системный моноширинный, + * X=ABnn (биты): + * nn задает используемый шрифт: 0=системный моноширинный, 1=системный шрифт переменной ширины + * A=0 - выводить esi символов, A=1 - выводить ASCIIZ-строку + * B=1 - закрашивать фон цветом edi * edx = указатель на начало строки - * esi = длина строки, должна быть не больше 255 + * esi = для A=0 длина строки, должна быть не больше 255; + для A=1 игнорируется Возвращаемое значение: * функция не возвращает значения Замечания: - * Выводятся либо первые (esi and 0xFF) символов, - либо все символы до (но не включая) завершающего нуля - (для ASCIIZ-строк) в зависимости от того, что произойдёт раньше. * Первый системный шрифт считывается при загрузке из файла char.mt, второй - из char2.mt. * Оба шрифта имеют высоту 9 пикселей, ширина моноширинного шрифта @@ -325,7 +326,7 @@ * +8: word: зарезервировано * +10 = +0xA: 11 байт: имя процесса (имя соответствующего исполняемого файла в формате 8+3) - * +21 = +0x15: byte: выравнивание, этот байт не изменяется + * +21 = +0x15: byte: зарезервировано, этот байт не изменяется * +22 = +0x16: dword: адрес процесса в памяти * +26 = +0x1A: dword: размер используемой памяти - 1 * +30 = +0x1E: dword: идентификатор (PID/TID) @@ -344,6 +345,17 @@ * 5 = поток ожидает события * 9 = запрошенный слот свободен, вся остальная информация о слоте не имеет смысла + * +52 = +0x34: word: зарезервировано, это слово не изменяется + * +54 = +0x36: dword: координата начала клиентской области + по оси x + * +58 = +0x3A: dword: координата начала клиентской области + по оси y + * +62 = +0x3E: dword: ширина клиентской области + * +66 = +0x42: dword: высота клиентской области + * +70 = +0x46: byte: состояние окна - битовое поле + * бит 0 (маска 1): окно максимизировано + * бит 1 (маска 2): окно минимизировано в панель задач + * бит 2 (маска 4): окно свёрнуто в заголовок Замечания: * Слоты нумеруются с 1. * Возвращаемое значение не есть общее число потоков, поскольку @@ -366,7 +378,8 @@ * адрес процесса в памяти равен 0, размер используемой памяти 16 Mb (0x1000000) * PID=1 - * координаты и размеры окна условно полагаются равными 0 + * координаты и размеры окна, равно как и клиентской области, + условно полагаются равными 0 * состояние слота - всегда 0 (выполняется) * время выполнения складывается из времени, уходящего на собственно работу, и времени простоя в ожидании прерывания @@ -385,8 +398,9 @@ Назначаемые новым потокам идентификаторы монотонно растут. * Если поток еще не определил свое окно вызовом функции 0, то положение и размеры этого окна полагаются нулями. + * Координаты клиентской области окна берутся относительно окна. * В данный момент используется только часть буфера размером - 52 = 0x34 байта. Тем не менее рекомендуется использовать буфер + 71 = 0x47 байта. Тем не менее рекомендуется использовать буфер размером 1 Кб для будущей совместимости, в будущем могут быть добавлены некоторые поля. @@ -2083,7 +2097,12 @@ db 'Kolibri',0 * биты 22-31 зарезервированы и должны быть установлены в 0 * ecx = число (при bl=0) или указатель (при bl=1) * edx = [координата по оси x]*65536 + [координата по оси y] - * esi = 0xN0RRGGBB, RRGGBB=цвет, N=шрифт (0/1) + * esi = 0xX0RRGGBB: + * RR, GG, BB задают цвет + * X = ABnn (биты) + * nn = шрифт (0/1) + * A игнорируется + * B=1 - закрашивать фон цветом edi Возвращаемое значение: * функция не возвращает значения Замечания: diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index c15de5c096..53683b6136 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -321,7 +321,7 @@ Returned value: * +8: word: reserved * +10 = +0xA: 11 bytes: name of the process (name of corresponding executable file in the format 8+3) - * +21 = +0x15: byte: alignment, this byte preserves + * +21 = +0x15: byte: reserved, this byte is not changed * +22 = +0x16: dword: address of the process in memory * +26 = +0x1A: dword: size of used memory - 1 * +30 = +0x1E: dword: identifier (PID/TID) @@ -340,6 +340,15 @@ Returned value: * 5 = thread waits for event * 9 = requested slot is free, all other information on the slot is not meaningful + * +52 = +0x34: word: reserved, this word is not changed + * +54 = +0x36: dword: coordinate of the client area on axis x + * +58 = +0x3A: dword: coordinate of the client area on axis y + * +62 = +0x3E: dword: width of the client area + * +66 = +0x42: dword: height of the client area + * +70 = +0x46: byte: state of the window - bitfield + * bit 0 (mask 1): window is maximized + * bit 1 (mask 2): window is minimized to panel + * bit 2 (mask 4): window is rolled up Remarks: * Slots are numbered starting from 1. * Returned value is not a total number of threads, because there @@ -362,7 +371,8 @@ Remarks: * address of the process in memory is 0, size of used memory is 16 Mb (0x1000000) * PID=1 - * coordinates and sizes of the window are by convention set to 0 + * coordinates and sizes of the window and the client area are by + convention set to 0 * status of the slot is always 0 (running) * the execution time adds of time leaving on operations itself and idle time in waiting for interrupt (which can be got by call @@ -381,8 +391,9 @@ Remarks: * If the thread has not yet defined the window by call to function 0, the position and the sizes of its window are considered to be zero. + * Coordinates of the client area are relative to the window. * At the moment only the part of the buffer by a size - 52 = 0x34 bytes is used. Nevertheless it is recommended to use + 71 = 0x37 bytes is used. Nevertheless it is recommended to use 1-Kb buffer for the future compatibility, in the future some fields can be added. diff --git a/kernel/trunk/gui/window.inc b/kernel/trunk/gui/window.inc index 5975808674..7437d92b45 100644 --- a/kernel/trunk/gui/window.inc +++ b/kernel/trunk/gui/window.inc @@ -145,6 +145,17 @@ setscreen: ; edx y end ; esi process number pushad +; \begin{diamond}[29.08.2006] + cmp esi, 1 + jz @f + mov edi, esi + shl edi, 5 + cmp [edi+window_data+WDATA.box.width], 0 + jnz @f + cmp [edi+window_data+WDATA.box.height], 0 + jz .ret +@@: +; \end{diamond}[29.08.2006] mov edi, esi ;;;word [esi*2+0xc400] shl edi, 8 add edi, 0x80000 ; address of random shaped window area @@ -183,6 +194,7 @@ pushad sub edi, ecx dec edx jnz .new_y +.ret: popad ret .read_byte: diff --git a/programs/system/launcher/trunk/launcher.asm b/programs/system/launcher/trunk/launcher.asm index 3799173f3c..bf99ca840c 100644 --- a/programs/system/launcher/trunk/launcher.asm +++ b/programs/system/launcher/trunk/launcher.asm @@ -28,7 +28,7 @@ START: ; start of execution mcall 18,15 - mov eax, 58 ; load AUTORUN.DAT + mov eax, 70 ; load AUTORUN.DAT mov ebx, autorun_dat_info int 0x40 @@ -59,7 +59,7 @@ START: ; start of execution run_program: ; time to delay in eax push eax - mcall 58, start_info + mcall 70, start_info pop ebx mov eax, 5 @@ -77,7 +77,6 @@ START: ; start of execution mov ecx, 60 mov edi, parameters - xor al, al rep stosb popad @@ -112,13 +111,11 @@ START: ; start of execution xor ebx, ebx .start: lodsb - cmp al, '0' - jb .finish - cmp al, '9' - ja .finish sub al, '0' - imul ebx, 10 - add ebx, eax + cmp al, 9 + ja .finish + lea ebx,[ebx*4+ebx] + lea ebx,[ebx*2+eax] inc [position] jmp .start .finish: @@ -180,17 +177,17 @@ START: ; start of execution autorun_dat_info: ; AUTORUN.DAT .mode dd 0 ; read file .start_block dd 0 ; block to read - .blocks dd 0x10 ; 16*512 bytes max + dd 0 + .blocks dd 16*512 ; 16*512 bytes max .address dd file_data - .workarea dd work_area db "/RD/1/AUTORUN.DAT",0 start_info: - .mode dd 16 + .mode dd 7 dd 0 .params dd parameters dd 0 - .workarea dd work_area + dd 0 .path: ;       I_END: @@ -200,5 +197,4 @@ I_END: number_of_files dd ? - work_area rb 0x4000 file_data rb 16*512 diff --git a/programs/system/rb/trunk/@RB.ASM b/programs/system/rb/trunk/@RB.ASM index 8d8163ca8b..373d099609 100644 --- a/programs/system/rb/trunk/@RB.ASM +++ b/programs/system/rb/trunk/@RB.ASM @@ -13,10 +13,6 @@ include 'macros.inc' meos_app_start code - mov [start_info.mode], 16 - mov [start_info.params], 0 - mov [start_info.workarea], work_area - mov eax,40 ; установим маску событий mov ebx,100000b ; нас интересует только мышь int 0x40 @@ -26,9 +22,6 @@ still: ; mov eax,10 ; ждём события int 0x40 - cmp eax,6 ; мышь? - jne still - mov eax,37 ; какие нажаты кпопки? mov ebx,2 int 0x40 @@ -141,12 +134,13 @@ exit: ; ; здесь стартует процесс меню start_wnd: mov [menu_opened],1 - call draw_window - mov eax,40 ; установим маску желаемых событий для этого процесса mov ebx,100101b ; меню + кнопки + перерисовка int 0x40 +red: + call draw_window + still2: ; главный цикл процесса меню mov eax,10 ; ждём события @@ -172,32 +166,24 @@ mouse: ; jmp exit_menu ; а если всё-таки нажаты - закроем окно -; ПЕРЕРИСОВАТЬ ОКНО -red: - call draw_window - jmp still2 - - ; НАЖАТА КНОПКА button: mov eax,17 ; получить идентификатор нажатой кнопки int 0x40 - cmp ah,10 ; сравниваем с 10 + sub ah,10 ; сравниваем с 10 jl nofuncbtns ; если меньше - закрываем меню - add ah,-10 ; вычтем из идентификатора кнопки 10 movzx ebx,ah ; получили номер программы в списке в ebx - lea esi, [startapps + ebx*4] - lea edi, [start_info.path] - mov esi, [esi] + mov esi, [startapps + ebx*4] + mov edi, start_info.path cld @@: lodsb stosb test al, al jnz @b - mcall 58, start_info + mcall 70, start_info ; mov eax,5 ; подождём, пока программа запуститься ; mov ebx,1 ; а то её окно не будет отрисовано (баг в ядре???) @@ -279,12 +265,23 @@ draw_window: mov eax, 4 ; заголовок mov ebx, header_pos ; [x] shl 16 + [y] mov ecx, [sc.grab_text]; шрифт и цвет (серый) - add ecx, -0x333333 or ecx, 0x10000000 +; add ecx, -0x333333 + push ecx + push ecx + xor edx,edx +.dec_color: + sub byte [esp+edx], 0x33 + jae @f + mov byte [esp+edx], 0 +@@: + inc edx + jnp .dec_color + pop ecx mov edx, header ; адрес заголовка mov esi, header.size ; длина заголовка ("M E N U") int 0x40 - add ecx, 0x333333 ; цвет белый + pop ecx add ebx, 1 shl 16 ; сдвинем вправо на 1 int 0x40 @@ -348,7 +345,7 @@ DATA <"/RD/1/JPEGVIEW",0> ,\ <"/RD/1/CPU",0> ,\ <"/RD/1/SPANEL",0> ,\ - <"/RD/1/ICONMNGR",0> ,\ + <"/RD/1/ICON2",0> ,\ <"/RD/1/VRR",0> ; header: ; заголовок @@ -363,7 +360,7 @@ DATA ; db 'Panel setup ' ; db 'Icon manager' - sz header, "MenuetOS" + sz header, "KolibriOS" lsz text,\ en, 'Background ',\ @@ -384,7 +381,14 @@ DATA ru, 'Управление иконками ',\ ru, 'Настройка монитора ' - +start_info: + .mode dd 7 + dd 0 + .params dd 0 + dd 0 + dd 0 + db 0 + dd start_info.path ; НЕИНИЦИАЛИЗИРОВАННЫЕ ДАННЫЕ UDATA @@ -396,23 +400,12 @@ UDATA menu_opened db ? ; открыто меню или нет? (1-да, 0-нет) - align 32 - start_info: - .mode dd ? - dd ? - .params dd ? - dd ? - .workarea dd ? - .path: - rb 256 - +align 4 +start_info.path rb 256 sc system_colors ; системные цвета procinfo process_information ; информация о процессе - work_area: - rb 0x1000 - rb 1024 ; стэк для окна меню - хватит и 1 Кб align 32 stack_wnd: