1
mirror of https://github.com/mpv-player/mpv synced 2024-12-24 07:33:46 +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)
{
getch2(ctx);
return MP_INPUT_NOTHING;
if (getch2(ctx))
return MP_INPUT_NOTHING;
return MP_INPUT_DEAD;
}
static bool attachment_is_font(struct demux_attachment *att)

View File

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

View File

@ -158,11 +158,17 @@ void get_screen_size(void){
#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);
/* 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)
return;
return retval;
getch2_len += retval;
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];
mplayer_put_key(fifo, code);
}
return true;
}
static int getch2_status=0;

View File

@ -24,6 +24,8 @@
#ifndef MPLAYER_GETCH2_H
#define MPLAYER_GETCH2_H
#include <stdbool.h>
#include "config.h"
/* 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) */
struct mp_fifo;
void getch2(struct mp_fifo *fifo);
bool getch2(struct mp_fifo *fifo);
#ifdef CONFIG_ICONV
/**