1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00

Preserved Linux console mode. When console was in one char mode, restore it.

When console was in UTF-8 mode, restore it, too.
This commit is contained in:
Witold Filipczyk 2006-08-27 14:18:02 +02:00 committed by Witold Filipczyk
parent 8850d85998
commit c1c494bd4b
4 changed files with 38 additions and 3 deletions

View File

@ -206,7 +206,7 @@ resize_terminal(void)
itrm_queue_event(ditrm, (char *) &ev, sizeof(ev));
}
static void
void
get_terminal_name(unsigned char name[MAX_TERM_LEN])
{
unsigned char *term = getenv("TERM");

View File

@ -125,6 +125,7 @@ void resize_terminal(void);
void dispatch_special(unsigned char *);
void kbd_ctrl_c(void);
int is_blocked(void);
void get_terminal_name(unsigned char *);
#define kbd_get_key(kbd_) ((kbd_)->key)
#define kbd_key_is(kbd_, key) (kbd_get_key(kbd_) == (key))

View File

@ -38,9 +38,24 @@
INIT_LIST_HEAD(terminals);
static void check_if_no_terminal(void);
static int
was_utf8(int in, int out)
{
/* taken from setedit */
static unsigned char *str = "\033[1;1H\357\200\240\033[6n";
unsigned char buf[20];
int x, y;
hard_write(out, str, strlen(str));
buf[0] = '\0';
read(in, buf, 6);
if (sscanf(buf,"\033[%d;%dR",&y,&x)==2) {
if (x > 2) return 0;
}
return 1;
}
void
redraw_terminal(struct terminal *term)
@ -72,6 +87,7 @@ cls_redraw_all_terminals(void)
struct terminal *
init_term(int fdin, int fdout)
{
unsigned char name[MAX_TERM_LEN + 9] = "terminal.";
struct terminal *term = mem_calloc(1, sizeof(*term));
if (!term) {
@ -91,9 +107,16 @@ init_term(int fdin, int fdout)
term->fdout = fdout;
term->master = (term->fdout == get_output_handle());
term->blocked = -1;
term->spec = get_opt_rec(config_options, "terminal._template_");
get_terminal_name(name + 9);
term->spec = get_opt_rec(config_options, name);
object_lock(term->spec);
/* The hack to restore console in the right mode */
if (get_opt_int_tree(term->spec, "type") == TERM_LINUX) {
term->linux_was_utf8 = was_utf8(get_input_handle(), term->fdout);
}
add_to_list(terminals, term);
set_handlers(fdin, (select_handler_T) in_term, NULL,
@ -141,6 +164,14 @@ destroy_terminal(struct terminal *term)
del_from_list(term);
close(term->fdin);
if (get_opt_int_tree(term->spec, "type") == TERM_LINUX) {
if (term->linux_was_utf8) {
hard_write(term->fdout, "\033%G", 3);
} else {
hard_write(term->fdout, "\033%@", 3);
}
}
if (term->fdout != 1) {
if (term->fdout != term->fdin) close(term->fdout);
} else {

View File

@ -131,6 +131,9 @@ struct terminal {
unsigned int utf8:1;
#endif /* CONFIG_UTF_8 */
/* Indicates whether Linux console was in UTF-8 mode on startup */
unsigned int linux_was_utf8:1;
/* The current tab number. */
int current_tab;