genode/repos/gems/run/menu_view.run
Norman Feske 550dea7279 menu_view: support multiple dialogs
This patch equips the menu-view component with the ability to present
more than one dialog at a time. The dialogs must be declared in the
<config> node as follows.

  <config>
    ...
    <dialog name="settings"/>
  </config

For each dialog, menu view requests a dedicated ROM session labeled after
the dialog name. The corresponding GUI session is also labeled as such.
Note that only one hover report is generated responding to all dialogs.
The hover report can be correlated with the hovered dialog by inspecting
the the 'name' attribute of the hover report's <dialog> sub node.

The former global config attributes 'xpos', 'ypos', 'width', 'height',
'opaque', and 'background' have become attributes of the <dialog> node.

Fixes #5170
2024-04-12 15:08:00 +02:00

355 lines
11 KiB
Plaintext

create_boot_directory
import_from_depot [depot_user]/src/[base_src] \
[depot_user]/pkg/[drivers_interactive_pkg] \
[depot_user]/pkg/fonts_fs \
[depot_user]/src/init \
[depot_user]/src/dynamic_rom \
[depot_user]/src/report_rom \
[depot_user]/src/nitpicker \
[depot_user]/src/libc \
[depot_user]/src/libpng \
[depot_user]/src/zlib
install_config {
<config>
<parent-provides>
<service name="PD"/>
<service name="CPU"/>
<service name="ROM"/>
<service name="RM"/>
<service name="LOG"/>
<service name="IRQ"/>
<service name="IO_MEM"/>
<service name="IO_PORT"/>
</parent-provides>
<default caps="100"/>
<default-route>
<any-service> <parent/> <any-child/> </any-service>
</default-route>
<start name="timer">
<resource name="RAM" quantum="1M"/>
<provides><service name="Timer"/></provides>
</start>
<start name="drivers" caps="1500" managing_system="yes">
<resource name="RAM" quantum="64M"/>
<binary name="init"/>
<route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service>
<service name="Timer"> <child name="timer"/> </service>
<service name="Capture"> <child name="nitpicker"/> </service>
<service name="Event"> <child name="nitpicker"/> </service>
<any-service> <parent/> </any-service>
</route>
</start>
<start name="nitpicker">
<resource name="RAM" quantum="4M"/>
<provides>
<service name="Gui"/> <service name="Capture"/> <service name="Event"/>
</provides>
<config>
<capture/> <event/>
<background color="#123456"/>
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
<domain name="default" layer="3" content="client" label="no" hover="always" />
<policy label_prefix="pointer" domain="pointer"/>
<default-policy domain="default"/>
</config>
</start>
<start name="pointer">
<resource name="RAM" quantum="1M"/>
<route>
<service name="Gui"> <child name="nitpicker" /> </service>
<any-service> <parent/> <any-child/> </any-service>
</route>
</start>
<start name="fonts_fs_config_rom">
<resource name="RAM" quantum="4M"/>
<binary name="dynamic_rom"/>
<provides> <service name="ROM"/> </provides>
<config verbose="yes">
<rom name="config">
<inline description="small">
<config>
<vfs>
<rom name="Vera.ttf"/>
<rom name="VeraMono.ttf"/>
<dir name="fonts">
<dir name="title">
<ttf name="regular" path="/Vera.ttf" size_px="18" cache="256K"/>
</dir>
<dir name="text">
<ttf name="regular" path="/Vera.ttf" size_px="14" cache="256K"/>
</dir>
<dir name="annotation">
<ttf name="regular" path="/Vera.ttf" size_px="11" cache="256K"/>
</dir>
<dir name="monospace">
<ttf name="regular" path="/VeraMono.ttf" size_px="14" cache="256K"/>
</dir>
</dir>
</vfs>
<default-policy root="/fonts" />
</config>
</inline>
<sleep milliseconds="1000" />
<inline description="big">
<config>
<vfs>
<rom name="Vera.ttf"/>
<rom name="VeraMono.ttf"/>
<dir name="fonts">
<dir name="title">
<ttf name="regular" path="/Vera.ttf" size_px="28" cache="256K"/>
</dir>
<dir name="text">
<ttf name="regular" path="/Vera.ttf" size_px="24" cache="256K"/>
</dir>
<dir name="annotation">
<ttf name="regular" path="/Vera.ttf" size_px="21" cache="256K"/>
</dir>
<dir name="monospace">
<ttf name="regular" path="/VeraMono.ttf" size_px="24" cache="256K"/>
</dir>
</dir>
</vfs>
<default-policy root="/fonts" />
</config>
</inline>
<sleep milliseconds="1000" />
</rom>
</config>
</start>
<start name="dynamic_rom">
<resource name="RAM" quantum="4M"/>
<provides> <service name="ROM"/> </provides>
<config verbose="yes">
<rom name="dialog">
<inline description="dependency graph">
<dialog>
<depgraph>
<frame name="storage"> <label text="Storage"/> </frame>
<frame name="gui"> <label text="GUI"/> </frame>
<frame name="usbdev"> <label text="USB Devices"/> </frame>
<button name="s.ahci1" dep="storage"> <label text="ahci1"/> </button>
<button name="s.usb1" dep="storage"> <label text="usb1"/> </button>
<button name="s.usb2" dep="storage"> <label text="usb2"/> </button>
<button name="s.usb3" dep="storage"> <label text="usb3"/> </button>
<frame name="s.usb2.part" dep="s.usb2"> <label text="Partition"/> </frame>
<button name="s.usb2.1" dep="s.usb2.part"> <label text="1"/> </button>
<frame name="s.usb2.1.ext2fs" dep="s.usb2.1"> <label text="Ext2 FS"/> </frame>
<button name="s.usb2.2" dep="s.usb2.part"> <label text="2"/> </button>
<frame name="s.usb2.1.ext2fs.subfs" dep="s.usb2.1.ext2fs"> <label text="Sub FS"/> </frame>
<button name="g.pointer" dep="gui"> <label text="pointer"/> </button>
<button name="g.overlay" dep="gui"> <label text="overlay"/> </button>
<button name="g.primary" dep="gui"> <label text="primary"/> </button>
<button name="g.background" dep="gui"> <label text="background"/> </button>
<button name="g.pointer.new" dep="g.pointer"> <label text="+"/> </button>
<button name="g.overlay.new" dep="g.overlay"> <label text="+"/> </button>
<button name="g.background.new" dep="g.background"> <label text="+"/> </button>
<button name="u.1-2" dep="usbdev"> <label text="1-2"/> </button>
<button name="u.1-3" dep="usbdev"> <label text="1-3"/> </button>
<frame name="vbox" dep="s.usb2.1.ext2fs.subfs">
<label text="VBox5"/>
</frame>
<dep node="vbox" on="g.primary"/>
<dep node="vbox" on="s.ahci1"/>
<dep node="vbox" on="u.1-3"/>
<frame name="fs_view" dep="s.usb2.1.ext2fs.subfs">
<label text="FS View"/>
</frame>
<dep node="fs_view" from="g.primary"/>
</depgraph>
</dialog>
</inline>
<sleep milliseconds="3000" />
<inline description="dependency graph">
<dialog>
<depgraph>
<frame name="storage"> <label text="Storage"/> </frame>
<frame name="gui"> <label text="GUI"/> </frame>
<frame name="usbdev"> <label text="USB"/> </frame>
<button name="s.ahci1" dep="storage"> <label text="ahci1"/> </button>
<button name="s.usb1" dep="storage"> <label text="usb1"/> </button>
<button name="s.usb2" dep="storage"> <label text="usb2"/> </button>
<button name="s.usb3" dep="storage"> <label text="usb3"/> </button>
<frame name="s.usb2.part" dep="s.usb2"> <label text="Partition"/> </frame>
<button name="s.usb2.2" dep="s.usb2.part"> <label text="2"/> </button>
<button name="g.pointer" dep="gui"> <label text="pointer"/> </button>
<button name="g.overlay" dep="gui"> <label text="overlay"/> </button>
<button name="g.primary" dep="gui"> <label text="primary"/> </button>
<button name="g.background" dep="gui"> <label text="background"/> </button>
<button name="u.1-2" dep="usbdev"> <label text="1-2"/> </button>
<button name="u.1-3" dep="usbdev"> <label text="1-3"/> </button>
</depgraph>
</dialog>
</inline>
<sleep milliseconds="3000" />
<inline description="example menu">
<dialog>
<frame>
<hbox>
<vbox name="x">
<button name="virtualbox">
<label text="VirtualBox"/>
</button>
<button name="toolchain" hovered="yes">
<label text="Tool chain"
font="monospace/regular"/>
</button>
<button name="log" hovered="yes" selected="yes">
<label text="Log window"
font="title/regular"/>
</button>
<button name="config" selected="yes">
<label text="Configuration Configuration Configuration"
font="annotation/regular"/>
</button>
<hbox>
<button name="x1"> <label text="x1"/> </button>
<button name="x2"> <label text="x2"/> </button>
<button name="x3"> <label text="x3"/> </button>
</hbox>
<frame>
<label text="A single line" font="annotation/regular"/>
</frame>
</vbox>
<float north="yes">
<vbox>
<button name="virtualbox">
<label text="VirtualBox"/>
</button>
<button name="toolchain" hovered="yes">
<label text="Tool chain"
font="monospace/regular"/>
</button>
</vbox>
</float>
</hbox>
</frame>
</dialog>
</inline>
<sleep milliseconds="3000" />
<inline description="example menu">
<dialog>
<frame>
<vbox>
<button name="virtualbox" hovered="yes">
<label text="VirtualBox"/>
</button>
<button name="config" selected="yes" hovered="yes">
<label text="Configuration"/>
</button>
</vbox>
</frame>
</dialog>
</inline>
<sleep milliseconds="3000" />
</rom>
</config>
</start>
<start name="report_rom">
<resource name="RAM" quantum="1M"/>
<provides> <service name="Report"/> <service name="ROM"/> </provides>
<config verbose="yes"/>
</start>
<start name="fonts_fs" caps="300">
<resource name="RAM" quantum="8M"/>
<binary name="vfs"/>
<route>
<service name="ROM" label="config"> <child name="fonts_fs_config_rom"/> </service>
<any-service> <parent/> </any-service>
</route>
<provides> <service name="File_system"/> </provides>
</start>
<start name="menu_view" caps="200">
<resource name="RAM" quantum="8M"/>
<config>
<report hover="yes"/>
<libc stderr="/dev/log"/>
<vfs>
<tar name="menu_view_styles.tar" />
<dir name="dev"> <log/> </dir>
<dir name="fonts"> <fs label="fonts"/> </dir>
</vfs>
<dialog name="dialog" xpos="200" ypos="150"/>
<dialog name="fixed_dialog" xpos="400" ypos="50" width="400"/>
</config>
<route>
<service name="ROM" label="dialog"> <child name="dynamic_rom" /> </service>
<service name="Report" label="hover"> <child name="report_rom"/> </service>
<service name="File_system" label="fonts"> <child name="fonts_fs"/> </service>
<any-service> <parent/> <any-child/> </any-service>
</route>
</start>
</config>}
build { app/menu_view }
set fd [open [run_dir]/genode/fixed_dialog w]
puts $fd {
<dialog>
<frame>
<vbox>
<button name="perf" hovered="yes">
<label text="Performance"/>
</button>
<button name="battery" selected="yes" hovered="yes">
<label text="Battery"/>
</button>
</vbox>
</frame>
</dialog>
}
close $fd
build_boot_image [build_artifacts]
run_genode_until forever