committed by
Norman Feske
parent
7ea7cb2bd2
commit
69612da4ba
@@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2012-2017 Genode Labs GmbH
|
||||
* Copyright (C) 2012-2019 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
@@ -29,9 +29,9 @@
|
||||
#include <os/slave.h>
|
||||
|
||||
/* local includes */
|
||||
#include "framebuffer_service_factory.h"
|
||||
#include "nitpicker_session_component.h"
|
||||
|
||||
typedef Genode::Local_service<Input::Session_component> Input_service;
|
||||
typedef Genode::Local_service<Nitpicker::Session_component> Nitpicker_service;
|
||||
|
||||
class Avplay_slave : public QObject
|
||||
{
|
||||
@@ -39,20 +39,24 @@ class Avplay_slave : public QObject
|
||||
|
||||
private:
|
||||
|
||||
class Policy
|
||||
:
|
||||
private Genode::Static_parent_services<Genode::Cpu_session,
|
||||
Genode::Log_session,
|
||||
Genode::Pd_session,
|
||||
Genode::Rom_session,
|
||||
Timer::Session,
|
||||
Audio_out::Session>,
|
||||
public Genode::Slave::Policy
|
||||
struct Policy_base
|
||||
{
|
||||
Genode::Static_parent_services<Genode::Cpu_session,
|
||||
Genode::Log_session,
|
||||
Genode::Pd_session,
|
||||
Genode::Rom_session,
|
||||
Timer::Session,
|
||||
Audio_out::Session>
|
||||
_parent_services;
|
||||
|
||||
Policy_base(Genode::Env &env) : _parent_services(env) { }
|
||||
};
|
||||
|
||||
class Policy : Policy_base, public Genode::Slave::Policy
|
||||
{
|
||||
private:
|
||||
|
||||
Input_service &_input_service;
|
||||
Framebuffer_service_factory &_framebuffer_service_factory;
|
||||
Nitpicker_service &_nitpicker_service;
|
||||
|
||||
const char *_mediafile;
|
||||
int _sdl_audio_volume;
|
||||
@@ -111,40 +115,47 @@ class Avplay_slave : public QObject
|
||||
}
|
||||
|
||||
static Genode::Cap_quota _caps() { return { 150 }; }
|
||||
static Genode::Ram_quota _ram_quota() { return { 32*1024*1024 }; }
|
||||
static Genode::Ram_quota _ram_quota() { return { 64*1024*1024 }; }
|
||||
static Name _name() { return "avplay"; }
|
||||
|
||||
Genode::Service &_matching_service(Genode::Service::Name const &name)
|
||||
{
|
||||
if (name == "Nitpicker")
|
||||
return _nitpicker_service;
|
||||
|
||||
throw Genode::Service_denied();
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Policy(Genode::Rpc_entrypoint &entrypoint,
|
||||
Genode::Region_map &rm,
|
||||
Genode::Pd_session &ref_pd,
|
||||
Genode::Pd_session_capability ref_pd_cap,
|
||||
Input_service &input_service,
|
||||
Framebuffer_service_factory &framebuffer_service_factory,
|
||||
Policy(Genode::Env &env,
|
||||
Genode::Entrypoint &entrypoint,
|
||||
Nitpicker_service &nitpicker_service,
|
||||
char const *mediafile)
|
||||
:
|
||||
Genode::Slave::Policy(_name(), _name(), *this, entrypoint,
|
||||
rm, ref_pd, ref_pd_cap, _caps(),
|
||||
Policy_base(env),
|
||||
Genode::Slave::Policy(env, _name(), _name(),
|
||||
Policy_base::_parent_services,
|
||||
entrypoint.rpc_ep(), _caps(),
|
||||
_ram_quota()),
|
||||
_input_service(input_service),
|
||||
_framebuffer_service_factory(framebuffer_service_factory),
|
||||
_nitpicker_service(nitpicker_service),
|
||||
_mediafile(mediafile),
|
||||
_sdl_audio_volume(100)
|
||||
{
|
||||
configure(_config());
|
||||
}
|
||||
|
||||
Genode::Service &resolve_session_request(Genode::Service::Name const &service_name,
|
||||
Genode::Session_state::Args const &args) override
|
||||
Route resolve_session_request(Genode::Service::Name const &name,
|
||||
Genode::Session_label const &label) override
|
||||
{
|
||||
if (service_name == "Input")
|
||||
return _input_service;
|
||||
try {
|
||||
return Route { .service = _matching_service(name),
|
||||
.label = label,
|
||||
.diag = Genode::Session::Diag() };
|
||||
}
|
||||
catch (Genode::Service_denied) { }
|
||||
|
||||
if (service_name == "Framebuffer")
|
||||
return _framebuffer_service_factory.create(args);
|
||||
|
||||
return Genode::Slave::Policy::resolve_session_request(service_name, args);
|
||||
return Genode::Slave::Policy::resolve_session_request(name, label);
|
||||
}
|
||||
|
||||
void volume_changed(int value)
|
||||
@@ -155,27 +166,21 @@ class Avplay_slave : public QObject
|
||||
|
||||
};
|
||||
|
||||
Genode::size_t const _ep_stack_size = 4*1024*sizeof(Genode::addr_t);
|
||||
Genode::Rpc_entrypoint _ep;
|
||||
Policy _policy;
|
||||
Genode::Child _child;
|
||||
Policy _policy;
|
||||
Genode::Child _child;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
Avplay_slave(Genode::Region_map &rm,
|
||||
Genode::Pd_session &ref_pd,
|
||||
Genode::Pd_session_capability ref_pd_cap,
|
||||
Input_service &input_service,
|
||||
Framebuffer_service_factory &framebuffer_service_factory,
|
||||
Avplay_slave(Genode::Env &env,
|
||||
Genode::Entrypoint &ep,
|
||||
Nitpicker_service &nitpicker_service,
|
||||
char const *mediafile)
|
||||
:
|
||||
_ep(&ref_pd, _ep_stack_size, "avplay_ep"),
|
||||
_policy(_ep, rm, ref_pd, ref_pd_cap, input_service,
|
||||
framebuffer_service_factory, mediafile),
|
||||
_child(rm, _ep, _policy)
|
||||
_policy(env, ep, nitpicker_service, mediafile),
|
||||
_child(env.rm(), ep.rpc_ep(), _policy)
|
||||
{ }
|
||||
|
||||
public Q_SLOTS:
|
||||
|
||||
@@ -1,99 +0,0 @@
|
||||
/*
|
||||
* \brief Filter framebuffer policy
|
||||
* \author Christian Prochaska
|
||||
* \date 2012-04-11
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2012-2017 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
*/
|
||||
|
||||
#ifndef _FILTER_FRAMEBUFFER_SLAVE_H_
|
||||
#define _FILTER_FRAMEBUFFER_SLAVE_H_
|
||||
|
||||
/* Genode includes */
|
||||
#include <base/service.h>
|
||||
#include <os/static_parent_services.h>
|
||||
#include <os/slave.h>
|
||||
#include <timer_session/timer_session.h>
|
||||
|
||||
/* local includes */
|
||||
#include "framebuffer_service_factory.h"
|
||||
|
||||
|
||||
class Filter_framebuffer_slave
|
||||
{
|
||||
private:
|
||||
|
||||
class Policy
|
||||
:
|
||||
private Genode::Static_parent_services<Genode::Cpu_session,
|
||||
Genode::Log_session,
|
||||
Genode::Pd_session,
|
||||
Genode::Rom_session,
|
||||
Timer::Session>,
|
||||
public Genode::Slave::Policy
|
||||
{
|
||||
private:
|
||||
|
||||
Framebuffer_service_factory &_framebuffer_service_factory;
|
||||
|
||||
public:
|
||||
|
||||
Policy(Genode::Rpc_entrypoint &entrypoint,
|
||||
Genode::Region_map &rm,
|
||||
Genode::Pd_session &ref_pd,
|
||||
Genode::Pd_session_capability ref_pd_cap,
|
||||
Name const &name,
|
||||
size_t caps,
|
||||
size_t ram_quota,
|
||||
Framebuffer_service_factory &framebuffer_service_factory)
|
||||
:
|
||||
Genode::Slave::Policy(name, name, *this, entrypoint, rm,
|
||||
ref_pd, ref_pd_cap,
|
||||
Genode::Cap_quota{caps},
|
||||
Genode::Ram_quota{ram_quota}),
|
||||
_framebuffer_service_factory(framebuffer_service_factory)
|
||||
{ }
|
||||
|
||||
Genode::Service &resolve_session_request(Genode::Service::Name const &service_name,
|
||||
Genode::Session_state::Args const &args) override
|
||||
{
|
||||
if (service_name == "Framebuffer")
|
||||
return _framebuffer_service_factory.create(args);
|
||||
|
||||
return Genode::Slave::Policy::resolve_session_request(service_name, args);
|
||||
}
|
||||
};
|
||||
|
||||
Genode::size_t const _ep_stack_size = 2*1024*sizeof(Genode::addr_t);
|
||||
Genode::Rpc_entrypoint _ep;
|
||||
Policy _policy;
|
||||
Genode::Child _child;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
Filter_framebuffer_slave(Genode::Region_map &rm,
|
||||
Genode::Pd_session &ref_pd,
|
||||
Genode::Pd_session_capability ref_pd_cap,
|
||||
Genode::Slave::Policy::Name const &name,
|
||||
size_t caps,
|
||||
size_t ram_quota,
|
||||
Framebuffer_service_factory &framebuffer_service_factory)
|
||||
:
|
||||
_ep(&ref_pd, _ep_stack_size, "filter_framebuffer_ep"),
|
||||
_policy(_ep, rm, ref_pd, ref_pd_cap, name, caps, ram_quota,
|
||||
framebuffer_service_factory),
|
||||
_child(rm, _ep, _policy)
|
||||
{ }
|
||||
|
||||
Genode::Slave::Policy &policy() { return _policy; }
|
||||
};
|
||||
|
||||
#endif /* _FILTER_FRAMEBUFFER_SLAVE_H_ */
|
||||
@@ -1,141 +0,0 @@
|
||||
/*
|
||||
* \brief Framebuffer service factory
|
||||
* \author Christian Prochaska
|
||||
* \date 2016-11-24
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2016-2017 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
*/
|
||||
|
||||
#ifndef _FRAMEBUFFER_SERVICE_FACTORY_H_
|
||||
#define _FRAMEBUFFER_SERVICE_FACTORY_H_
|
||||
|
||||
/* Genode includes */
|
||||
#include <base/service.h>
|
||||
#include <os/slave.h>
|
||||
#include <framebuffer_session/connection.h>
|
||||
#include <os/single_session_service.h>
|
||||
#include <nitpicker_session/connection.h>
|
||||
|
||||
/* Qt includes */
|
||||
#include <qnitpickerplatformwindow.h>
|
||||
#include <qnitpickerviewwidget/qnitpickerviewwidget.h>
|
||||
|
||||
|
||||
struct Framebuffer_service_factory
|
||||
{
|
||||
virtual Genode::Service &create(Genode::Session_state::Args const &args) = 0;
|
||||
|
||||
typedef Genode::Single_session_service<Framebuffer::Session> Session_service;
|
||||
};
|
||||
|
||||
|
||||
class Nitpicker_framebuffer_service_factory : public Framebuffer_service_factory
|
||||
{
|
||||
private:
|
||||
|
||||
Nitpicker::Connection _nitpicker;
|
||||
|
||||
Session_service _service;
|
||||
|
||||
QNitpickerViewWidget &_nitpicker_view_widget;
|
||||
int _max_width;
|
||||
int _max_height;
|
||||
|
||||
int _limited_size(int requested_size, int max_size)
|
||||
{
|
||||
if (requested_size == 0)
|
||||
return max_size;
|
||||
else
|
||||
return (max_size > 0) ? Genode::min(requested_size, max_size) : requested_size;
|
||||
}
|
||||
|
||||
static inline long _session_arg(Genode::Session_state::Args const &args, const char *key)
|
||||
{
|
||||
return Genode::Arg_string::find_arg(args.string(), key).long_value(0);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Nitpicker_framebuffer_service_factory(Genode::Env &env,
|
||||
QNitpickerViewWidget &nitpicker_view_widget,
|
||||
int max_width = 0,
|
||||
int max_height = 0)
|
||||
: _nitpicker(env),
|
||||
_service(_nitpicker.framebuffer_session()),
|
||||
_nitpicker_view_widget(nitpicker_view_widget),
|
||||
_max_width(max_width), _max_height(max_height)
|
||||
{ }
|
||||
|
||||
Genode::Service &create(Genode::Session_state::Args const &args)
|
||||
{
|
||||
Framebuffer::Mode const
|
||||
mode(_limited_size(_session_arg(args, "fb_width"), _max_width),
|
||||
_limited_size(_session_arg(args, "fb_height"), _max_height),
|
||||
_nitpicker.mode().format());
|
||||
_nitpicker.buffer(mode, false);
|
||||
|
||||
QNitpickerPlatformWindow *platform_window =
|
||||
dynamic_cast<QNitpickerPlatformWindow*>(_nitpicker_view_widget
|
||||
.window()->windowHandle()->handle());
|
||||
|
||||
Nitpicker::Session::View_handle parent_view_handle =
|
||||
_nitpicker.view_handle(platform_window->view_cap());
|
||||
|
||||
Nitpicker::Session::View_handle nitpicker_view_handle =
|
||||
_nitpicker.create_view(parent_view_handle);
|
||||
|
||||
_nitpicker.release_view_handle(parent_view_handle);
|
||||
|
||||
Framebuffer::Session_client framebuffer(_nitpicker.framebuffer_session());
|
||||
|
||||
Framebuffer::Mode framebuffer_mode = framebuffer.mode();
|
||||
_nitpicker_view_widget.setNitpickerView(&_nitpicker,
|
||||
nitpicker_view_handle,
|
||||
0, 0,
|
||||
framebuffer_mode.width(),
|
||||
framebuffer_mode.height());
|
||||
return _service.service();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class Filter_framebuffer_service_factory : public Framebuffer_service_factory
|
||||
{
|
||||
private:
|
||||
|
||||
typedef Genode::Slave::Connection<Framebuffer::Connection> Framebuffer_connection;
|
||||
|
||||
Genode::Slave::Policy &_policy;
|
||||
|
||||
Framebuffer_connection *_slave_connection { nullptr };
|
||||
Session_service *_service { nullptr };
|
||||
|
||||
public:
|
||||
|
||||
Filter_framebuffer_service_factory(Genode::Slave::Policy &policy)
|
||||
: _policy(policy)
|
||||
{ }
|
||||
|
||||
~Filter_framebuffer_service_factory()
|
||||
{
|
||||
delete _service;
|
||||
delete _slave_connection;
|
||||
}
|
||||
|
||||
Genode::Service &create(Genode::Session_state::Args const &args)
|
||||
{
|
||||
_slave_connection = new Framebuffer_connection(_policy, args);
|
||||
|
||||
_service = new Session_service(*_slave_connection);
|
||||
|
||||
return _service->service();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif /* _FRAMEBUFFER_SERVICE_FACTORY_H_ */
|
||||
@@ -5,93 +5,43 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2012-2017 Genode Labs GmbH
|
||||
* Copyright (C) 2012-2019 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
*/
|
||||
|
||||
/* qt_avplay includes */
|
||||
#include "filter_framebuffer_slave.h"
|
||||
#include "main_window.h"
|
||||
|
||||
|
||||
using namespace Genode;
|
||||
|
||||
|
||||
struct Framebuffer_filter
|
||||
{
|
||||
enum { MAX_FILTER_NAME_SIZE = 32 };
|
||||
char name[MAX_FILTER_NAME_SIZE];
|
||||
size_t caps;
|
||||
Genode::Number_of_bytes ram_quota;
|
||||
Filter_framebuffer_slave *slave;
|
||||
};
|
||||
|
||||
|
||||
Main_window::Main_window(Genode::Env &env)
|
||||
:
|
||||
_env(env),
|
||||
_mediafile_name(env),
|
||||
_control_bar(_input_session_component)
|
||||
_control_bar(_nitpicker_session_component.input_component())
|
||||
{
|
||||
_input_session_component.event_queue().enabled(true);
|
||||
_ep.manage(&_input_session_component);
|
||||
|
||||
/* add widgets to layout */
|
||||
|
||||
_layout->addWidget(_avplay_widget);
|
||||
_layout->addWidget(_control_bar);
|
||||
|
||||
/*
|
||||
* The main window must be visible before avplay or a framebuffer filter
|
||||
* requests the framebuffer session which goes to Nitpicker, because the
|
||||
* parent view of the new Nitpicker view is part of the
|
||||
* QNitpickerPlatformWindow object, which is created when the main window
|
||||
* becomes visible.
|
||||
* The main window must be visible before avplay requests the Nitpicker
|
||||
* session, because the parent view of the new Nitpicker view is part of
|
||||
* the QNitpickerPlatformWindow object, which is created when the main
|
||||
* window becomes visible.
|
||||
*/
|
||||
|
||||
show();
|
||||
|
||||
/* find out which filtering framebuffer services to start and sort them in reverse order */
|
||||
|
||||
static QList<Framebuffer_filter*> framebuffer_filters;
|
||||
try {
|
||||
Genode::Attached_rom_dataspace config(_env, "config");
|
||||
Xml_node node = config.xml().sub_node("framebuffer_filter");
|
||||
for (; ; node = node.next("framebuffer_filter")) {
|
||||
Framebuffer_filter *framebuffer_filter = new Framebuffer_filter;
|
||||
node.attribute("name").value(framebuffer_filter->name, sizeof(framebuffer_filter->name));
|
||||
node.attribute("caps").value(&framebuffer_filter->caps);
|
||||
node.attribute("ram_quota").value(&framebuffer_filter->ram_quota);
|
||||
qDebug() << "filter:" << framebuffer_filter->name << "," << framebuffer_filter->ram_quota;
|
||||
framebuffer_filters.prepend(framebuffer_filter);
|
||||
}
|
||||
} catch (Xml_node::Nonexistent_sub_node) { }
|
||||
|
||||
Framebuffer_service_factory *framebuffer_service_factory =
|
||||
&_nitpicker_framebuffer_service_factory;
|
||||
|
||||
/* start the filtering framebuffer services */
|
||||
|
||||
Q_FOREACH(Framebuffer_filter *framebuffer_filter, framebuffer_filters) {
|
||||
framebuffer_filter->slave = new Filter_framebuffer_slave(_env.rm(),
|
||||
_env.pd(),
|
||||
_env.pd_session_cap(),
|
||||
framebuffer_filter->name,
|
||||
framebuffer_filter->caps,
|
||||
framebuffer_filter->ram_quota,
|
||||
*framebuffer_service_factory);
|
||||
framebuffer_service_factory =
|
||||
new Filter_framebuffer_service_factory(framebuffer_filter->slave->policy());
|
||||
}
|
||||
|
||||
/* start avplay */
|
||||
|
||||
Avplay_slave *avplay_slave = new Avplay_slave(_env.rm(),
|
||||
_env.pd(), _env.pd_session_cap(),
|
||||
_input_service,
|
||||
*framebuffer_service_factory,
|
||||
Avplay_slave *avplay_slave = new Avplay_slave(_env, _ep,
|
||||
_nitpicker_service,
|
||||
_mediafile_name.buf);
|
||||
|
||||
connect(_control_bar, SIGNAL(volume_changed(int)), avplay_slave, SLOT(volume_changed(int)));
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2012-2017 Genode Labs GmbH
|
||||
* Copyright (C) 2012-2019 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
@@ -32,7 +32,8 @@
|
||||
/* local includes */
|
||||
#include "avplay_slave.h"
|
||||
#include "control_bar.h"
|
||||
#include "framebuffer_service_factory.h"
|
||||
#include "nitpicker_session_component.h"
|
||||
|
||||
|
||||
class Main_window : public Compound_widget<QWidget, QVBoxLayout>
|
||||
{
|
||||
@@ -59,23 +60,25 @@ class Main_window : public Compound_widget<QWidget, QVBoxLayout>
|
||||
}
|
||||
};
|
||||
|
||||
Genode::Env &_env;
|
||||
Genode::Env &_env;
|
||||
|
||||
Mediafile_name _mediafile_name;
|
||||
Genode::size_t const _ep_stack_size { 16 * 1024 };
|
||||
Genode::Entrypoint _ep { _env, _ep_stack_size,
|
||||
"avplay_ep",
|
||||
Genode::Affinity::Location() };
|
||||
|
||||
QMember<QNitpickerViewWidget> _avplay_widget;
|
||||
QMember<Control_bar> _control_bar;
|
||||
Mediafile_name _mediafile_name;
|
||||
|
||||
Genode::size_t const _ep_stack_size { 2*sizeof(Genode::addr_t)*1024 };
|
||||
Genode::Rpc_entrypoint _ep { &_env.pd(), _ep_stack_size, "avplay_ep" };
|
||||
QMember<QNitpickerViewWidget> _avplay_widget;
|
||||
QMember<Control_bar> _control_bar;
|
||||
|
||||
Nitpicker_framebuffer_service_factory _nitpicker_framebuffer_service_factory { _env,
|
||||
*_avplay_widget,
|
||||
640, 480 };
|
||||
Nitpicker::Session_component _nitpicker_session_component {
|
||||
_env, _ep, *_avplay_widget };
|
||||
|
||||
Input::Session_component _input_session_component { _env, _env.ram() };
|
||||
Input_service::Single_session_factory _input_factory { _input_session_component };
|
||||
Input_service _input_service { _input_factory };
|
||||
Nitpicker_service::Single_session_factory _nitpicker_factory {
|
||||
_nitpicker_session_component };
|
||||
|
||||
Nitpicker_service _nitpicker_service { _nitpicker_factory };
|
||||
|
||||
public:
|
||||
|
||||
|
||||
158
src/app/qt_avplay/nitpicker_session_component.h
Normal file
158
src/app/qt_avplay/nitpicker_session_component.h
Normal file
@@ -0,0 +1,158 @@
|
||||
/*
|
||||
* \brief Nitpicker session component
|
||||
* \author Christian Prochaska
|
||||
* \date 2019-03-12
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2019 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
*/
|
||||
|
||||
#ifndef _NITPICKER_SESSION_COMPONENT_H_
|
||||
#define _NITPICKER_SESSION_COMPONENT_H_
|
||||
|
||||
/* Genode includes */
|
||||
#include <nitpicker_session/connection.h>
|
||||
|
||||
/* Qt includes */
|
||||
#include <qnitpickerplatformwindow.h>
|
||||
#include <qnitpickerviewwidget/qnitpickerviewwidget.h>
|
||||
|
||||
|
||||
namespace Nitpicker {
|
||||
using namespace Genode;
|
||||
struct Session_component;
|
||||
}
|
||||
|
||||
|
||||
struct Nitpicker::Session_component : Rpc_object<Nitpicker::Session>
|
||||
{
|
||||
Env &_env;
|
||||
Entrypoint &_ep;
|
||||
QNitpickerViewWidget &_nitpicker_view_widget;
|
||||
|
||||
Nitpicker::Connection _connection;
|
||||
|
||||
Input::Session_component _input_component { _env, _env.ram() };
|
||||
|
||||
typedef Nitpicker::Session::Command_buffer Command_buffer;
|
||||
Attached_ram_dataspace _command_ds;
|
||||
Command_buffer &_command_buffer = *_command_ds.local_addr<Command_buffer>();
|
||||
|
||||
Nitpicker::Session::View_handle _view_handle;
|
||||
|
||||
|
||||
Input::Session_component &input_component() { return _input_component; }
|
||||
|
||||
void _execute_command(Command const &command)
|
||||
{
|
||||
switch (command.opcode) {
|
||||
|
||||
case Command::OP_GEOMETRY:
|
||||
{
|
||||
Nitpicker::Rect rect = command.geometry.rect;
|
||||
_nitpicker_view_widget.setNitpickerView(&_connection,
|
||||
_view_handle,
|
||||
0, 0,
|
||||
rect.w(), rect.h());
|
||||
return;
|
||||
}
|
||||
|
||||
case Command::OP_OFFSET: return;
|
||||
case Command::OP_TO_FRONT: return;
|
||||
case Command::OP_TO_BACK: return;
|
||||
case Command::OP_BACKGROUND: return;
|
||||
case Command::OP_TITLE: return;
|
||||
case Command::OP_NOP: return;
|
||||
}
|
||||
}
|
||||
|
||||
Session_component(Env &env, Entrypoint &ep,
|
||||
QNitpickerViewWidget &nitpicker_view_widget)
|
||||
:
|
||||
_env(env), _ep(ep),
|
||||
_nitpicker_view_widget(nitpicker_view_widget),
|
||||
_connection(env),
|
||||
_command_ds(env.ram(), env.rm(), sizeof(Command_buffer))
|
||||
{
|
||||
_ep.manage(_input_component);
|
||||
_ep.manage(*this);
|
||||
_input_component.event_queue().enabled(true);
|
||||
}
|
||||
|
||||
~Session_component()
|
||||
{
|
||||
_ep.dissolve(*this);
|
||||
_ep.dissolve(_input_component);
|
||||
}
|
||||
|
||||
Framebuffer::Session_capability framebuffer_session() override {
|
||||
return _connection.framebuffer_session(); }
|
||||
|
||||
Input::Session_capability input_session() override {
|
||||
return _input_component.cap(); }
|
||||
|
||||
View_handle create_view(View_handle parent) override
|
||||
{
|
||||
QNitpickerPlatformWindow *platform_window =
|
||||
dynamic_cast<QNitpickerPlatformWindow*>(_nitpicker_view_widget
|
||||
.window()->windowHandle()->handle());
|
||||
|
||||
Nitpicker::Session::View_handle parent_view_handle =
|
||||
_connection.view_handle(platform_window->view_cap());
|
||||
|
||||
_view_handle = _connection.create_view(parent_view_handle);
|
||||
|
||||
_connection.release_view_handle(parent_view_handle);
|
||||
|
||||
return _view_handle;
|
||||
}
|
||||
|
||||
void destroy_view(View_handle view) override {
|
||||
_connection.destroy_view(view); }
|
||||
|
||||
View_handle view_handle(View_capability view_cap, View_handle handle) override {
|
||||
return _connection.view_handle(view_cap, handle); }
|
||||
|
||||
View_capability view_capability(View_handle view) override {
|
||||
return _connection.view_capability(view); }
|
||||
|
||||
void release_view_handle(View_handle view) override {
|
||||
_connection.release_view_handle(view); }
|
||||
|
||||
Dataspace_capability command_dataspace() override {
|
||||
return _command_ds.cap(); }
|
||||
|
||||
void execute() override
|
||||
{
|
||||
for (unsigned i = 0; i < _command_buffer.num(); i++)
|
||||
_execute_command(_command_buffer.get(i));
|
||||
}
|
||||
|
||||
Framebuffer::Mode mode() override
|
||||
{
|
||||
Framebuffer::Mode connection_mode { _connection.mode() };
|
||||
Framebuffer::Mode new_mode {
|
||||
Genode::min(connection_mode.width(),
|
||||
_nitpicker_view_widget.maximumWidth()),
|
||||
Genode::min(connection_mode.height(),
|
||||
_nitpicker_view_widget.maximumHeight()),
|
||||
connection_mode.format()
|
||||
};
|
||||
return new_mode;
|
||||
}
|
||||
|
||||
void mode_sigh(Signal_context_capability sigh) override {
|
||||
_connection.mode_sigh(sigh); }
|
||||
|
||||
void buffer(Framebuffer::Mode mode, bool use_alpha) override {
|
||||
_connection.buffer(mode, use_alpha); }
|
||||
|
||||
void focus(Capability<Nitpicker::Session> session) override {
|
||||
_connection.focus(session); }
|
||||
};
|
||||
|
||||
#endif /* _NITPICKER_SESSION_COMPONENT_H_ */
|
||||
@@ -4,4 +4,6 @@ include $(call select_from_repositories,src/app/qt5/tmpl/target_final.inc)
|
||||
|
||||
LIBS += qt5_qnitpickerviewwidget qoost
|
||||
|
||||
REP_INC_DIR += include/qt5/qpa_nitpicker
|
||||
|
||||
CC_CXX_WARN_STRICT =
|
||||
|
||||
Reference in New Issue
Block a user