1745453315
This patch introduces a mandatory layer attribute to domains. The layer ordering is superimposed on the stacking order of the views. The top-most layer can be assigned to a pointer-managing client. An example for such a pointer is located at os/src/app/pointer. It replaces the formerly built-in nitpicker mouse cursor. The new layering mechanism replaces the former "stay-top" session argument. So the Nitpicker::Connection no longer takes the stay-top flag as the first argument.
67 lines
1.7 KiB
C++
67 lines
1.7 KiB
C++
/*
|
|
* \brief Minimalistic nitpicker pointer
|
|
* \author Norman Feske
|
|
* \date 2014-07-02
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2014 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.
|
|
*/
|
|
|
|
/* Genode includes */
|
|
#include <nitpicker_session/connection.h>
|
|
#include <os/surface.h>
|
|
#include <os/pixel_rgb565.h>
|
|
#include <os/attached_dataspace.h>
|
|
#include <base/sleep.h>
|
|
|
|
/* local includes */
|
|
#include "big_mouse.h"
|
|
|
|
|
|
template <typename PT>
|
|
void convert_cursor_data_to_pixels(PT *pixel, Nitpicker::Area size)
|
|
{
|
|
unsigned char *alpha = (unsigned char *)(pixel + size.count());
|
|
|
|
for (unsigned y = 0; y < size.h(); y++) {
|
|
for (unsigned x = 0; x < size.w(); x++) {
|
|
|
|
/* the source is known to be in RGB565 format */
|
|
Genode::Pixel_rgb565 src =
|
|
*(Genode::Pixel_rgb565 *)(&big_mouse.pixels[y][x]);
|
|
|
|
unsigned const i = y*size.w() + x;
|
|
pixel[i] = PT(src.r(), src.g(), src.b());
|
|
alpha[i] = src.r() ? 255 : 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
int main(int, char **)
|
|
{
|
|
static Nitpicker::Connection nitpicker;
|
|
|
|
Nitpicker::Area const cursor_size(big_mouse.w, big_mouse.h);
|
|
|
|
Framebuffer::Mode const mode(cursor_size.w(), cursor_size.h(),
|
|
Framebuffer::Mode::RGB565);
|
|
nitpicker.buffer(mode, true);
|
|
|
|
static Genode::Attached_dataspace ds(nitpicker.framebuffer()->dataspace());
|
|
|
|
convert_cursor_data_to_pixels(ds.local_addr<Genode::Pixel_rgb565>(), cursor_size);
|
|
|
|
Nitpicker::Session::View_handle view = nitpicker.create_view();
|
|
Nitpicker::Rect geometry(Nitpicker::Point(0, 0), cursor_size);
|
|
nitpicker.enqueue<Nitpicker::Session::Command::Geometry>(view, geometry);
|
|
nitpicker.enqueue<Nitpicker::Session::Command::To_front>(view);
|
|
nitpicker.execute();
|
|
|
|
Genode::sleep_forever();
|
|
}
|