Skip to content

Commit

Permalink
tools: play: fix leaving STDIN in non-blocking mode after exit
Browse files Browse the repository at this point in the history
gst-play-1.0 sets STDIN to non-blocking mode to have the input
characters read as soon as they arrive.

However, when gst_play_kb_set_key_handler() gets called from
restore_terminal() it forgets to restore the STDIN blocking status.

This can result in broken behavior for cli command executed in the same
terminal after gst-play-1.0 exited.

It turns out that putting STDIN in non-blocking mode is not even the
proper way to achieve the desired effect, instead VMIN and VTIME in
struct termios should be set to 0.

Let's do that, and don't mess with the STDIN blocking mode now that it's
not necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=794591
  • Loading branch information
ao2 authored and tp-m committed Mar 26, 2018
1 parent dc527ca commit cfc1be0
Showing 1 changed file with 2 additions and 5 deletions.
7 changes: 2 additions & 5 deletions tools/gst-play-kb.c
Expand Up @@ -71,7 +71,6 @@ gboolean
gst_play_kb_set_key_handler (GstPlayKbFunc kb_func, gpointer user_data)
{
GIOChannel *ioc;
int flags;

if (!isatty (STDIN_FILENO)) {
GST_INFO ("stdin is not connected to a terminal");
Expand Down Expand Up @@ -106,6 +105,8 @@ gst_play_kb_set_key_handler (GstPlayKbFunc kb_func, gpointer user_data)
/* Echo off, canonical mode off, extended input processing off */
new_settings = term_settings;
new_settings.c_lflag &= ~(ECHO | ICANON | IEXTEN);
new_settings.c_cc[VMIN] = 0;
new_settings.c_cc[VTIME] = 0;

if (tcsetattr (STDIN_FILENO, TCSAFLUSH, &new_settings) != 0) {
g_warning ("Could not set terminal state");
Expand All @@ -117,10 +118,6 @@ gst_play_kb_set_key_handler (GstPlayKbFunc kb_func, gpointer user_data)

ioc = g_io_channel_unix_new (STDIN_FILENO);

/* make non-blocking */
flags = g_io_channel_get_flags (ioc);
g_io_channel_set_flags (ioc, flags | G_IO_FLAG_NONBLOCK, NULL);

io_watch_id = g_io_add_watch_full (ioc, G_PRIORITY_DEFAULT, G_IO_IN,
(GIOFunc) gst_play_kb_io_cb, user_data, NULL);
g_io_channel_unref (ioc);
Expand Down

0 comments on commit cfc1be0

Please sign in to comment.