/*
* \brief Capture session interface
* \author Norman Feske
* \date 2020-06-26
*/
/*
* Copyright (C) 2020 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 _INCLUDE__CAPTURE_SESSION__CAPTURE_SESSION_H_
#define _INCLUDE__CAPTURE_SESSION__CAPTURE_SESSION_H_
#include
#include
#include
#include
#include
namespace Capture {
using namespace Genode;
struct Session_client;
struct Session;
using Rect = Surface_base::Rect;
using Point = Surface_base::Point;
using Area = Surface_base::Area;
using Pixel = Pixel_rgb888;
}
struct Capture::Session : Genode::Session
{
/**
* \noapi
*/
static const char *service_name() { return "Capture"; }
/*
* A capture session consumes a dataspace capability for the server's
* session-object allocation, a session capability, and a dataspace
* capability for the pixel buffer.
*/
static constexpr unsigned CAP_QUOTA = 3;
/**
* Return number of bytes needed for pixel buffer of specified size
*/
static size_t buffer_bytes(Area size)
{
size_t const bytes_per_pixel = 4;
return bytes_per_pixel*size.count();
}
/**
* Request current screen size
*/
virtual Area screen_size() const = 0;
/**
* Register signal handler to be notified whenever the screen size changes
*/
virtual void screen_size_sigh(Signal_context_capability) = 0;
/**
* Define dimensions of the shared pixel buffer
*
* The 'size' controls the server-side allocation of the shared pixel
* buffer and may affect the screen size of the GUI server. The screen
* size is bounding box of the pixel buffers of all capture clients.
*
* \throw Out_of_ram session quota does not suffice for specified
* buffer dimensions
* \throw Out_of_caps
*/
virtual void buffer(Area size) = 0;
/**
* Request dataspace of the shared pixel buffer defined via 'buffer'
*/
virtual Dataspace_capability dataspace() = 0;
/**
* Result type of 'capture_at'
*
* The geometry information are relative to the viewport specified for the
* 'capture_at' call.
*/
struct Affected_rects
{
enum { NUM_RECTS = 3U };
Rect rects[NUM_RECTS];
void for_each_rect(auto const &fn) const
{
for (unsigned i = 0; i < NUM_RECTS; i++)
if (rects[i].valid())
fn(rects[i]);
}
};
/**
* Update the pixel-buffer with content at the specified screen position
*
* \return geometry information about the content that changed since the
* previous call of 'capture_at'
*/
virtual Affected_rects capture_at(Point) = 0;
/*********************
** RPC declaration **
*********************/
GENODE_RPC(Rpc_screen_size, Area, screen_size);
GENODE_RPC(Rpc_screen_size_sigh, void, screen_size_sigh, Signal_context_capability);
GENODE_RPC_THROW(Rpc_buffer, void, buffer,
GENODE_TYPE_LIST(Out_of_ram, Out_of_caps), Area);
GENODE_RPC(Rpc_dataspace, Dataspace_capability, dataspace);
GENODE_RPC(Rpc_capture_at, Affected_rects, capture_at, Point);
GENODE_RPC_INTERFACE(Rpc_screen_size, Rpc_screen_size_sigh, Rpc_buffer,
Rpc_dataspace, Rpc_capture_at);
};
#endif /* _INCLUDE__CAPTURE_SESSION__CAPTURE_SESSION_H_ */