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:
parent
87ae9d3e45
commit
b93ed27836
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user