Convert graphical terminal to a nitpicker client
Convert the graphical terminal server from a Framebuffer and Input client to a Nitpicker client. The removes the need to run an instance of nit_fb when using the terminal in the common case. This is a partial conversion, the internal framebuffer logic in the terminal has not been fully converted. For example, the dimensions of the nitpicker view should be clipped to fit the nearest character-cell. Fix #3261
This commit is contained in:
parent
ebe71a12ed
commit
0d1761d54b
|
@ -3,6 +3,7 @@ os
|
|||
framebuffer_session
|
||||
input_session
|
||||
nitpicker_gfx
|
||||
nitpicker_session
|
||||
terminal_session
|
||||
timer_session
|
||||
vfs
|
||||
|
|
|
@ -228,17 +228,6 @@
|
|||
</route>
|
||||
</start>
|
||||
|
||||
<start name="log_nit_fb">
|
||||
<binary name="nit_fb"/>
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
<provides> <service name="Framebuffer"/> <service name="Input"/> </provides>
|
||||
<config origin="top_right" xpos="-412" ypos="2" initial_width="400" initial_height="400"/>
|
||||
<route>
|
||||
<service name="Nitpicker"> <child name="wm" label="log"/> </service>
|
||||
<any-service> <parent/> </any-service>
|
||||
</route>
|
||||
</start>
|
||||
|
||||
<start name="log_terminal">
|
||||
<binary name="terminal"/>
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
|
@ -256,7 +245,8 @@
|
|||
</vfs>
|
||||
</config>
|
||||
<route>
|
||||
<any-service> <child name="log_nit_fb"/> <parent/> </any-service>
|
||||
<service name="Nitpicker"> <child name="wm" label="log"/> </service>
|
||||
<any-service> <parent/> </any-service>
|
||||
</route>
|
||||
</start>
|
||||
|
||||
|
|
|
@ -4,7 +4,6 @@ import_from_depot [depot_user]/src/[base_src] \
|
|||
[depot_user]/pkg/[drivers_interactive_pkg] \
|
||||
[depot_user]/pkg/terminal \
|
||||
[depot_user]/src/nitpicker \
|
||||
[depot_user]/src/nit_fb \
|
||||
[depot_user]/src/demo \
|
||||
[depot_user]/src/init
|
||||
|
||||
|
@ -68,23 +67,11 @@ install_config {
|
|||
<resource name="RAM" quantum="1M"/>
|
||||
</start>
|
||||
|
||||
<start name="terminal_fb">
|
||||
<binary name="nit_fb"/>
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
<provides>
|
||||
<service name="Framebuffer"/>
|
||||
<service name="Input"/>
|
||||
</provides>
|
||||
<config xpos="0" ypos="0" width="640" height="480" refresh_rate="25"/>
|
||||
</start>
|
||||
|
||||
<start name="terminal">
|
||||
<resource name="RAM" quantum="3M"/>
|
||||
<provides><service name="Terminal"/></provides>
|
||||
<route>
|
||||
<service name="ROM" label="config"> <parent label="terminal.config"/> </service>
|
||||
<service name="Input"> <child name="terminal_fb"/> </service>
|
||||
<service name="Framebuffer"> <child name="terminal_fb"/> </service>
|
||||
<any-service> <parent/> <any-child/></any-service>
|
||||
</route>
|
||||
</start>
|
||||
|
@ -108,6 +95,6 @@ install_config {
|
|||
|
||||
build { server/terminal_log test/nitpicker }
|
||||
|
||||
build_boot_image { terminal_log testnit }
|
||||
build_boot_image { terminal_log testnit terminal }
|
||||
|
||||
run_genode_until forever
|
||||
|
|
|
@ -24,44 +24,14 @@ namespace Sculpt {
|
|||
fn(Storage_target { device.label, partition.number }); }); });
|
||||
}
|
||||
|
||||
void gen_nit_fb_start(Xml_generator &, Rom_name const &);
|
||||
void gen_terminal_start(Xml_generator &, Rom_name const &, Rom_name const &,
|
||||
void gen_terminal_start(Xml_generator &, Rom_name const &,
|
||||
File_browser_version);
|
||||
void gen_noux_start(Xml_generator &, Rom_name const &, Rom_name const &,
|
||||
Storage_devices const &, Ram_fs_state const &, File_browser_version);
|
||||
}
|
||||
|
||||
|
||||
void Sculpt::gen_nit_fb_start(Xml_generator &xml, Rom_name const &name)
|
||||
{
|
||||
gen_common_start_content(xml, name, Cap_quota{100}, Ram_quota{18*1024*1024});
|
||||
|
||||
gen_named_node(xml, "binary", "nit_fb");
|
||||
|
||||
xml.node("provides", [&] () {
|
||||
gen_service_node<Framebuffer::Session>(xml, [&] () {});
|
||||
gen_service_node<Input::Session>(xml, [&] () {});
|
||||
});
|
||||
|
||||
xml.node("config", [&] () { });
|
||||
|
||||
xml.node("route", [&] () {
|
||||
|
||||
gen_service_node<Nitpicker::Session>(xml, [&] () {
|
||||
xml.node("parent", [&] () {
|
||||
xml.attribute("label", String<64>("leitzentrale -> ", name)); }); });
|
||||
|
||||
gen_parent_rom_route(xml, "nit_fb");
|
||||
gen_parent_rom_route(xml, "ld.lib.so");
|
||||
gen_parent_route<Cpu_session> (xml);
|
||||
gen_parent_route<Pd_session> (xml);
|
||||
gen_parent_route<Log_session> (xml);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
void Sculpt::gen_terminal_start(Xml_generator &xml, Rom_name const &name,
|
||||
Rom_name const &nit_fb_name,
|
||||
File_browser_version version)
|
||||
{
|
||||
xml.attribute("version", version.value);
|
||||
|
@ -73,11 +43,9 @@ void Sculpt::gen_terminal_start(Xml_generator &xml, Rom_name const &name,
|
|||
gen_provides<Terminal::Session>(xml);
|
||||
|
||||
xml.node("route", [&] () {
|
||||
gen_service_node<Framebuffer::Session>(xml, [&] () {
|
||||
gen_named_node(xml, "child", nit_fb_name); });
|
||||
|
||||
gen_service_node<Input::Session>(xml, [&] () {
|
||||
gen_named_node(xml, "child", nit_fb_name); });
|
||||
gen_service_node<Nitpicker::Session>(xml, [&] () {
|
||||
xml.node("parent", [&] () {
|
||||
xml.attribute("label", String<64>("leitzentrale -> ", name)); }); });
|
||||
|
||||
gen_parent_rom_route(xml, "terminal");
|
||||
gen_parent_rom_route(xml, "ld.lib.so");
|
||||
|
@ -214,13 +182,9 @@ void Sculpt::gen_file_browser(Xml_generator &xml,
|
|||
File_browser_version version)
|
||||
{
|
||||
xml.node("start", [&] () {
|
||||
gen_nit_fb_start(xml, "inspect"); });
|
||||
gen_terminal_start(xml, "inspect", version); });
|
||||
|
||||
xml.node("start", [&] () {
|
||||
gen_terminal_start(xml, "inspect terminal", "inspect",
|
||||
version); });
|
||||
|
||||
xml.node("start", [&] () {
|
||||
gen_noux_start(xml, "inspect noux", "inspect terminal",
|
||||
gen_noux_start(xml, "inspect noux", "inspect ",
|
||||
devices, ram_fs_state, version); });
|
||||
}
|
||||
|
|
|
@ -26,14 +26,22 @@ class Terminal::Framebuffer
|
|||
{
|
||||
private:
|
||||
|
||||
typedef Nitpicker::Session::Command Command;
|
||||
|
||||
Env &_env;
|
||||
|
||||
::Framebuffer::Connection _fb { _env, ::Framebuffer::Mode() };
|
||||
Nitpicker::Connection &_nitpicker;
|
||||
|
||||
::Framebuffer::Session &_fb
|
||||
{ *_nitpicker.framebuffer() };
|
||||
|
||||
Constructible<Attached_dataspace> _ds { };
|
||||
|
||||
::Framebuffer::Mode _mode { };
|
||||
|
||||
Nitpicker::Session::View_handle const _view_handle
|
||||
{ _nitpicker.create_view() };
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
|
@ -41,10 +49,13 @@ class Terminal::Framebuffer
|
|||
*
|
||||
* \param mode_sigh signal handler to be triggered on mode changes
|
||||
*/
|
||||
Framebuffer(Env &env, Signal_context_capability mode_sigh) : _env(env)
|
||||
Framebuffer(Env &env,
|
||||
Nitpicker::Connection &np,
|
||||
Signal_context_capability mode_sigh)
|
||||
: _env(env), _nitpicker(np)
|
||||
{
|
||||
switch_to_new_mode();
|
||||
_fb.mode_sigh(mode_sigh);
|
||||
_nitpicker.mode_sigh(mode_sigh);
|
||||
}
|
||||
|
||||
unsigned w() const { return _mode.width(); }
|
||||
|
@ -64,7 +75,7 @@ class Terminal::Framebuffer
|
|||
*/
|
||||
bool mode_changed() const
|
||||
{
|
||||
::Framebuffer::Mode _new_mode = _fb.mode();
|
||||
::Framebuffer::Mode _new_mode = _nitpicker.mode();
|
||||
|
||||
return _new_mode.width() != _mode.width()
|
||||
|| _new_mode.height() != _mode.height();
|
||||
|
@ -81,10 +92,20 @@ class Terminal::Framebuffer
|
|||
* the dataspace update - the mode information may correspond to
|
||||
* the next pending mode at the server while we are operating on
|
||||
* the old (possibly too small) dataspace.
|
||||
*
|
||||
* TODO:clip the geometry down to the nearest character-cell
|
||||
*/
|
||||
_mode = _fb.mode();
|
||||
if (_mode.width() && _mode.height())
|
||||
::Framebuffer::Mode mode = _nitpicker.mode();
|
||||
if (mode.width() && mode.height()) {
|
||||
_nitpicker.buffer(mode, false);
|
||||
_mode = _fb.mode();
|
||||
_ds.construct(_env.rm(), _fb.dataspace());
|
||||
|
||||
using namespace Nitpicker;
|
||||
Rect rect(Point(0,0), Area(_mode.width(), _mode.height()));
|
||||
_nitpicker.enqueue<Command::Geometry>(_view_handle, rect);
|
||||
_nitpicker.execute();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <base/attached_rom_dataspace.h>
|
||||
#include <base/attached_ram_dataspace.h>
|
||||
#include <input/event.h>
|
||||
#include <nitpicker_session/connection.h>
|
||||
#include <gems/vfs.h>
|
||||
#include <gems/vfs_font.h>
|
||||
#include <gems/cached_font.h>
|
||||
|
@ -77,10 +78,11 @@ struct Terminal::Main : Character_consumer
|
|||
Signal_handler<Main> _config_handler {
|
||||
_env.ep(), *this, &Main::_handle_config };
|
||||
|
||||
Input::Connection _input { _env };
|
||||
Timer::Connection _timer { _env };
|
||||
|
||||
Framebuffer _framebuffer { _env, _config_handler };
|
||||
Nitpicker::Connection _nitpicker { _env };
|
||||
|
||||
Framebuffer _framebuffer { _env, _nitpicker, _config_handler };
|
||||
|
||||
typedef Pixel_rgb565 PT;
|
||||
|
||||
|
@ -143,7 +145,7 @@ struct Terminal::Main : Character_consumer
|
|||
{
|
||||
_timer .sigh(_flush_handler);
|
||||
_config.sigh(_config_handler);
|
||||
_input .sigh(_input_handler);
|
||||
_nitpicker.input()->sigh(_input_handler);
|
||||
|
||||
_handle_config();
|
||||
|
||||
|
@ -250,7 +252,7 @@ void Terminal::Main::_handle_config()
|
|||
|
||||
void Terminal::Main::_handle_input()
|
||||
{
|
||||
_input.for_each_event([&] (Input::Event const &event) {
|
||||
_nitpicker.input()->for_each_event([&] (Input::Event const &event) {
|
||||
|
||||
event.handle_press([&] (Input::Keycode, Codepoint codepoint) {
|
||||
|
||||
|
|
|
@ -20,7 +20,6 @@ import_from_depot [depot_user]/src/[base_src] \
|
|||
[depot_user]/pkg/terminal \
|
||||
[depot_user]/src/init \
|
||||
[depot_user]/src/nitpicker \
|
||||
[depot_user]/src/nit_fb \
|
||||
[depot_user]/src/libc \
|
||||
[depot_user]/src/noux \
|
||||
[depot_user]/src/posix \
|
||||
|
@ -86,34 +85,12 @@ install_config {
|
|||
<resource name="RAM" quantum="1M"/>
|
||||
</start>
|
||||
|
||||
<start name="terminal_noux_fb">
|
||||
<binary name="nit_fb"/>
|
||||
<resource name="RAM" quantum="2M"/>
|
||||
<provides>
|
||||
<service name="Framebuffer"/>
|
||||
<service name="Input"/>
|
||||
</provides>
|
||||
<config xpos="0" ypos="0" width="1024" height="380" refresh_rate="25"/>
|
||||
</start>
|
||||
|
||||
<start name="terminal_test_fb">
|
||||
<binary name="nit_fb"/>
|
||||
<resource name="RAM" quantum="2M"/>
|
||||
<provides>
|
||||
<service name="Framebuffer"/>
|
||||
<service name="Input"/>
|
||||
</provides>
|
||||
<config xpos="0" ypos="388" width="1024" height="380" refresh_rate="25"/>
|
||||
</start>
|
||||
|
||||
<start name="terminal_noux">
|
||||
<binary name="terminal"/>
|
||||
<resource name="RAM" quantum="2M"/>
|
||||
<provides><service name="Terminal"/></provides>
|
||||
<route>
|
||||
<service name="ROM" label="config"> <parent label="terminal.config"/> </service>
|
||||
<service name="Input"><child name="terminal_noux_fb"/></service>
|
||||
<service name="Framebuffer"><child name="terminal_noux_fb"/> </service>
|
||||
<any-service><parent/><any-child/></any-service>
|
||||
</route>
|
||||
</start>
|
||||
|
@ -124,8 +101,6 @@ install_config {
|
|||
<provides><service name="Terminal"/></provides>
|
||||
<route>
|
||||
<service name="ROM" label="config"> <parent label="terminal.config"/> </service>
|
||||
<service name="Input"><child name="terminal_test_fb"/></service>
|
||||
<service name="Framebuffer"><child name="terminal_test_fb"/> </service>
|
||||
<any-service><parent/><any-child/></any-service>
|
||||
</route>
|
||||
</start>
|
||||
|
|
Loading…
Reference in New Issue