genode/os/include/nitpicker_session/connection.h
Norman Feske f82e1a7092 nitpicker: Late allocation of virtual framebuffer
This patch changes the interface of Nitpicker to support dynamically
dimensioned virtual frame buffers. This solves two problems:

First, it enables a client to create a connection to nitpicker without
donating much session quota in advance. The old interface required each
screen-size-dependent client to donate as much memory as needed to
allocate a screen-sized virtual framebuffer. For clients that are
interested int the screen size but cover just a small portion of the
screen (e.g., a banner, a menu, an applet that sits in the screen
corner), this overprovisioning is painful. The new interface allows such
clients to upgrade the session quota for an existing session as needed.

Second, because each nitpicker session used to have a virtual frame
buffer with a fixed size over the lifetime of the session, a client that
wanted to implement a variable-sized window had to either vastly
overprovide resources (by opening a session as large as the screen just
in order to be prepared for the worst case of a maximized window), or it
had to replace the session by a new one (thereby discarding the stacking
order of the old views) each time the window changes its dimensions. The
new interface accommodates such clients much better.
2013-10-22 08:00:16 +02:00

96 lines
2.2 KiB
C++

/*
* \brief Connection to Nitpicker service
* \author Norman Feske
* \date 2008-08-22
*/
/*
* Copyright (C) 2008-2013 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#ifndef _INCLUDE__NITPICKER_SESSION__CONNECTION_H_
#define _INCLUDE__NITPICKER_SESSION__CONNECTION_H_
#include <nitpicker_session/client.h>
#include <framebuffer_session/client.h>
#include <input_session/client.h>
#include <util/arg_string.h>
#include <base/connection.h>
namespace Nitpicker { class Connection; }
class Nitpicker::Connection : public Genode::Connection<Session>,
public Session_client
{
private:
Framebuffer::Session_client _framebuffer;
Input::Session_client _input;
/**
* Create session and return typed session capability
*/
Session_capability _connect(bool stay_top)
{
enum { ARGBUF_SIZE = 128 };
char argbuf[ARGBUF_SIZE];
argbuf[0] = 0;
/*
* Declare ram-quota donation
*/
enum { SESSION_METADATA = 20*1024 };
Arg_string::set_arg(argbuf, sizeof(argbuf), "ram_quota", SESSION_METADATA);
if (stay_top)
Arg_string::set_arg(argbuf, sizeof(argbuf), "stay_top", "yes");
return session(argbuf);
}
public:
/**
* Constructor
*/
Connection(bool stay_top = false)
:
/* establish nitpicker session */
Genode::Connection<Session>(_connect(stay_top)),
Session_client(cap()),
/* request frame-buffer and input sub sessions */
_framebuffer(framebuffer_session()),
_input(input_session())
{ }
void buffer(Framebuffer::Mode mode, bool use_alpha)
{
enum { ARGBUF_SIZE = 128 };
char argbuf[ARGBUF_SIZE];
argbuf[0] = 0;
Arg_string::set_arg(argbuf, sizeof(argbuf), "ram_quota",
ram_quota(mode, use_alpha));
env()->parent()->upgrade(cap(), argbuf);
Session_client::buffer(mode, use_alpha);
}
/**
* Return sub session for Nitpicker's input service
*/
Input::Session *input() { return &_input; }
/**
* Return sub session for session's frame buffer
*/
Framebuffer::Session *framebuffer() { return &_framebuffer; }
};
#endif /* _INCLUDE__NITPICKER_SESSION__CONNECTION_H_ */