diff --git a/src/terminal/kbd.c b/src/terminal/kbd.c index 016efabdb..ee203aa11 100644 --- a/src/terminal/kbd.c +++ b/src/terminal/kbd.c @@ -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"); diff --git a/src/terminal/kbd.h b/src/terminal/kbd.h index b369155ab..1ffddfd37 100644 --- a/src/terminal/kbd.h +++ b/src/terminal/kbd.h @@ -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)) diff --git a/src/terminal/terminal.c b/src/terminal/terminal.c index d5aab281d..f604e5c88 100644 --- a/src/terminal/terminal.c +++ b/src/terminal/terminal.c @@ -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 { diff --git a/src/terminal/terminal.h b/src/terminal/terminal.h index 69c5aa46a..e9b26253b 100644 --- a/src/terminal/terminal.h +++ b/src/terminal/terminal.h @@ -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;