sculpt: screen capturing and event injection

This patch adds session-routing options to connect components to the
capture/event interfaces of the global nitpicker GUI server or the
leitzentrale GUI server. It thereby enables the implementation of screen
capturing components, remote management tools, or virtual keyboards.

Since those services are very powerful, they are subsumed under the
"hardware" category of the component graph as opposed to the GUI
category, which guarantees the separation of clients.

Fixes #4053
This commit is contained in:
Norman Feske 2021-03-18 17:35:12 +01:00
parent d2fc834bfa
commit 8f1db47c26
7 changed files with 39 additions and 5 deletions

View File

@ -13,3 +13,5 @@ gui_session
terminal_session
rtc_session
input_session
event_session
capture_session

View File

@ -407,6 +407,8 @@ install_config {
<affinity xpos="1" width="1"/> <!-- decouple leitzentrale from boot CPU -->
<provides>
<service name="Gui"/>
<service name="Capture"/>
<service name="Event"/>
<service name="File_system"/> <!-- fonts -->
<service name="ROM"/> <!-- view dialog ROMs -->
<service name="Report"/> <!-- view hover reports -->
@ -490,6 +492,10 @@ install_config {
<service name="LOG" label="unlogged"> <parent/> </service>
<service name="LOG"> <child name="log"/> </service>
<service name="ROM" label="nic_drv"> <parent label="} [nic_drv] {"/> </service>
<service name="Event" label="global"> <child name="nitpicker"/> </service>
<service name="Event" label="leitzentrale"> <child name="leitzentrale"/> </service>
<service name="Capture" label="global"> <child name="nitpicker"/> </service>
<service name="Capture" label="leitzentrale"> <child name="leitzentrale"/> </service>
<any-service> <parent/> </any-service>
</route>
</start>

View File

@ -23,6 +23,12 @@
<service name="Gui">
<default-policy> <child name="wm"/> </default-policy> </service>
<service name="Capture">
<default-policy> <child name="nitpicker"/> </default-policy> </service>
<service name="Event">
<default-policy> <child name="nitpicker"/> </default-policy> </service>
<service name="File_system">
<default-policy> <child name="fonts_fs"/> </default-policy> </service>
@ -76,11 +82,15 @@
<start name="nitpicker" caps="200">
<resource name="RAM" quantum="8M"/>
<provides> <service name="Gui"/> </provides>
<provides>
<service name="Gui"/> <service name="Capture"/> <service name="Event"/>
</provides>
<config focus="rom" request_input="yes" request_framebuffer="yes">
<background color="#272f45"/>
<domain name="default" layer="1" content="client" label="no" hover="always" focus="click"/>
<default-policy domain="default"/>
<capture/>
<event/>
</config>
<route>
<service name="Input"> <child name="gui_fb"/> </service>

View File

@ -21,6 +21,8 @@
#include <vm_session/vm_session.h>
#include <timer_session/connection.h>
#include <io_port_session/io_port_session.h>
#include <event_session/event_session.h>
#include <capture_session/capture_session.h>
/* included from depot_deploy tool */
#include <children.h>
@ -1668,6 +1670,8 @@ void Sculpt::Main::_generate_runtime_config(Xml_generator &xml) const
gen_parent_service<Io_mem_session>(xml);
gen_parent_service<Io_port_session>(xml);
gen_parent_service<Irq_session>(xml);
gen_parent_service<Event::Session>(xml);
gen_parent_service<Capture::Session>(xml);
});
xml.node("affinity-space", [&] () {

View File

@ -31,6 +31,8 @@ struct Sculpt::Route : List_model<Route>::Element
case Service::Type::AUDIO_IN: return "audio_in";
case Service::Type::AUDIO_OUT: return "audio_out";
case Service::Type::BLOCK: return "block";
case Service::Type::EVENT: return "event";
case Service::Type::CAPTURE: return "capture";
case Service::Type::FILE_SYSTEM: return "file_system";
case Service::Type::NIC: return "nic";
case Service::Type::GUI: return "gui";
@ -58,6 +60,8 @@ struct Sculpt::Route : List_model<Route>::Element
case Service::Type::AUDIO_IN: return "Audio input";
case Service::Type::AUDIO_OUT: return "Audio output";
case Service::Type::BLOCK: return "Block device";
case Service::Type::EVENT: return "Event";
case Service::Type::CAPTURE: return "Capture";
case Service::Type::FILE_SYSTEM: return "File system";
case Service::Type::NIC: return "Network";
case Service::Type::GUI: return "GUI";

View File

@ -74,7 +74,9 @@ class Sculpt::Runtime_config
|| (service == "IO_MEM")
|| (service == "Rtc")
|| (service == "IRQ")
|| (service == "TRACE");
|| (service == "TRACE")
|| (service == "Event")
|| (service == "Capture");
if (hardware) {
result = "hardware";
return;
@ -327,6 +329,10 @@ class Sculpt::Runtime_config
_backdrop { _r, Type::GUI, "desktop background", "backdrop" },
_lockscreen{ _r, Type::GUI, "desktop lock screen", "lock_screen" },
_nitpicker { _r, Type::GUI, "system GUI server" },
_lz_event { _r, Type::EVENT, "management GUI events", "leitzentrale" },
_event { _r, Type::EVENT, "system input events", "global" },
_lz_capture{ _r, Type::CAPTURE, "management GUI", "leitzentrale" },
_capture { _r, Type::CAPTURE, "system GUI", "global" },
_config_fs { _r, Type::FILE_SYSTEM, "writeable system configuration", "config" },
_report_fs { _r, Type::FILE_SYSTEM, "read-only system reports", "report" },
_capslock { _r, Type::ROM, "global capslock state", "capslock" },

View File

@ -25,9 +25,9 @@ struct Sculpt::Service
typedef String<32> Info;
enum class Type {
AUDIO_IN, AUDIO_OUT, BLOCK, FILE_SYSTEM, NIC, GUI,
RM, IO_MEM, IO_PORT, IRQ, REPORT, ROM, TERMINAL, TRACE,
USB, RTC, PLATFORM, VM, PD, UNDEFINED };
AUDIO_IN, AUDIO_OUT, BLOCK, EVENT, CAPTURE, FILE_SYSTEM, NIC, GUI,
RM, IO_MEM, IO_PORT, IRQ, REPORT, ROM, TERMINAL, TRACE, USB, RTC,
PLATFORM, VM, PD, UNDEFINED };
enum class Match_label { EXACT, LAST };
@ -46,6 +46,8 @@ struct Sculpt::Service
case Type::AUDIO_IN: return "Audio_in";
case Type::AUDIO_OUT: return "Audio_out";
case Type::BLOCK: return "Block";
case Type::EVENT: return "Event";
case Type::CAPTURE: return "Capture";
case Type::FILE_SYSTEM: return "File_system";
case Type::NIC: return "Nic";
case Type::GUI: return "Gui";