sculpt: split window manager into multiple pkgs

This commit moves the window layouter and window decorator into
dedicated packages that can now be combined with the "wm" server at
runtime and restarted/reconfigured/swapped-out independently.

To use the window manager, one must start the 'wm', 'window_layouter',
and one of the 'motif_decorator' or 'themed_decorator' subsystems.

Fixes #3024
This commit is contained in:
Norman Feske 2018-11-16 15:41:58 +01:00 committed by Christian Helmuth
parent eab7f54139
commit c6fd0055b1
34 changed files with 359 additions and 59 deletions

View File

@ -0,0 +1,3 @@
Motif-inspired window decorator

View File

@ -0,0 +1 @@
_/src/decorator

View File

@ -0,0 +1 @@
2018-11-14 d6ad522370b694b39ef1d6100108619504987461

View File

@ -0,0 +1,14 @@
<runtime ram="8M" caps="400" binary="decorator">
<requires> <nitpicker/> <timer/> </requires>
<config>
<controls> <maximizer/> <title/> </controls>
</config>
<content>
<rom label="ld.lib.so"/>
<rom label="decorator"/>
</content>
</runtime>

View File

@ -1,4 +1,4 @@
_/raw/wm
_/raw/motif_wm
_/src/wm
_/src/report_rom
_/src/decorator

View File

@ -7,7 +7,10 @@ _/pkg/rom_filter
_/pkg/rom_reporter
_/pkg/nic_router-nat
_/pkg/vbox5-nova-sculpt
_/pkg/themed_wm
_/pkg/wm
_/pkg/themed_decorator
_/pkg/motif_decorator
_/pkg/window_layouter
_/pkg/sticks_blue_backdrop
_/pkg/nano3d
_/pkg/fonts_fs

View File

@ -156,9 +156,13 @@ relationships. On the right, diagnostic messages are presented.
# Try adding additional components by selecting items in the "+" context
menu of the runtime view. Most components expect the presence of a
window manager. Hence, you should first select "wm". Please pay attention
to diagnostic messages given in the runtime dialog on the left. Whenever
a component depends on another one, a corresponding message appears.
window manager. Hence, you should first select the "wm", "window_layouter",
and "motif_decorator" components to make the window-management functionality
available. The distinct roles of the three components are described below.
Please pay attention to diagnostic messages given in the runtime dialog on
the left. Whenever a component depends on another one, a corresponding
message appears.
# You may click on any component in the runtime view to reveal additional
information such as its memory usage. For components that you started
@ -175,8 +179,20 @@ The following example subsystems are available from the "+" menu:
is used by the graphical terminal of the noux subsystem and the 'top_view'
application.
:'wm': A window manager that displays clients in windows that can be arranged
with the mouse.
:'wm': A component that allows for the creation of windowed graphical
user interfaces. It must be combined with a window layouter and a window
decorator (see below).
:'window_layouter': A component that defines the behavior and layout policy
of the window manager's windows. By default, each application is hosted in a
floating window that can be moved, resized, and re-stacked with the mouse.
:'motif_decorator': A window decorator component that defines how window
decorations look. It is inspired by the simplistic look of traditional
Motif-based graphical user interfaces.
:'themed_decorator: A modern looking window layouter that can be used as
an alternative to the 'motif_decorator'.
:'backdrop': A wallpaper that adjusts itself to any screen size.

View File

@ -0,0 +1,3 @@
Window decorator

View File

@ -0,0 +1,5 @@
_/src/themed_decorator
_/src/libc
_/src/libpng
_/src/vfs
_/src/zlib

View File

@ -0,0 +1 @@
2018-11-14 d6ad522370b694b39ef1d6100108619504987461

View File

@ -0,0 +1,21 @@
<runtime ram="8M" caps="400" binary="themed_decorator">
<requires> <nitpicker/> <timer/> </requires>
<config>
<libc/>
<vfs> <tar name="plain_decorator_theme.tar"/> </vfs>
</config>
<content>
<rom label="ld.lib.so"/>
<rom label="libc.lib.so"/>
<rom label="libm.lib.so"/>
<rom label="libpng.lib.so"/>
<rom label="vfs.lib.so"/>
<rom label="zlib.lib.so"/>
<rom label="themed_decorator"/>
<rom label="plain_decorator_theme.tar"/>
</content>
</runtime>

View File

@ -0,0 +1,3 @@
Default window layouter

View File

@ -0,0 +1,2 @@
_/raw/window_layouter
_/src/window_layouter

View File

@ -0,0 +1 @@
2018-11-14 d6ad522370b694b39ef1d6100108619504987461

View File

@ -0,0 +1,11 @@
<runtime ram="4M" caps="200" binary="window_layouter" config="window_layouter.config">
<requires> <nitpicker/> <timer/> </requires>
<content>
<rom label="ld.lib.so"/>
<rom label="window_layouter"/>
<rom label="window_layouter.config"/>
</content>
</runtime>

View File

@ -0,0 +1,19 @@
Window manager
This package provides the central part of Genode's componentized GUI stack
via a custom implementation of the nitpicker session interface.
It must be complemented by a window layouter and a window decorator, each of
which is a separate client component. Whereas the window decorator defines how
windows look, the window layouter defines how they behave.
The window manager, decorator, and layouter propagate their respective state
(like the window layout or the decoration margins) via reports and ROMs. The
window-manager package manages the flow of information between those parties
by providing a report and ROM service to the external layouter and decorator.
The special roles of the layouter and decorator among the window-manager
clients are identified according to their names (labels), which are suffixed
with "layouter" and "decorator" respectively. All other clients are expected
to be regular windowed applications.

View File

@ -0,0 +1,4 @@
_/raw/wm
_/src/wm
_/src/report_rom
_/src/init

View File

@ -0,0 +1 @@
2018-11-14 d6ad522370b694b39ef1d6100108619504987461

View File

@ -0,0 +1,15 @@
<runtime ram="16M" caps="500" binary="init" config="wm.config">
<requires> <nitpicker/> <timer/> </requires>
<provides> <nitpicker/> <rom/> <report/> </provides>
<content>
<rom label="ld.lib.so"/>
<rom label="report_rom"/>
<rom label="wm"/>
<rom label="init"/>
<rom label="wm.config"/>
</content>
</runtime>

View File

@ -0,0 +1,4 @@
content: wm.config decorator_init.config layouter.config
wm.config decorator_init.config layouter.config:
cp $(REP_DIR)/recipes/raw/motif_wm/$@ $@

View File

@ -0,0 +1 @@
2018-11-14 fac14f087bce046d503af93da5d0a4bba32e6ec1

View File

@ -0,0 +1,93 @@
<config>
<parent-provides>
<service name="ROM"/>
<service name="PD"/>
<service name="CPU"/>
<service name="LOG"/>
<service name="Nitpicker"/>
<service name="Timer"/>
</parent-provides>
<default-route>
<any-service> <parent/> <any-child/> </any-service>
</default-route>
<default caps="100"/>
<service name="Nitpicker">
<default-policy> <child name="wm"/> </default-policy>
</service>
<start name="report_rom">
<resource name="RAM" quantum="4M"/>
<provides>
<service name="Report"/>
<service name="ROM"/>
</provides>
<config>
<policy label="layouter -> window_list" report="wm -> window_list"/>
<policy label="layouter -> focus_request" report="wm -> focus_request"/>
<policy label="layouter -> rules" report="layouter -> rules"/>
<policy label="decorator -> window_layout" report="layouter -> window_layout"/>
<policy label="wm -> resize_request" report="layouter -> resize_request"/>
<policy label="decorator -> pointer" report="wm -> pointer"/>
<policy label="layouter -> hover" report="decorator -> hover"/>
<policy label="layouter -> decorator_margins" report="decorator -> decorator_margins"/>
<policy label="wm -> focus" report="layouter -> focus"/>
</config>
</start>
<start name="wm" caps="250">
<resource name="RAM" quantum="6M"/>
<provides>
<service name="Nitpicker"/>
</provides>
<config>
<policy label_prefix="decorator" role="decorator"/>
<policy label_prefix="layouter" role="layouter"/>
</config>
<route>
<service name="ROM" label="resize_request"> <child name="report_rom"/> </service>
<service name="ROM" label="focus"> <child name="report_rom"/> </service>
<service name="Report"> <child name="report_rom"/> </service>
<any-service>
<child name="nitpicker"/> <parent/> <any-child/>
</any-service>
</route>
</start>
<start name="layouter">
<binary name="window_layouter"/>
<resource name="RAM" quantum="4M"/>
<route>
<service name="ROM" label="config"> <parent label="layouter.config"/> </service>
<service name="ROM" label="window_list"> <child name="report_rom"/> </service>
<service name="ROM" label="focus_request"> <child name="report_rom"/> </service>
<service name="ROM" label="hover"> <child name="report_rom"/> </service>
<service name="ROM" label="decorator_margins"> <child name="report_rom"/> </service>
<service name="ROM" label="rules"> <child name="report_rom"/> </service>
<service name="Report"> <child name="report_rom"/> </service>
<any-service>
<child name="wm"/> <parent/> <any-child/>
</any-service>
</route>
</start>
<start name="decorator" caps="350">
<binary name="init"/>
<resource name="RAM" quantum="12M"/>
<route>
<service name="ROM" label="config">
<parent label="decorator_init.config"/> </service>
<service name="ROM" label="window_layout"> <child name="report_rom"/> </service>
<service name="ROM" label="pointer"> <child name="report_rom"/> </service>
<service name="Report" label="decorator_margins"> <child name="report_rom"/> </service>
<service name="Report" label="hover"> <child name="report_rom"/> </service>
<any-service>
<child name="wm"/> <parent/> <any-child/>
</any-service>
</route>
</start>
</config>

View File

@ -0,0 +1,4 @@
content: window_layouter.config
window_layouter.config:
cp $(REP_DIR)/recipes/raw/window_layouter/$@ $@

View File

@ -0,0 +1 @@
2018-11-14 fac14f087bce046d503af93da5d0a4bba32e6ec1

View File

@ -0,0 +1,25 @@
<config rules="rom">
<report rules="yes"/>
<rules>
<screen name="screen"/>
<assign label_prefix="" target="screen" xpos="any" ypos="any"/>
</rules>
<press key="KEY_SCREEN">
<press key="KEY_TAB" action="next_window">
<release key="KEY_TAB">
<release key="KEY_SCREEN" action="raise_window"/>
</release>
<release key="KEY_SCREEN" action="raise_window"/>
</press>
<press key="KEY_LEFTSHIFT">
<press key="KEY_TAB" action="prev_window">
<release key="KEY_TAB">
<release key="KEY_SCREEN" action="raise_window"/>
</release>
</press>
</press>
<press key="KEY_ENTER" action="toggle_fullscreen"/>
</press>
</config>

View File

@ -1,4 +1,4 @@
content: wm.config decorator_init.config layouter.config
content: wm.config
wm.config decorator_init.config layouter.config:
wm.config:
cp $(REP_DIR)/recipes/raw/wm/$@ $@

View File

@ -18,6 +18,38 @@
<default-policy> <child name="wm"/> </default-policy>
</service>
<service name="ROM">
<policy label_suffix="layouter -> window_list">
<child name="report_rom" label="layouter -> window_list"/> </policy>
<policy label_suffix="layouter -> focus_request">
<child name="report_rom" label="layouter -> focus_request"/> </policy>
<policy label_suffix="layouter -> hover">
<child name="report_rom" label="layouter -> hover"/> </policy>
<policy label_suffix="layouter -> decorator_margins">
<child name="report_rom" label="layouter -> decorator_margins"/> </policy>
<policy label_suffix="layouter -> rules">
<child name="report_rom" label="layouter -> rules"/> </policy>
<policy label_suffix="decorator -> window_layout">
<child name="report_rom" label="decorator -> window_layout"/> </policy>
<policy label_suffix="decorator -> pointer">
<child name="report_rom" label="decorator -> pointer"/> </policy>
</service>
<service name="Report">
<policy label_suffix="layouter -> window_layout">
<child name="report_rom" label="layouter -> window_layout"/> </policy>
<policy label_suffix="layouter -> resize_request">
<child name="report_rom" label="layouter -> resize_request"/> </policy>
<policy label_suffix="layouter -> focus">
<child name="report_rom" label="layouter -> focus"/> </policy>
<policy label_suffix="layouter -> rules">
<child name="report_rom" label="layouter -> rules"/> </policy>
<policy label_suffix="decorator -> hover">
<child name="report_rom" label="decorator -> hover"/> </policy>
<policy label_suffix="decorator -> decorator_margins">
<child name="report_rom" label="decorator -> decorator_margins"/> </policy>
</service>
<start name="report_rom">
<resource name="RAM" quantum="4M"/>
<provides>
@ -27,67 +59,30 @@
<config>
<policy label="layouter -> window_list" report="wm -> window_list"/>
<policy label="layouter -> focus_request" report="wm -> focus_request"/>
<policy label="layouter -> rules" report="layouter -> rules"/>
<policy label="decorator -> window_layout" report="layouter -> window_layout"/>
<policy label="wm -> resize_request" report="layouter -> resize_request"/>
<policy label="decorator -> pointer" report="wm -> pointer"/>
<policy label="layouter -> hover" report="decorator -> hover"/>
<policy label="layouter -> decorator_margins" report="decorator -> decorator_margins"/>
<policy label="layouter -> rules" report="layouter -> rules"/>
<policy label="decorator -> window_layout" report="layouter -> window_layout"/>
<policy label="decorator -> pointer" report="wm -> pointer"/>
<policy label="wm -> resize_request" report="layouter -> resize_request"/>
<policy label="wm -> focus" report="layouter -> focus"/>
</config>
</start>
<start name="wm" caps="250">
<resource name="RAM" quantum="6M"/>
<resource name="RAM" quantum="8M"/>
<provides>
<service name="Nitpicker"/>
</provides>
<config>
<policy label_prefix="decorator" role="decorator"/>
<policy label_prefix="layouter" role="layouter"/>
<policy label_suffix="decorator -> " role="decorator"/>
<policy label_suffix="layouter -> " role="layouter"/>
</config>
<route>
<service name="ROM" label="resize_request"> <child name="report_rom"/> </service>
<service name="ROM" label="focus"> <child name="report_rom"/> </service>
<service name="Report"> <child name="report_rom"/> </service>
<any-service>
<child name="nitpicker"/> <parent/> <any-child/>
</any-service>
</route>
</start>
<start name="layouter">
<binary name="window_layouter"/>
<resource name="RAM" quantum="4M"/>
<route>
<service name="ROM" label="config"> <parent label="layouter.config"/> </service>
<service name="ROM" label="window_list"> <child name="report_rom"/> </service>
<service name="ROM" label="focus_request"> <child name="report_rom"/> </service>
<service name="ROM" label="hover"> <child name="report_rom"/> </service>
<service name="ROM" label="decorator_margins"> <child name="report_rom"/> </service>
<service name="ROM" label="rules"> <child name="report_rom"/> </service>
<service name="Report"> <child name="report_rom"/> </service>
<any-service>
<child name="wm"/> <parent/> <any-child/>
</any-service>
</route>
</start>
<start name="decorator" caps="350">
<binary name="init"/>
<resource name="RAM" quantum="12M"/>
<route>
<service name="ROM" label="config">
<parent label="decorator_init.config"/> </service>
<service name="ROM" label="window_layout"> <child name="report_rom"/> </service>
<service name="ROM" label="pointer"> <child name="report_rom"/> </service>
<service name="Report" label="decorator_margins"> <child name="report_rom"/> </service>
<service name="Report" label="hover"> <child name="report_rom"/> </service>
<any-service>
<child name="wm"/> <parent/> <any-child/>
</any-service>
<any-service> <parent/> </any-service>
</route>
</start>
</config>

View File

@ -16,7 +16,11 @@ import_from_depot [depot_user]/src/[base_src] \
create_tar_from_depot_binaries [run_dir]/genode/depot.tar \
[depot_user]/pkg/sculpt-installation \
[depot_user]/pkg/themed_wm \
[depot_user]/pkg/wm \
[depot_user]/pkg/nano3d \
[depot_user]/pkg/window_layouter \
[depot_user]/pkg/motif_decorator \
[depot_user]/pkg/themed_decorator \
[depot_user]/pkg/sticks_blue_backdrop
proc current_pkg { pkg } { return $pkg/[_current_depot_archive_version pkg $pkg] }
@ -151,12 +155,34 @@ install_config {
<service name="Timer"> <parent/> </service>
</common_routes>
<start name="wm" pkg="} [depot_user]/pkg/[current_pkg themed_wm] {">
<start name="wm" pkg="} [depot_user]/pkg/[current_pkg wm] {">
<route>
<service name="Nitpicker"> <parent/> </service>
</route>
</start>
<start name="window_layouter" pkg="} [depot_user]/pkg/[current_pkg window_layouter] {">
<route>
<service name="ROM" label="window_list"> <child name="wm"/> </service>
<service name="ROM" label="focus_request"> <child name="wm"/> </service>
<service name="ROM" label="hover"> <child name="wm"/> </service>
<service name="ROM" label="decorator_margins"> <child name="wm"/> </service>
<service name="ROM" label="rules"> <child name="wm"/> </service>
<service name="Report"> <child name="wm"/> </service>
<service name="Nitpicker"> <child name="wm"/> </service>
</route>
</start>
<start name="themed_decorator" pkg="} [depot_user]/pkg/[current_pkg themed_decorator] {">
<route>
<service name="ROM" label="window_layout"> <child name="wm"/> </service>
<service name="ROM" label="pointer"> <child name="wm"/> </service>
<service name="Report"> <child name="wm"/> </service>
<service name="Nitpicker"> <child name="wm"/> </service>
</route>
</start>
<start name="backdrop" pkg="} [depot_user]/pkg/[current_pkg sticks_blue_backdrop] {">
<route>
<service name="Nitpicker"> <parent label="backdrop"/> </service>
@ -171,15 +197,14 @@ install_config {
</start>
-->
<!--
<start name="nano3d" pkg="} [depot_user]/pkg/[current_pkg nano3d] {">
<route>
<service name="Nitpicker"> <child name="wm"/> </service>
</route>
<config shape="cube"/>
</start>
-->
<!--
<start name="fonts_fs" pkg="} [depot_user]/pkg/[current_pkg fonts_fs] {">
<route>
<service name="ROM" label="config"> <parent label="fonts.config"/> </service>
@ -193,6 +218,7 @@ install_config {
<service name="File_system"> <parent/> </service>
</route>
</start>
-->
<!-- vbox, nic_router, acpica -->

View File

@ -0,0 +1,8 @@
<launcher pkg="motif_decorator">
<route>
<service name="ROM" label="window_layout"> <child name="wm"/> </service>
<service name="ROM" label="pointer"> <child name="wm"/> </service>
<service name="Report"> <child name="wm"/> </service>
<service name="Nitpicker"> <child name="wm"/> </service>
</route>
</launcher>

View File

@ -0,0 +1,8 @@
<launcher pkg="themed_decorator">
<route>
<service name="ROM" label="window_layout"> <child name="wm"/> </service>
<service name="ROM" label="pointer"> <child name="wm"/> </service>
<service name="Report"> <child name="wm"/> </service>
<service name="Nitpicker"> <child name="wm"/> </service>
</route>
</launcher>

View File

@ -0,0 +1,11 @@
<launcher pkg="window_layouter">
<route>
<service name="ROM" label="window_list"> <child name="wm"/> </service>
<service name="ROM" label="focus_request"> <child name="wm"/> </service>
<service name="ROM" label="hover"> <child name="wm"/> </service>
<service name="ROM" label="decorator_margins"> <child name="wm"/> </service>
<service name="ROM" label="rules"> <child name="wm"/> </service>
<service name="Report"> <child name="wm"/> </service>
<service name="Nitpicker"> <child name="wm"/> </service>
</route>
</launcher>

View File

@ -1,4 +1,4 @@
<launcher pkg="themed_wm">
<launcher pkg="wm">
<route>
<service name="Nitpicker" label="wm -> "> <parent label="focus"/> </service>
<service name="Nitpicker"> <parent/> </service>