forked from KolibriOS/kolibrios
console: API for get/set cursor pos & clear screen
git-svn-id: svn://kolibrios.org@853 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
abf7f61fb0
commit
c547e213e8
@ -809,9 +809,94 @@ con.write_special_char:
|
|||||||
.not_digit:
|
.not_digit:
|
||||||
mov [con_esc], 0
|
mov [con_esc], 0
|
||||||
mov [con_sci], 0 ; in any case, leave Esc mode
|
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'
|
cmp al, 'm'
|
||||||
jz .set_attr
|
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
|
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:
|
.set_attr:
|
||||||
push eax ecx edx
|
push eax ecx edx
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
@ -1453,6 +1538,43 @@ con_gets2:
|
|||||||
popad
|
popad
|
||||||
ret 12
|
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:
|
con.update_screen:
|
||||||
push eax
|
push eax
|
||||||
mov eax, [con.cur_y]
|
mov eax, [con.cur_y]
|
||||||
@ -2127,7 +2249,7 @@ con.vscroll_pt dd -1
|
|||||||
align 16
|
align 16
|
||||||
EXPORTS:
|
EXPORTS:
|
||||||
dd szStart, START
|
dd szStart, START
|
||||||
dd szVersion, 0x00020004
|
dd szVersion, 0x00020005
|
||||||
dd szcon_init, con_init
|
dd szcon_init, con_init
|
||||||
dd szcon_write_asciiz, con_write_asciiz
|
dd szcon_write_asciiz, con_write_asciiz
|
||||||
dd szcon_printf, con_printf
|
dd szcon_printf, con_printf
|
||||||
@ -2142,6 +2264,9 @@ EXPORTS:
|
|||||||
dd szcon_get_font_height, con_get_font_height
|
dd szcon_get_font_height, con_get_font_height
|
||||||
dd szcon_get_cursor_height,con_get_cursor_height
|
dd szcon_get_cursor_height,con_get_cursor_height
|
||||||
dd szcon_set_cursor_height,con_set_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
|
dd 0
|
||||||
|
|
||||||
con_flags dd 7
|
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_font_height db 'con_get_font_height',0
|
||||||
szcon_get_cursor_height db 'con_get_cursor_height',0
|
szcon_get_cursor_height db 'con_get_cursor_height',0
|
||||||
szcon_set_cursor_height db 'con_set_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.thread_err db 'Cannot create console thread!',13,10,0
|
||||||
con.nomem_err db 'Not enough memory!',13,10,0
|
con.nomem_err db 'Not enough memory!',13,10,0
|
||||||
|
@ -77,6 +77,14 @@ dword __stdcall con_set_flags(dword new_flags);
|
|||||||
45 = фиолетовый фон
|
45 = фиолетовый фон
|
||||||
46 = бирюзовый фон
|
46 = бирюзовый фон
|
||||||
47 = белый фон
|
47 = белый фон
|
||||||
|
Следующие последовательности появились в версии 5 библиотеки:
|
||||||
|
Esc[2J - очистить экран, переместить курсор в левый верхний угол
|
||||||
|
Esc[<number1>;<number2>H = Esc[<number1>;<number2>f -
|
||||||
|
установить курсор в позицию с координатами <number1>,<number2>
|
||||||
|
Esc[<number>A - переместить курсор на <number> строк вверх
|
||||||
|
Esc[<number>B - переместить курсор на <number> строк вниз
|
||||||
|
Esc[<number>C - переместить курсор на <number> позиций вправо
|
||||||
|
Esc[<number>D - переместить курсор на <number> позиций влево
|
||||||
*/
|
*/
|
||||||
Значение по умолчанию для флагов = 7.
|
Значение по умолчанию для флагов = 7.
|
||||||
|
|
||||||
@ -115,6 +123,7 @@ str.
|
|||||||
|
|
||||||
typedef int (__stdcall * con_gets2_callback)(int keycode, char** pstr, int* pn, int* ppos);
|
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);
|
void __stdcall con_gets2(con_gets2_callback callback, char* str, int n);
|
||||||
|
Функция появилась в версии 4 библиотеки.
|
||||||
Полностью аналогична con_gets за исключением того, что когда пользователь
|
Полностью аналогична con_gets за исключением того, что когда пользователь
|
||||||
нажимает нераспознанную клавишу, вызывается указанная callback-процедура
|
нажимает нераспознанную клавишу, вызывается указанная callback-процедура
|
||||||
(которая может, например, обрабатывать up/down для истории ввода и tab для
|
(которая может, например, обрабатывать up/down для истории ввода и tab для
|
||||||
@ -125,3 +134,18 @@ void __stdcall con_gets2(con_gets2_callback callback, char* str, int n);
|
|||||||
Возвращаемое значение: 0=строка не менялась; 1=строка изменилась, необходимо
|
Возвращаемое значение: 0=строка не менялась; 1=строка изменилась, необходимо
|
||||||
удалить старую и вывести новую; 2=строка изменилась, необходимо её вывести;
|
удалить старую и вывести новую; 2=строка изменилась, необходимо её вывести;
|
||||||
3=немедленно выйти из функции.
|
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), то соответствующая координата курсора не меняется.
|
||||||
|
@ -31,10 +31,10 @@ start:
|
|||||||
; yes! Now do some work (gets2() demo in this case).
|
; yes! Now do some work (gets2() demo in this case).
|
||||||
|
|
||||||
push caption
|
push caption
|
||||||
push -1
|
push 25
|
||||||
push -1
|
push 80
|
||||||
push -1
|
push 25
|
||||||
push -1
|
push 80
|
||||||
call [con_init]
|
call [con_init]
|
||||||
|
|
||||||
; C-equivalent of the following code:
|
; C-equivalent of the following code:
|
||||||
|
Loading…
Reference in New Issue
Block a user