From 8aa1e349fc468c13f4b153db3611b07bd9acf580 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 7 Feb 2018 17:03:19 +0100 Subject: [PATCH] terminal session: propagate resize events The new 'Terminal_session::size_changed_sigh' RPC function registers a signal handler that is triggered each time when the terminal size changes. It enables the client to adjust itself to the new size by subsequently calling the 'size' RPC function. Of all terminal servers, only the graphical terminal triggers this signal. --- .../dde_linux/src/server/usb_terminal/main.cc | 14 ++-- repos/gems/src/server/file_terminal/main.cc | 20 ++--- repos/gems/src/server/tcp_terminal/main.cc | 14 ++-- repos/gems/src/server/terminal/main.cc | 16 ++-- repos/gems/src/server/terminal/session.h | 75 ++++++++++++++----- repos/gems/src/server/terminal_mux/main.cc | 3 + repos/os/include/terminal_session/client.h | 5 ++ .../terminal_session/terminal_session.h | 8 +- repos/os/include/uart_session/client.h | 5 ++ repos/os/src/drivers/uart/uart_component.h | 14 ++-- repos/os/src/server/log_terminal/main.cc | 12 +-- .../terminal_session_component.h | 14 ++-- 12 files changed, 134 insertions(+), 66 deletions(-) diff --git a/repos/dde_linux/src/server/usb_terminal/main.cc b/repos/dde_linux/src/server/usb_terminal/main.cc index ca144b559b..e64157d1c1 100644 --- a/repos/dde_linux/src/server/usb_terminal/main.cc +++ b/repos/dde_linux/src/server/usb_terminal/main.cc @@ -252,18 +252,20 @@ class Terminal::Session_component : public Rpc_objectsize(); - _schedule_flush(); - } + _framebuffer.switch_to_new_mode(); + _text_screen_surface.construct(_heap, *_font_family, + _color_palette, _framebuffer); + _terminal_size = _text_screen_surface->size(); + _root.notify_resized(_terminal_size); + _schedule_flush(); /* * Read keyboard layout from config file diff --git a/repos/gems/src/server/terminal/session.h b/repos/gems/src/server/terminal/session.h index 9eef841d3d..8b38ab52c3 100644 --- a/repos/gems/src/server/terminal/session.h +++ b/repos/gems/src/server/terminal/session.h @@ -31,10 +31,12 @@ class Terminal::Session_component : public Rpc_object > _sessions { }; protected: - Session_component *_create_session(const char *) + Session_component *_create_session(const char *) override { /* * XXX read I/O buffer size from args */ size_t io_buffer_size = 4096; - return new (md_alloc()) - Session_component(_env, - _read_buffer, - _character_consumer, - _terminal_size, - io_buffer_size); + Session_component &session = *new (md_alloc()) + Registered(_sessions, + _env, + _read_buffer, + _character_consumer, + io_buffer_size); + + /* propagate current terminal size to client */ + session.notify_resized(_terminal_size); + + return &session; } public: @@ -143,15 +174,21 @@ class Terminal::Root_component : public Genode::Root_component(env.ep(), md_alloc), _env(env), _read_buffer(read_buffer), - _character_consumer(character_consumer), - _terminal_size(terminal_size) + _character_consumer(character_consumer) { } + + void notify_resized(Session::Size size) + { + _terminal_size = size; + + _sessions.for_each([&] (Session_component &session) { + session.notify_resized(size); }); + } }; #endif /* _SESSION_H_ */ diff --git a/repos/gems/src/server/terminal_mux/main.cc b/repos/gems/src/server/terminal_mux/main.cc index bfa9409a48..f46d9837c0 100644 --- a/repos/gems/src/server/terminal_mux/main.cc +++ b/repos/gems/src/server/terminal_mux/main.cc @@ -330,6 +330,9 @@ class Terminal::Session_component : public Genode::Rpc_object call(cap); } + void size_changed_sigh(Genode::Signal_context_capability cap) + { + call(cap); + } + Genode::size_t io_buffer_size() const { return _io_buffer.size(); } }; diff --git a/repos/os/include/terminal_session/terminal_session.h b/repos/os/include/terminal_session/terminal_session.h index ada3478cc8..1ecf828172 100644 --- a/repos/os/include/terminal_session/terminal_session.h +++ b/repos/os/include/terminal_session/terminal_session.h @@ -93,6 +93,11 @@ struct Terminal::Session : Genode::Session */ virtual void read_avail_sigh(Genode::Signal_context_capability cap) = 0; + /** + * Register signal handler to be notified on terminal-size changes + */ + virtual void size_changed_sigh(Genode::Signal_context_capability cap) = 0; + /******************* ** RPC interface ** @@ -104,11 +109,12 @@ struct Terminal::Session : Genode::Session GENODE_RPC(Rpc_write, Genode::size_t, _write, Genode::size_t); GENODE_RPC(Rpc_connected_sigh, void, connected_sigh, Genode::Signal_context_capability); GENODE_RPC(Rpc_read_avail_sigh, void, read_avail_sigh, Genode::Signal_context_capability); + GENODE_RPC(Rpc_size_changed_sigh, void, size_changed_sigh, Genode::Signal_context_capability); GENODE_RPC(Rpc_dataspace, Genode::Dataspace_capability, _dataspace); GENODE_RPC_INTERFACE(Rpc_size, Rpc_avail, Rpc_read, Rpc_write, Rpc_connected_sigh, Rpc_read_avail_sigh, - Rpc_dataspace); + Rpc_size_changed_sigh, Rpc_dataspace); }; #endif /* _INCLUDE__TERMINAL_SESSION__TERMINAL_SESSION_H_ */ diff --git a/repos/os/include/uart_session/client.h b/repos/os/include/uart_session/client.h index 02dd965212..2d11d341ed 100644 --- a/repos/os/include/uart_session/client.h +++ b/repos/os/include/uart_session/client.h @@ -78,6 +78,11 @@ class Uart::Session_client : public Genode::Rpc_client _terminal.read_avail_sigh(cap); } + void size_changed_sigh(Genode::Signal_context_capability cap) + { + _terminal.size_changed_sigh(cap); + } + Genode::size_t io_buffer_size() const { return _terminal.io_buffer_size(); diff --git a/repos/os/src/drivers/uart/uart_component.h b/repos/os/src/drivers/uart/uart_component.h index 5583431d3d..3c4069660b 100644 --- a/repos/os/src/drivers/uart/uart_component.h +++ b/repos/os/src/drivers/uart/uart_component.h @@ -152,9 +152,9 @@ class Uart::Session_component : public Rpc_object