mirror of
https://github.com/UberGames/ioef.git
synced 2024-11-24 13:11:30 +00:00
Add SIGCONT signal handler to reinitialize console after doing CTRL+Z / fg, as under Linux/bash stdin seems to lose O_NONBLOCK flag as well as all tcsetattr() attributes after foregrounding
This commit is contained in:
parent
3c501df298
commit
c312449422
1 changed files with 36 additions and 22 deletions
|
@ -70,7 +70,7 @@ FIXME relevant?
|
||||||
static void CON_FlushIn( void )
|
static void CON_FlushIn( void )
|
||||||
{
|
{
|
||||||
char key;
|
char key;
|
||||||
while (read(0, &key, 1)!=-1);
|
while (read(STDIN_FILENO, &key, 1)!=-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -90,11 +90,11 @@ static void CON_Back( void )
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
key = '\b';
|
key = '\b';
|
||||||
size = write(1, &key, 1);
|
size = write(STDOUT_FILENO, &key, 1);
|
||||||
key = ' ';
|
key = ' ';
|
||||||
size = write(1, &key, 1);
|
size = write(STDOUT_FILENO, &key, 1);
|
||||||
key = '\b';
|
key = '\b';
|
||||||
size = write(1, &key, 1);
|
size = write(STDOUT_FILENO, &key, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -146,12 +146,12 @@ static void CON_Show( void )
|
||||||
if (ttycon_hide == 0)
|
if (ttycon_hide == 0)
|
||||||
{
|
{
|
||||||
size_t size;
|
size_t size;
|
||||||
size = write( 1, "]", 1 );
|
size = write(STDOUT_FILENO, "]", 1);
|
||||||
if (TTY_con.cursor)
|
if (TTY_con.cursor)
|
||||||
{
|
{
|
||||||
for (i=0; i<TTY_con.cursor; i++)
|
for (i=0; i<TTY_con.cursor; i++)
|
||||||
{
|
{
|
||||||
size = write(1, TTY_con.buffer+i, 1);
|
size = write(STDOUT_FILENO, TTY_con.buffer+i, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -170,11 +170,11 @@ void CON_Shutdown( void )
|
||||||
if (ttycon_on)
|
if (ttycon_on)
|
||||||
{
|
{
|
||||||
CON_Back(); // Delete "]"
|
CON_Back(); // Delete "]"
|
||||||
tcsetattr (0, TCSADRAIN, &TTY_tc);
|
tcsetattr (STDIN_FILENO, TCSADRAIN, &TTY_tc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore blocking to stdin reads
|
// Restore blocking to stdin reads
|
||||||
fcntl( 0, F_SETFL, fcntl( 0, F_GETFL, 0 ) & ~O_NONBLOCK );
|
fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL, 0) & ~O_NONBLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -245,6 +245,19 @@ field_t *Hist_Next( void )
|
||||||
return &(ttyEditLines[hist_current]);
|
return &(ttyEditLines[hist_current]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
CON_SigCont
|
||||||
|
Reinitialize console input after receiving SIGCONT, as on Linux the terminal seems to lose all
|
||||||
|
set attributes if user did CTRL+Z and then does fg again.
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void CON_SigCont(int signum)
|
||||||
|
{
|
||||||
|
CON_Init();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
CON_Init
|
CON_Init
|
||||||
|
@ -262,8 +275,11 @@ void CON_Init( void )
|
||||||
signal(SIGTTIN, SIG_IGN);
|
signal(SIGTTIN, SIG_IGN);
|
||||||
signal(SIGTTOU, SIG_IGN);
|
signal(SIGTTOU, SIG_IGN);
|
||||||
|
|
||||||
|
// If SIGCONT is received, reinitialize console
|
||||||
|
signal(SIGCONT, CON_SigCont);
|
||||||
|
|
||||||
// Make stdin reads non-blocking
|
// Make stdin reads non-blocking
|
||||||
fcntl( 0, F_SETFL, fcntl( 0, F_GETFL, 0 ) | O_NONBLOCK );
|
fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL, 0) | O_NONBLOCK );
|
||||||
|
|
||||||
if (isatty(STDIN_FILENO) != 1
|
if (isatty(STDIN_FILENO) != 1
|
||||||
|| (term && (!strcmp(term, "raw") || !strcmp(term, "dumb"))))
|
|| (term && (!strcmp(term, "raw") || !strcmp(term, "dumb"))))
|
||||||
|
@ -275,7 +291,7 @@ void CON_Init( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
Field_Clear(&TTY_con);
|
Field_Clear(&TTY_con);
|
||||||
tcgetattr (0, &TTY_tc);
|
tcgetattr (STDIN_FILENO, &TTY_tc);
|
||||||
TTY_erase = TTY_tc.c_cc[VERASE];
|
TTY_erase = TTY_tc.c_cc[VERASE];
|
||||||
TTY_eof = TTY_tc.c_cc[VEOF];
|
TTY_eof = TTY_tc.c_cc[VEOF];
|
||||||
tc = TTY_tc;
|
tc = TTY_tc;
|
||||||
|
@ -298,7 +314,7 @@ void CON_Init( void )
|
||||||
tc.c_iflag &= ~(ISTRIP | INPCK);
|
tc.c_iflag &= ~(ISTRIP | INPCK);
|
||||||
tc.c_cc[VMIN] = 1;
|
tc.c_cc[VMIN] = 1;
|
||||||
tc.c_cc[VTIME] = 0;
|
tc.c_cc[VTIME] = 0;
|
||||||
tcsetattr (0, TCSADRAIN, &tc);
|
tcsetattr (STDIN_FILENO, TCSADRAIN, &tc);
|
||||||
ttycon_on = qtrue;
|
ttycon_on = qtrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,7 +334,7 @@ char *CON_Input( void )
|
||||||
|
|
||||||
if(ttycon_on)
|
if(ttycon_on)
|
||||||
{
|
{
|
||||||
avail = read(0, &key, 1);
|
avail = read(STDIN_FILENO, &key, 1);
|
||||||
if (avail != -1)
|
if (avail != -1)
|
||||||
{
|
{
|
||||||
// we have something
|
// we have something
|
||||||
|
@ -355,13 +371,13 @@ char *CON_Input( void )
|
||||||
CON_Show();
|
CON_Show();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
avail = read(0, &key, 1);
|
avail = read(STDIN_FILENO, &key, 1);
|
||||||
if (avail != -1)
|
if (avail != -1)
|
||||||
{
|
{
|
||||||
// VT 100 keys
|
// VT 100 keys
|
||||||
if (key == '[' || key == 'O')
|
if (key == '[' || key == 'O')
|
||||||
{
|
{
|
||||||
avail = read(0, &key, 1);
|
avail = read(STDIN_FILENO, &key, 1);
|
||||||
if (avail != -1)
|
if (avail != -1)
|
||||||
{
|
{
|
||||||
switch (key)
|
switch (key)
|
||||||
|
@ -407,7 +423,7 @@ char *CON_Input( void )
|
||||||
TTY_con.buffer[TTY_con.cursor] = key;
|
TTY_con.buffer[TTY_con.cursor] = key;
|
||||||
TTY_con.cursor++;
|
TTY_con.cursor++;
|
||||||
// print the current line (this is differential)
|
// print the current line (this is differential)
|
||||||
size = write(1, &key, 1);
|
size = write(STDOUT_FILENO, &key, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -419,15 +435,13 @@ char *CON_Input( void )
|
||||||
struct timeval timeout;
|
struct timeval timeout;
|
||||||
|
|
||||||
FD_ZERO(&fdset);
|
FD_ZERO(&fdset);
|
||||||
FD_SET(0, &fdset); // stdin
|
FD_SET(STDIN_FILENO, &fdset); // stdin
|
||||||
timeout.tv_sec = 0;
|
timeout.tv_sec = 0;
|
||||||
timeout.tv_usec = 0;
|
timeout.tv_usec = 0;
|
||||||
if (select (1, &fdset, NULL, NULL, &timeout) == -1 || !FD_ISSET(0, &fdset))
|
if(select (STDIN_FILENO + 1, &fdset, NULL, NULL, &timeout) == -1 || !FD_ISSET(STDIN_FILENO, &fdset))
|
||||||
{
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
len = read (0, text, sizeof(text));
|
len = read(STDIN_FILENO, text, sizeof(text));
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
{ // eof!
|
{ // eof!
|
||||||
stdin_active = qfalse;
|
stdin_active = qfalse;
|
||||||
|
|
Loading…
Reference in a new issue