console version 6: allow caller to know whether console window was closed
git-svn-id: svn://kolibrios.org@1133 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
69eaca2fef
commit
1371a59b64
@ -81,6 +81,7 @@ con_init:
|
|||||||
xor eax, eax
|
xor eax, eax
|
||||||
rep stosb
|
rep stosb
|
||||||
pop edi
|
pop edi
|
||||||
|
and byte [con_flags+1], not 2
|
||||||
; create console thread
|
; create console thread
|
||||||
push 51
|
push 51
|
||||||
pop eax
|
pop eax
|
||||||
@ -119,6 +120,7 @@ con_get_flags:
|
|||||||
; dword __stdcall con_set_flags(dword flags);
|
; dword __stdcall con_set_flags(dword flags);
|
||||||
con_set_flags:
|
con_set_flags:
|
||||||
mov eax, [esp+4]
|
mov eax, [esp+4]
|
||||||
|
and ah, not 2
|
||||||
xchg eax, [con_flags]
|
xchg eax, [con_flags]
|
||||||
ret 4
|
ret 4
|
||||||
|
|
||||||
@ -1178,8 +1180,11 @@ con_set_title:
|
|||||||
|
|
||||||
; int __stdcall con_kbhit(void);
|
; int __stdcall con_kbhit(void);
|
||||||
con_kbhit:
|
con_kbhit:
|
||||||
|
test byte [con_flags+1], 2
|
||||||
|
jnz @f
|
||||||
mov eax, [con.input_start]
|
mov eax, [con.input_start]
|
||||||
cmp eax, [con.input_end]
|
cmp eax, [con.input_end]
|
||||||
|
@@:
|
||||||
setnz al
|
setnz al
|
||||||
movzx eax, al
|
movzx eax, al
|
||||||
ret
|
ret
|
||||||
@ -1189,6 +1194,8 @@ con.force_entered_char:
|
|||||||
jnz .ret
|
jnz .ret
|
||||||
mov [con.thread_op], 4
|
mov [con.thread_op], 4
|
||||||
call con.wake
|
call con.wake
|
||||||
|
test byte [con_flags+1], 2
|
||||||
|
jnz .ret
|
||||||
; wait for response
|
; wait for response
|
||||||
push ebx
|
push ebx
|
||||||
push 5
|
push 5
|
||||||
@ -1206,6 +1213,8 @@ con.force_entered_char:
|
|||||||
; int __stdcall con_getch(void);
|
; int __stdcall con_getch(void);
|
||||||
con_getch:
|
con_getch:
|
||||||
call con.force_entered_char
|
call con.force_entered_char
|
||||||
|
test byte [con_flags+1], 2
|
||||||
|
jnz con_getch_closed
|
||||||
movzx eax, byte [con.entered_char]
|
movzx eax, byte [con.entered_char]
|
||||||
sar [con.entered_char], 8
|
sar [con.entered_char], 8
|
||||||
mov byte [con.entered_char+1], 0xFF
|
mov byte [con.entered_char+1], 0xFF
|
||||||
@ -1215,22 +1224,29 @@ con_getch:
|
|||||||
@@:
|
@@:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
con_getch_closed:
|
||||||
|
or eax, -1
|
||||||
|
ret
|
||||||
|
|
||||||
; int __stdcall con_getch2(void);
|
; int __stdcall con_getch2(void);
|
||||||
con_getch2:
|
con_getch2:
|
||||||
call con.force_entered_char
|
call con.force_entered_char
|
||||||
|
test byte [con_flags+1], 2
|
||||||
|
jnz con_getch_closed
|
||||||
mov eax, 0xFFFF
|
mov eax, 0xFFFF
|
||||||
xchg ax, [con.entered_char]
|
xchg ax, [con.entered_char]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; void __stdcall con_gets(char* str, int n);
|
; char* __stdcall con_gets(char* str, int n);
|
||||||
con_gets:
|
con_gets:
|
||||||
pop eax
|
pop eax
|
||||||
push 0
|
push 0
|
||||||
push eax
|
push eax
|
||||||
; void __stdcall con_gets2(con_gets2_callback callback, char* str, int n);
|
; char* __stdcall con_gets2(con_gets2_callback callback, char* str, int n);
|
||||||
con_gets2:
|
con_gets2:
|
||||||
|
mov eax, [esp+8] ; str
|
||||||
pushad
|
pushad
|
||||||
mov esi, [esp+20h+8] ; str
|
mov esi, eax ; str
|
||||||
mov ebx, [esp+20h+12] ; n
|
mov ebx, [esp+20h+12] ; n
|
||||||
sub ebx, 1
|
sub ebx, 1
|
||||||
jle .ret
|
jle .ret
|
||||||
@ -1239,6 +1255,8 @@ con_gets2:
|
|||||||
call con.get_data_ptr
|
call con.get_data_ptr
|
||||||
.loop:
|
.loop:
|
||||||
call con_getch2
|
call con_getch2
|
||||||
|
cmp eax, -1
|
||||||
|
jz .closed
|
||||||
test al, al
|
test al, al
|
||||||
jz .extended
|
jz .extended
|
||||||
cmp al, 8
|
cmp al, 8
|
||||||
@ -1534,6 +1552,8 @@ con_gets2:
|
|||||||
@@:
|
@@:
|
||||||
dec esi
|
dec esi
|
||||||
jmp .update_screen_and_loop
|
jmp .update_screen_and_loop
|
||||||
|
.closed:
|
||||||
|
and dword [esp+1Ch], 0
|
||||||
.ret:
|
.ret:
|
||||||
popad
|
popad
|
||||||
ret 12
|
ret 12
|
||||||
@ -1605,6 +1625,7 @@ con.wake:
|
|||||||
push 2
|
push 2
|
||||||
pop ebx
|
pop ebx
|
||||||
mov ecx, [con.console_tid]
|
mov ecx, [con.console_tid]
|
||||||
|
jecxz .ret
|
||||||
mov edx, con.thread_op
|
mov edx, con.thread_op
|
||||||
push 1
|
push 1
|
||||||
pop esi
|
pop esi
|
||||||
@ -1666,6 +1687,8 @@ con.msg_loop:
|
|||||||
con.button:
|
con.button:
|
||||||
; we have only one button, close
|
; we have only one button, close
|
||||||
con.thread_exit:
|
con.thread_exit:
|
||||||
|
or byte [con_flags+1], 2
|
||||||
|
and [con.console_tid], 0
|
||||||
or eax, -1
|
or eax, -1
|
||||||
int 0x40
|
int 0x40
|
||||||
con.key:
|
con.key:
|
||||||
@ -2249,7 +2272,7 @@ con.vscroll_pt dd -1
|
|||||||
align 16
|
align 16
|
||||||
EXPORTS:
|
EXPORTS:
|
||||||
dd szStart, START
|
dd szStart, START
|
||||||
dd szVersion, 0x00020005
|
dd szVersion, 0x00020006
|
||||||
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
|
||||||
|
@ -86,6 +86,9 @@ dword __stdcall con_set_flags(dword new_flags);
|
|||||||
Esc[<number>C - переместить курсор на <number> позиций вправо
|
Esc[<number>C - переместить курсор на <number> позиций вправо
|
||||||
Esc[<number>D - переместить курсор на <number> позиций влево
|
Esc[<number>D - переместить курсор на <number> позиций влево
|
||||||
*/
|
*/
|
||||||
|
/* сигнал о закрытии окна консоли;
|
||||||
|
флаг игнорируется функцией con_set_flags */
|
||||||
|
#define CON_WINDOW_CLOSED 0x200
|
||||||
Значение по умолчанию для флагов = 7.
|
Значение по умолчанию для флагов = 7.
|
||||||
|
|
||||||
int __stdcall con_get_font_height(void);
|
int __stdcall con_get_font_height(void);
|
||||||
@ -105,24 +108,32 @@ int __stdcall con_getch(void);
|
|||||||
Для обычных символов возвращается ASCII-код. Для расширенных символов
|
Для обычных символов возвращается ASCII-код. Для расширенных символов
|
||||||
(например, Fx и стрелочек) первый вызов функции возвращает 0,
|
(например, Fx и стрелочек) первый вызов функции возвращает 0,
|
||||||
а повторный вызов возвращает расширенный код (подобно DOS-функциям ввода).
|
а повторный вызов возвращает расширенный код (подобно DOS-функциям ввода).
|
||||||
|
Начиная с версии 6 библиотеки, после закрытия окна консоли возвращается
|
||||||
|
значение -1.
|
||||||
|
|
||||||
word __stdcall con_getch2(void);
|
word __stdcall con_getch2(void);
|
||||||
Считывает один символ с клавиатуры. Младший байт содержит ASCII-код клавиши
|
Считывает один символ с клавиатуры. Младший байт содержит ASCII-код клавиши
|
||||||
(0 для расширенных символов), старший - расширенный код
|
(0 для расширенных символов), старший - расширенный код
|
||||||
(подобно BIOS-функциям ввода).
|
(подобно BIOS-функциям ввода).
|
||||||
|
Начиная с версии 6 библиотеки, после закрытия окна консоли возвращается
|
||||||
|
значение -1 (0xFFFF при интерпретации как word).
|
||||||
|
|
||||||
int __stdcall con_kbhit(void);
|
int __stdcall con_kbhit(void);
|
||||||
Возвращает 1, если какая-то клавиша была нажата, 0 иначе. Для считывания
|
Возвращает 1, если какая-то клавиша была нажата, 0 иначе. Для считывания
|
||||||
нажатой клавиши предназначены функции con_getch и con_getch2.
|
нажатой клавиши предназначены функции con_getch и con_getch2.
|
||||||
|
Начиная с версии 6 библиотеки, после закрытия окна консоли всегда возвращает 1.
|
||||||
|
|
||||||
void __stdcall con_gets(char* str, int n);
|
char* __stdcall con_gets(char* str, int n);
|
||||||
Считывает строку с клавиатуры. Ввод прерывается при поступлении символа
|
Считывает строку с клавиатуры. Ввод прерывается при поступлении символа
|
||||||
новой строки, а также по прочтении n-1 символа (в зависимости от того, что
|
новой строки, а также по прочтении n-1 символа (в зависимости от того, что
|
||||||
произойдёт раньше). В первом случае символ новой строки также записывается в
|
произойдёт раньше). В первом случае символ новой строки также записывается в
|
||||||
str. Считанная строка дополняется нулевым символом.
|
str. Считанная строка дополняется нулевым символом.
|
||||||
|
Начиная с версии 6 библиотеки, функция возвращает указатель на введённую
|
||||||
|
строку при успешном чтении и NULL, если окно консоли было закрыто. До версии
|
||||||
|
6 возвращаемое значение было неопределено.
|
||||||
|
|
||||||
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);
|
char* __stdcall con_gets2(con_gets2_callback callback, char* str, int n);
|
||||||
Функция появилась в версии 4 библиотеки.
|
Функция появилась в версии 4 библиотеки.
|
||||||
Полностью аналогична con_gets за исключением того, что когда пользователь
|
Полностью аналогична con_gets за исключением того, что когда пользователь
|
||||||
нажимает нераспознанную клавишу, вызывается указанная callback-процедура
|
нажимает нераспознанную клавишу, вызывается указанная callback-процедура
|
||||||
@ -134,6 +145,9 @@ void __stdcall con_gets2(con_gets2_callback callback, char* str, int n);
|
|||||||
Возвращаемое значение: 0=строка не менялась; 1=строка изменилась, необходимо
|
Возвращаемое значение: 0=строка не менялась; 1=строка изменилась, необходимо
|
||||||
удалить старую и вывести новую; 2=строка изменилась, необходимо её вывести;
|
удалить старую и вывести новую; 2=строка изменилась, необходимо её вывести;
|
||||||
3=немедленно выйти из функции.
|
3=немедленно выйти из функции.
|
||||||
|
Начиная с версии 6 библиотеки, функция возвращает указатель на введённую
|
||||||
|
строку при успешном чтении и NULL, если окно консоли было закрыто. До версии
|
||||||
|
6 возвращаемое значение было неопределено.
|
||||||
|
|
||||||
void __stdcall con_cls();
|
void __stdcall con_cls();
|
||||||
Функция появилась в версии 5 библиотеки.
|
Функция появилась в версии 5 библиотеки.
|
||||||
|
Loading…
Reference in New Issue
Block a user