1
mirror of https://github.com/mpv-player/mpv synced 2025-01-13 00:06:25 +01:00

input: stop trying to read terminal input on EOF

Stop trying to read terminal input if a read attempt returns EOF. The
most important case where this matters is when someone runs the player
with stdin redirected from /dev/null and without specifying
--no-consolecontrols. This used to cause 100% CPU load while paused,
as select() would continuously trigger on stdin (the need for
--no-consolecontrols was not apparent to people with older mplayer
versions, as input reading was less efficient and latencies like
hardcoded sleeps kept CPU use well below 100%). Now this will only
cause a "Dead key input" error message.
This commit is contained in:
Uoti Urpala 2012-04-06 14:24:26 +03:00
parent 87ae9d3e45
commit b93ed27836
4 changed files with 17 additions and 6 deletions

View File

@ -3798,8 +3798,9 @@ static void run_playloop(struct MPContext *mpctx)
static int read_keys(void *ctx, int fd) static int read_keys(void *ctx, int fd)
{ {
getch2(ctx); if (getch2(ctx))
return MP_INPUT_NOTHING; return MP_INPUT_NOTHING;
return MP_INPUT_DEAD;
} }
static bool attachment_is_font(struct demux_attachment *att) static bool attachment_is_font(struct demux_attachment *att)

View File

@ -158,11 +158,12 @@ static int getch2_internal(void)
return -1; return -1;
} }
void getch2(struct mp_fifo *fifo) bool getch2(struct mp_fifo *fifo)
{ {
int r = getch2_internal(); int r = getch2_internal();
if (r >= 0) if (r >= 0)
mplayer_put_key(fifo, r); mplayer_put_key(fifo, r);
return true;
} }
void getch2_enable(void) void getch2_enable(void)

View File

@ -158,11 +158,17 @@ void get_screen_size(void){
#endif #endif
} }
void getch2(struct mp_fifo *fifo) bool getch2(struct mp_fifo *fifo)
{ {
int retval = read(0, &getch2_buf[getch2_len], BUF_LEN-getch2_len); int retval = read(0, &getch2_buf[getch2_len], BUF_LEN-getch2_len);
/* Return false on EOF to stop running select() on the FD, as it'd
* trigger all the time. Note that it's possible to get temporary
* EOF on terminal if the user presses ctrl-d, but that shouldn't
* happen if the terminal state change done in getch2_enable()
* works.
*/
if (retval < 1) if (retval < 1)
return; return retval;
getch2_len += retval; getch2_len += retval;
while (getch2_len > 0 && (getch2_len > 1 || getch2_buf[0] != 27)) { while (getch2_len > 0 && (getch2_len > 1 || getch2_buf[0] != 27)) {
@ -279,6 +285,7 @@ void getch2(struct mp_fifo *fifo)
getch2_buf[i] = getch2_buf[len+i]; getch2_buf[i] = getch2_buf[len+i];
mplayer_put_key(fifo, code); mplayer_put_key(fifo, code);
} }
return true;
} }
static int getch2_status=0; static int getch2_status=0;

View File

@ -24,6 +24,8 @@
#ifndef MPLAYER_GETCH2_H #ifndef MPLAYER_GETCH2_H
#define MPLAYER_GETCH2_H #define MPLAYER_GETCH2_H
#include <stdbool.h>
#include "config.h" #include "config.h"
/* Screen size. Initialized by load_termcap() and get_screen_size() */ /* Screen size. Initialized by load_termcap() and get_screen_size() */
@ -45,7 +47,7 @@ void getch2_disable(void);
/* Read a character or a special key code (see keycodes.h) */ /* Read a character or a special key code (see keycodes.h) */
struct mp_fifo; struct mp_fifo;
void getch2(struct mp_fifo *fifo); bool getch2(struct mp_fifo *fifo);
#ifdef CONFIG_ICONV #ifdef CONFIG_ICONV
/** /**