loader: fix the 'constrain_geometry()' function

Fixes #1014.
This commit is contained in:
Christian Prochaska 2014-01-07 18:39:25 +01:00 committed by Norman Feske
parent cbd3d0a878
commit efd20a7ded
3 changed files with 49 additions and 42 deletions

View File

@ -86,8 +86,6 @@ namespace Loader {
Init::Child_policy_enforce_labeling _labeling_policy; Init::Child_policy_enforce_labeling _labeling_policy;
Init::Child_policy_pd_args _pd_args_policy; Init::Child_policy_pd_args _pd_args_policy;
int _max_width, _max_height;
Genode::Child _child; Genode::Child _child;
Rom_session_capability _rom_session(char const *name) Rom_session_capability _rom_session(char const *name)
@ -115,9 +113,7 @@ namespace Loader {
Service &local_cpu_service, Service &local_cpu_service,
Service &local_rm_service, Service &local_rm_service,
Service &local_nitpicker_service, Service &local_nitpicker_service,
Signal_context_capability fault_sigh, Signal_context_capability fault_sigh)
int max_width,
int max_height)
: :
_label(label), _label(label),
_pd_args(pd_args), _pd_args(pd_args),
@ -132,7 +128,6 @@ namespace Loader {
_binary_policy("binary", _binary_rom_session.dataspace(), &_ep), _binary_policy("binary", _binary_rom_session.dataspace(), &_ep),
_labeling_policy(_label.string), _labeling_policy(_label.string),
_pd_args_policy(&_pd_args), _pd_args_policy(&_pd_args),
_max_width(max_width), _max_height(max_height),
_child(_binary_rom_session.dataspace(), _child(_binary_rom_session.dataspace(),
_resources.ram.cap(), _resources.cpu.cap(), _resources.ram.cap(), _resources.cpu.cap(),
_resources.rm.cap(), &_ep, this) _resources.rm.cap(), &_ep, this)
@ -155,29 +150,6 @@ namespace Loader {
{ {
_labeling_policy.filter_session_args(service, args, args_len); _labeling_policy.filter_session_args(service, args, args_len);
_pd_args_policy. filter_session_args(service, args, args_len); _pd_args_policy. filter_session_args(service, args, args_len);
if (!strcmp(service, "Nitpicker")) {
/*
* Restrict the child's framebuffer size to the maximum
* size given by the client.
*/
if (_max_width > -1) {
int fb_width = Arg_string::find_arg(args, "fb_width" ).long_value(_max_width);
if (!Arg_string::set_arg(args, args_len, "fb_width",
min(fb_width, _max_width))) {
PERR("could not set fb_width argument");
}
}
if (_max_height > -1) {
int fb_height = Arg_string::find_arg(args, "fb_height" ).long_value(_max_height);
if (!Arg_string::set_arg(args, args_len, "fb_height",
min(fb_height, _max_height))) {
PERR("could not set fb_height argument");
}
}
}
} }
Service *resolve_session_request(const char *name, Service *resolve_session_request(const char *name,

View File

@ -176,6 +176,9 @@ namespace Loader {
Rpc_entrypoint &ep; Rpc_entrypoint &ep;
Allocator &_md_alloc; Allocator &_md_alloc;
int _max_width;
int _max_height;
Signal_context_capability view_ready_sigh; Signal_context_capability view_ready_sigh;
Nitpicker::Session_component *open_session; Nitpicker::Session_component *open_session;
@ -186,6 +189,8 @@ namespace Loader {
Service("virtual_nitpicker"), Service("virtual_nitpicker"),
ep(ep), ep(ep),
_md_alloc(md_alloc), _md_alloc(md_alloc),
_max_width(-1),
_max_height(-1),
open_session(0) open_session(0)
{ } { }
@ -198,6 +203,11 @@ namespace Loader {
destroy(&_md_alloc, open_session); destroy(&_md_alloc, open_session);
} }
void constrain_geometry(int width, int height)
{
_max_width = width, _max_height = height;
}
Genode::Session_capability session(char const *args, Genode::Session_capability session(char const *args,
Affinity const &) Affinity const &)
{ {
@ -205,7 +215,11 @@ namespace Loader {
throw Unavailable(); throw Unavailable();
open_session = new (&_md_alloc) open_session = new (&_md_alloc)
Nitpicker::Session_component(ep, view_ready_sigh, args); Nitpicker::Session_component(ep,
_max_width,
_max_height,
view_ready_sigh,
args);
return ep.manage(open_session); return ep.manage(open_session);
} }
@ -219,7 +233,6 @@ namespace Loader {
Ram_session_client_guard _ram_session_client; Ram_session_client_guard _ram_session_client;
Heap _md_alloc; Heap _md_alloc;
size_t _subsystem_ram_quota_limit; size_t _subsystem_ram_quota_limit;
int _width, _height;
Rpc_entrypoint _ep; Rpc_entrypoint _ep;
Service_registry _parent_services; Service_registry _parent_services;
Rom_module_registry _rom_modules; Rom_module_registry _rom_modules;
@ -252,7 +265,6 @@ namespace Loader {
_ram_session_client(env()->ram_session_cap(), _ram_quota), _ram_session_client(env()->ram_session_cap(), _ram_quota),
_md_alloc(&_ram_session_client, env()->rm_session()), _md_alloc(&_ram_session_client, env()->rm_session()),
_subsystem_ram_quota_limit(0), _subsystem_ram_quota_limit(0),
_width(-1), _height(-1),
_ep(&cap, STACK_SIZE, "session_ep"), _ep(&cap, STACK_SIZE, "session_ep"),
_rom_modules(_ram_session_client, _md_alloc), _rom_modules(_ram_session_client, _md_alloc),
_rom_service(_ep, _md_alloc, _rom_modules), _rom_service(_ep, _md_alloc, _rom_modules),
@ -300,7 +312,7 @@ namespace Loader {
void constrain_geometry(int width, int height) void constrain_geometry(int width, int height)
{ {
_width = width, _height = height; _nitpicker_service.constrain_geometry(width, height);
} }
void view_ready_sigh(Signal_context_capability sigh) void view_ready_sigh(Signal_context_capability sigh)
@ -346,7 +358,7 @@ namespace Loader {
pd_args, _ep, _ram_session_client, pd_args, _ep, _ram_session_client,
ram_quota, _parent_services, _rom_service, ram_quota, _parent_services, _rom_service,
_cpu_service, _rm_service, _nitpicker_service, _cpu_service, _rm_service, _nitpicker_service,
_fault_sigh, _width, _height); _fault_sigh);
} }
catch (Genode::Parent::Service_denied) { catch (Genode::Parent::Service_denied) {
throw Rom_module_does_not_exist(); } throw Rom_module_does_not_exist(); }

View File

@ -161,6 +161,9 @@ namespace Nitpicker {
Rpc_entrypoint &_ep; Rpc_entrypoint &_ep;
int _max_width;
int _max_height;
Nitpicker::Connection _nitpicker; Nitpicker::Connection _nitpicker;
View_capability _nitpicker_view; View_capability _nitpicker_view;
@ -181,12 +184,17 @@ namespace Nitpicker {
/** /**
* Constructor * Constructor
*/ */
Session_component(Rpc_entrypoint &ep, Session_component(Rpc_entrypoint &ep,
Signal_context_capability view_ready_sigh, int max_width,
const char *args) int max_height,
Signal_context_capability view_ready_sigh,
const char *args)
: :
_ep(ep), _ep(ep),
_max_width(max_width),
_max_height(max_height),
/* create Nitpicker view */ /* create Nitpicker view */
_nitpicker_view(_nitpicker.create_view()), _nitpicker_view(_nitpicker.create_view()),
@ -235,7 +243,16 @@ namespace Nitpicker {
Framebuffer::Mode mode() Framebuffer::Mode mode()
{ {
return _nitpicker.mode(); int mode_width = (_max_width > -1) ?
_max_width :
_nitpicker.mode().width();
int mode_height = (_max_height > -1) ?
_max_height :
_nitpicker.mode().height();
return Framebuffer::Mode(mode_width, mode_height,
_nitpicker.mode().format());
} }
void buffer(Framebuffer::Mode mode, bool use_alpha) void buffer(Framebuffer::Mode mode, bool use_alpha)
@ -271,11 +288,17 @@ namespace Nitpicker {
*/ */
Loader::Session::View_geometry loader_view_geometry() Loader::Session::View_geometry loader_view_geometry()
{ {
Framebuffer::Session_client framebuffer(framebuffer_session()); int view_width = (_max_width > -1) ?
Framebuffer::Mode const mode = framebuffer.mode(); min(_proxy_view.w(), _max_width) :
_proxy_view.w();
int view_height = (_max_height > -1) ?
min(_proxy_view.h(), _max_height) :
_proxy_view.h();
Loader::Session::View_geometry result( Loader::Session::View_geometry result(
min(_proxy_view.w(), mode.width()), view_width,
min(_proxy_view.h(), mode.height()), view_height,
_proxy_view.buf_x(), _proxy_view.buf_x(),
_proxy_view.buf_y()); _proxy_view.buf_y());