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