source ${genode_dir}/repos/libports/run/qt5_drivers.inc

set feature(Input) 1
set feature(Framebuffer) 1
set feature(Timer) 1

#
# Build
#

proc qt5_build_components { feature_arg } {

	upvar $feature_arg feature

	set build_components {
		core
		init
	}

	append build_components [drivers_build_components feature]

	append build_components {
		server/nitpicker
		server/report_rom
		app/floating_window_layouter
		app/decorator
		app/pointer
		server/wm
	}

	return $build_components
}


#
# Configuration
#

proc qt5_parent_provides { feature_arg } {

	upvar $feature_arg feature

	set parent_provides [drivers_parent_provides feature]

	return $parent_provides
}

proc qt5_start_nodes { feature_arg } {

	upvar $feature_arg feature

	set start_nodes [drivers_start_nodes feature]

	append start_nodes {
		<start name="nitpicker">
			<resource name="RAM" quantum="2M"/>
			<provides><service name="Nitpicker"/></provides>
			<route> }
	append_if [use_fb_sdl feature] start_nodes { 
				<service name="Framebuffer"> <child name="fb_sdl" /> </service>
	}
	append_if [use_fb_drv feature] start_nodes {
				<service name="Framebuffer"> <child name="fb_drv" /> </service>
	}
	append start_nodes {
				<service name="Input">  <child name="input_filter"/> </service>
				<service name="Report"> <child name="report_rom"/> </service>
				<any-service> <parent /> <any-child /> </any-service>
			</route>
			<config>
				<report focus="yes"/>

				<domain name="pointer" layer="1" label="no" content="client" origin="pointer" />
				<domain name="default" layer="2" label="no" content="client" focus="click" 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="Nitpicker"> <child name="nitpicker"/> </service>
				<any-service> <parent/> <any-child/> </any-service>
			</route>
		</start>

		<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="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="wm -> focus"                   report="layouter -> focus"/>
				<policy label="clipboard -> focus"            report="nitpicker -> focus"/>
				<policy label="layouter -> decorator_margins" report="decorator -> decorator_margins"/>
			</config>
		</start>

		<start name="wm">
			<resource name="RAM" quantum="12M"/>
			<provides>
				<service name="Nitpicker"/>
			</provides>
			<config>
				<policy label_prefix="decorator" role="decorator"/>
				<policy label_prefix="layouter"  role="layouter"/>
			</config>
			<route>
				<service name="ROM" label="focus">          <child name="report_rom"/> </service>
				<service name="ROM" label="resize_request"> <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="floating_window_layouter"/>
			<resource name="RAM" quantum="4M"/>
			<route>
				<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="Report">                        <child name="report_rom"/> </service>
				<any-service>
					<child name="wm"/> <parent/> <any-child/>
				</any-service>
			</route>
		</start>

		<start name="decorator">
			<binary name="decorator"/>
			<resource name="RAM" quantum="12M"/>
			<route>
				<service name="ROM" label="window_layout"> <child name="report_rom"/> </service>
				<service name="ROM" label="pointer">       <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>
	}

	return $start_nodes
}

#
# Boot modules
#

proc qt5_boot_modules { feature_arg } {

	upvar $feature_arg feature

	set boot_modules {
		core
		init
	}

	append boot_modules [drivers_boot_modules feature]

	append boot_modules {
		nitpicker
		report_rom
		floating_window_layouter
		decorator
		wm
		pointer
	}

	return $boot_modules
}


#
# tar archive
#

proc create_qt5_fs_tar_archive { app_name qt_modules } {

	exec rm -rf bin/qt5_fs/${app_name}/qt

	if { [lsearch ${qt_modules} "gui"] != -1 } {
		# add fonts
		exec mkdir -p bin/qt5_fs/${app_name}/qt/lib
		exec ln -sf [pwd]/bin/qt5_fs/qt/lib/fonts bin/qt5_fs/${app_name}/qt/lib/fonts
	}

	if { [lsearch ${qt_modules} "quick"] != -1 } {
		# add QtQuick plugins
		exec mkdir -p bin/qt5_fs/${app_name}/qt
		exec ln -sf [pwd]/bin/qt5_fs/qt/qml bin/qt5_fs/${app_name}/qt/qml
	}

	exec tar chf bin/qt5_fs_${app_name}.tar -C bin/qt5_fs/${app_name} .
}