diff --git a/TODO b/TODO index cf47092..e34ba22 100644 --- a/TODO +++ b/TODO @@ -2,7 +2,6 @@ * use MicroConf to parse config file * make it possible to have vim-like seek keys (configure hjkl keyboard shortcuts to arrow keys) -- fix terminal settings after crash wishlist: - wav output with --wav foo.wav diff --git a/src/gst123.cc b/src/gst123.cc index 2a13af8..e1e6623 100644 --- a/src/gst123.cc +++ b/src/gst123.cc @@ -365,6 +365,7 @@ struct Player : public KeyHandler { string uri = uris[play_position++]; + cols = get_columns(); overwrite_time_display(); if (is_image_file (uri)) diff --git a/src/terminal.cc b/src/terminal.cc index 92cc49b..3b127c6 100644 --- a/src/terminal.cc +++ b/src/terminal.cc @@ -27,10 +27,6 @@ #include #include -#ifdef getch -#undef getch -#endif - #include "terminal.h" using std::vector; @@ -40,6 +36,7 @@ using std::map; static char term_buffer[4096]; static char term_buffer2[4096]; static char *term_p = term_buffer2; +static struct termios tio_orig; static Terminal *terminal_instance; static GPollFD stdin_poll_fd = { 0, G_IO_IN, 0 }; @@ -61,6 +58,17 @@ stdin_check (GSource *source) return FALSE; } +static void +reset_terminal () +{ + tcsetattr(0, TCSANOW, &tio_orig); + char *ret = tgetstr ("ke", &term_p); + // disable keypad xmit + if (ret) + printf ("%s", ret); + fflush (stdout); +} + gboolean Terminal::stdin_dispatch (GSource *source, GSourceFunc callback, @@ -71,7 +79,7 @@ Terminal::stdin_dispatch (GSource *source, int key; do { - key = terminal_instance->getch(); + key = terminal_instance->getchar(); if (key > 0) terminal_instance->key_handler->process_input (key); @@ -87,15 +95,6 @@ Terminal::signal_sig_cont (int) terminal_instance->init_terminal(); } -void -Terminal::print_term (const char *key) -{ - char *ret = tgetstr (const_cast (key), &term_p); - - if (ret) - printf ("%s", ret); -} - void Terminal::init_terminal() { @@ -109,7 +108,10 @@ Terminal::init_terminal() tcsetattr (0, TCSANOW, &tio_new); // enable keypad_xmit - print_term ("ks"); + char *ret = tgetstr ("ks", &term_p); + // disable keypad xmit + if (ret) + printf ("%s", ret); fflush (stdout); } @@ -138,6 +140,7 @@ Terminal::init (GMainLoop *loop, KeyHandler *key_handler) // initialize termios & keypad xmit init_terminal(); + atexit(reset_terminal); // initialize common keyboard escape sequences bind_key ("ku", KEY_HANDLER_UP); @@ -159,9 +162,7 @@ Terminal::init (GMainLoop *loop, KeyHandler *key_handler) void Terminal::end() { - tcsetattr(0,TCSANOW,&tio_orig); - // disable keypad xmit - print_term("ke"); + reset_terminal(); } void @@ -177,7 +178,7 @@ Terminal::read_stdin() } int -Terminal::getch() +Terminal::getchar() { for (;;) { diff --git a/src/terminal.h b/src/terminal.h index 81898e2..3fc5096 100644 --- a/src/terminal.h +++ b/src/terminal.h @@ -28,7 +28,6 @@ class Terminal { - struct termios tio_orig; std::string terminal_type; std::vector chars; std::map keys; @@ -39,7 +38,7 @@ class Terminal static void signal_sig_cont (int); void read_stdin(); - int getch(); + int getchar(); void init_terminal(); void bind_key (const char *key, int handler); void print_term (const char *key);