noux: respond to terminal-size changes

This commit is contained in:
Norman Feske 2018-02-07 17:49:57 +01:00
parent 8aa1e349fc
commit a22b0c3ac6
6 changed files with 22 additions and 8 deletions

View File

@ -39,8 +39,9 @@ struct Noux::Sysio
{ {
/* signal numbers must match with libc signal numbers */ /* signal numbers must match with libc signal numbers */
enum Signal { enum Signal {
SIG_INT = 2, SIG_INT = 2,
SIG_CHLD = 20, SIG_CHLD = 20,
SIG_WINCH = 28
}; };
enum { SIGNAL_QUEUE_SIZE = 32 }; enum { SIGNAL_QUEUE_SIZE = 32 };

View File

@ -210,6 +210,7 @@ static bool noux_syscall(Noux::Session::Syscall opcode)
if (signal_action[signal].sa_handler == SIG_DFL) { if (signal_action[signal].sa_handler == SIG_DFL) {
switch (signal) { switch (signal) {
case SIGCHLD: case SIGCHLD:
case SIGWINCH:
/* ignore */ /* ignore */
break; break;
default: default:

View File

@ -568,13 +568,14 @@ class Noux::Child : public Rpc_object<Session>,
return child; return child;
} }
/********************************* /*********************************
** Interrupt_handler interface ** ** Interrupt_handler interface **
*********************************/ *********************************/
void handle_interrupt() void handle_interrupt(Sysio::Signal signal)
{ {
submit_signal(Sysio::SIG_INT); submit_signal(signal);
} }
}; };

View File

@ -14,11 +14,13 @@
#ifndef _NOUX__INTERRUPT_HANDLER__H_ #ifndef _NOUX__INTERRUPT_HANDLER__H_
#define _NOUX__INTERRUPT_HANDLER__H_ #define _NOUX__INTERRUPT_HANDLER__H_
#include <noux_session/sysio.h>
namespace Noux { namespace Noux {
struct Interrupt_handler struct Interrupt_handler
{ {
virtual void handle_interrupt() = 0; virtual void handle_interrupt(Sysio::Signal) = 0;
}; };
}; };

View File

@ -177,14 +177,14 @@ class Noux::Io_channel : public Reference_counter
/** /**
* Tell all registered handlers about an interrupt event * Tell all registered handlers about an interrupt event
*/ */
void invoke_all_interrupt_handlers() void invoke_all_interrupt_handlers(Sysio::Signal signal)
{ {
Lock::Guard signal_lock_guard(signal_lock()); Lock::Guard signal_lock_guard(signal_lock());
Lock::Guard guard(_interrupt_handlers_lock); Lock::Guard guard(_interrupt_handlers_lock);
for (Io_channel_listener *l = _interrupt_handlers.first(); for (Io_channel_listener *l = _interrupt_handlers.first();
l; l = l->next()) l; l = l->next())
l->object()->handle_interrupt(); l->object()->handle_interrupt(signal);
} }
/** /**

View File

@ -33,6 +33,8 @@ struct Noux::Terminal_io_channel : Io_channel
Signal_handler<Terminal_io_channel> _read_avail_handler; Signal_handler<Terminal_io_channel> _read_avail_handler;
Signal_handler<Terminal_io_channel> _resize_handler;
bool eof = false; bool eof = false;
enum Type { STDIN, STDOUT, STDERR } type; enum Type { STDIN, STDOUT, STDERR } type;
@ -44,6 +46,7 @@ struct Noux::Terminal_io_channel : Io_channel
: :
_terminal(terminal), _terminal(terminal),
_read_avail_handler(ep, *this, &Terminal_io_channel::_handle_read_avail), _read_avail_handler(ep, *this, &Terminal_io_channel::_handle_read_avail),
_resize_handler (ep, *this, &Terminal_io_channel::_handle_resize),
type(type) type(type)
{ {
/* /*
@ -59,6 +62,7 @@ struct Noux::Terminal_io_channel : Io_channel
*/ */
if (type == STDIN) { if (type == STDIN) {
terminal.read_avail_sigh(_read_avail_handler); terminal.read_avail_sigh(_read_avail_handler);
terminal.size_changed_sigh(_resize_handler);
} }
} }
@ -211,7 +215,7 @@ struct Noux::Terminal_io_channel : Io_channel
enum { INTERRUPT = 3 }; enum { INTERRUPT = 3 };
if (c == INTERRUPT) { if (c == INTERRUPT) {
Io_channel::invoke_all_interrupt_handlers(); Io_channel::invoke_all_interrupt_handlers(Sysio::SIG_INT);
} else { } else {
read_buffer.add(c); read_buffer.add(c);
} }
@ -219,6 +223,11 @@ struct Noux::Terminal_io_channel : Io_channel
Io_channel::invoke_all_notifiers(); Io_channel::invoke_all_notifiers();
} }
void _handle_resize()
{
Io_channel::invoke_all_interrupt_handlers(Sysio::SIG_WINCH);
}
}; };
#endif /* _NOUX__TERMINAL_IO_CHANNEL_H_ */ #endif /* _NOUX__TERMINAL_IO_CHANNEL_H_ */