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:
Evgeny Grechnikov (Diamond) 2009-08-19 17:14:04 +00:00
parent 69eaca2fef
commit 1371a59b64
2 changed files with 43 additions and 6 deletions

View File

@ -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

View File

@ -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 библиотеки.