From c547e213e85b8fcd5ca50556118002d305618976 Mon Sep 17 00:00:00 2001 From: "Evgeny Grechnikov (Diamond)" Date: Tue, 12 Aug 2008 17:54:02 +0000 Subject: [PATCH] console: API for get/set cursor pos & clear screen git-svn-id: svn://kolibrios.org@853 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/libraries/console/console.asm | 130 +++++++++++++++++- .../develop/libraries/console/console.txt | 24 ++++ .../libraries/console/examples/test_gets2.asm | 8 +- 3 files changed, 157 insertions(+), 5 deletions(-) diff --git a/programs/develop/libraries/console/console.asm b/programs/develop/libraries/console/console.asm index 378c62fbff..b0e4f46022 100644 --- a/programs/develop/libraries/console/console.asm +++ b/programs/develop/libraries/console/console.asm @@ -809,9 +809,94 @@ con.write_special_char: .not_digit: mov [con_esc], 0 mov [con_sci], 0 ; in any case, leave Esc mode + cmp al, 'J' + jz .cls + cmp al, 'H' + jz .setcursor + cmp al, 'f' + jz .setcursor cmp al, 'm' jz .set_attr + cmp al, 'A' + jz .cursor_up + cmp al, 'B' + jz .cursor_down + cmp al, 'C' + jz .cursor_right + cmp al, 'D' + jz .cursor_left ret ; simply skip unknown sequences +.cls: + push ecx + and [con.cur_x], 0 + and [con.cur_y], 0 + mov edi, [con.data] + push edi + mov ecx, [con.scr_width] + imul ecx, [con.scr_height] + mov ax, 0720h + rep stosw + pop edi ecx +.nosetcursor: + ret +.setcursor: + cmp [con_esc_attr_n], 2 + jnz .nosetcursor + mov eax, [con_esc_attrs] + cmp eax, [con.scr_width] + jae @f + mov [con.cur_x], eax +@@: + mov eax, [con_esc_attrs+4] + cmp eax, [con.scr_height+4] + jae @f + mov [con.cur_y], eax +.j_get_data: + jmp con.get_data_ptr +.cursor_up: + cmp [con_esc_attr_n], 1 + jnz .nosetcursor + mov eax, [con.cur_y] + sub eax, [con_esc_attrs] + jnc @f + xor eax, eax +@@: + mov [con.cur_y], eax + jmp .j_get_data +.cursor_down: + cmp [con_esc_attr_n], 1 + jnz .nosetcursor + mov eax, [con.cur_y] + add eax, [con_esc_attrs] + cmp eax, [con.scr_height] + jb @f + mov eax, [con.scr_height] + dec eax +@@: + mov [con.cur_y], eax + jmp .j_get_data +.cursor_right: + cmp [con_esc_attr_n], 1 + jnz .nosetcursor + mov eax, [con.cur_x] + add eax, [con_esc_attrs] + cmp eax, [con.scr_width] + jb @f + mov eax, [con.scr_width] + dec eax +@@: + mov [con.cur_x], eax + jmp .j_get_data +.cursor_left: + cmp [con_esc_attr_n], 1 + jnz .nosetcursor + mov eax, [con.cur_x] + sub eax, [con_esc_attrs] + jnc @f + xor eax, eax +@@: + mov [con.cur_x], eax + jmp .j_get_data .set_attr: push eax ecx edx xor ecx, ecx @@ -1453,6 +1538,43 @@ con_gets2: popad ret 12 +; void __stdcall con_cls(); +con_cls: + push edi + call con.write_special_char.cls + pop edi + call con.update_screen + ret + +; void __stdcall con_get_cursor_pos(int* px, int* py); +con_get_cursor_pos: + push eax ecx + mov eax, [esp+12] + mov ecx, [con.cur_x] + mov [eax], ecx + mov eax, [esp+16] + mov ecx, [con.cur_y] + mov [eax], ecx + pop ecx eax + ret 8 + +; void __stdcall con_set_cursor_pos(int px, int py); +con_set_cursor_pos: + push eax + mov eax, [esp+8] + cmp eax, [con.scr_width] + jae @f + mov [con.cur_x], eax +@@: + mov eax, [esp+12] + cmp eax, [con.scr_height] + jae @f + mov [con.cur_y], eax +@@: + pop eax + call con.update_screen + ret 8 + con.update_screen: push eax mov eax, [con.cur_y] @@ -2127,7 +2249,7 @@ con.vscroll_pt dd -1 align 16 EXPORTS: dd szStart, START - dd szVersion, 0x00020004 + dd szVersion, 0x00020005 dd szcon_init, con_init dd szcon_write_asciiz, con_write_asciiz dd szcon_printf, con_printf @@ -2142,6 +2264,9 @@ EXPORTS: dd szcon_get_font_height, con_get_font_height dd szcon_get_cursor_height,con_get_cursor_height dd szcon_set_cursor_height,con_set_cursor_height + dd szcon_cls, con_cls + dd szcon_get_cursor_pos, con_get_cursor_pos + dd szcon_set_cursor_pos, con_set_cursor_pos dd 0 con_flags dd 7 @@ -2175,6 +2300,9 @@ szcon_gets2 db 'con_gets2',0 szcon_get_font_height db 'con_get_font_height',0 szcon_get_cursor_height db 'con_get_cursor_height',0 szcon_set_cursor_height db 'con_set_cursor_height',0 +szcon_cls db 'con_cls',0 +szcon_get_cursor_pos db 'con_get_cursor_pos',0 +szcon_set_cursor_pos db 'con_set_cursor_pos',0 con.thread_err db 'Cannot create console thread!',13,10,0 con.nomem_err db 'Not enough memory!',13,10,0 diff --git a/programs/develop/libraries/console/console.txt b/programs/develop/libraries/console/console.txt index f7d8d38cc1..334fb801a4 100644 --- a/programs/develop/libraries/console/console.txt +++ b/programs/develop/libraries/console/console.txt @@ -77,6 +77,14 @@ dword __stdcall con_set_flags(dword new_flags); 45 = фиолетовый фон 46 = бирюзовый фон 47 = белый фон + Следующие последовательности появились в версии 5 библиотеки: + Esc[2J - очистить экран, переместить курсор в левый верхний угол + Esc[;H = Esc[;f - + установить курсор в позицию с координатами , + Esc[A - переместить курсор на строк вверх + Esc[B - переместить курсор на строк вниз + Esc[C - переместить курсор на позиций вправо + Esc[D - переместить курсор на позиций влево */ Значение по умолчанию для флагов = 7. @@ -115,6 +123,7 @@ str. typedef int (__stdcall * con_gets2_callback)(int keycode, char** pstr, int* pn, int* ppos); void __stdcall con_gets2(con_gets2_callback callback, char* str, int n); +Функция появилась в версии 4 библиотеки. Полностью аналогична con_gets за исключением того, что когда пользователь нажимает нераспознанную клавишу, вызывается указанная callback-процедура (которая может, например, обрабатывать up/down для истории ввода и tab для @@ -125,3 +134,18 @@ void __stdcall con_gets2(con_gets2_callback callback, char* str, int n); Возвращаемое значение: 0=строка не менялась; 1=строка изменилась, необходимо удалить старую и вывести новую; 2=строка изменилась, необходимо её вывести; 3=немедленно выйти из функции. + +void __stdcall con_cls(); +Функция появилась в версии 5 библиотеки. +Очищает экран и переводит курсор в левый верхний угол. + +void __stdcall con_get_cursor_pos(int* px, int* py); +Функция появилась в версии 5 библиотеки. +Записывает в *px текущую координату курсора по оси x, в *py - по оси y. + +void __stdcall con_set_cursor_pos(int x, int y); +Функция появилась в версии 5 библиотеки. +Устанавливает курсор в позицию с указанными координатами. Если какой-то из +параметров выходит за пределы соответствующего диапазона (от 0 до scr_width-1 +для x, от 0 до scr_height-1 для y, scr_width и scr_height были заданы при +вызове con_init), то соответствующая координата курсора не меняется. diff --git a/programs/develop/libraries/console/examples/test_gets2.asm b/programs/develop/libraries/console/examples/test_gets2.asm index 161cf296ad..22ee326bd6 100644 --- a/programs/develop/libraries/console/examples/test_gets2.asm +++ b/programs/develop/libraries/console/examples/test_gets2.asm @@ -31,10 +31,10 @@ start: ; yes! Now do some work (gets2() demo in this case). push caption - push -1 - push -1 - push -1 - push -1 + push 25 + push 80 + push 25 + push 80 call [con_init] ; C-equivalent of the following code: