genode/demo/src/app/scout/include/window.h

223 lines
4.1 KiB
C++

/*
* \brief Window interface
* \author Norman Feske
* \date 2006-08-30
*/
/*
* Copyright (C) 2006-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 _WINDOW_H_
#define _WINDOW_H_
#include "elements.h"
#include "platform.h"
#include "redraw_manager.h"
/**********************
** Window interface **
**********************/
class Window : public Parent_element
{
private:
Platform *_pf;
int _max_w; /* max width of window */
int _max_h; /* max height of window */
Redraw_manager *_redraw; /* redraw manager */
public:
Window(Platform *pf, Redraw_manager *redraw, int max_w, int max_h)
:
_pf(pf), _max_w(max_w), _max_h(max_h), _redraw(redraw)
{
/* init element attributes */
_x = _y = 0;
_w = pf->vw();
_h = pf->vh();
}
virtual ~Window() { }
/**
* Return current window position
*/
virtual int view_x() { return _pf->vx(); }
virtual int view_y() { return _pf->vy(); }
virtual int view_w() { return _pf->vw(); }
virtual int view_h() { return _pf->vh(); }
/**
* Accessors
*/
Platform *pf() { return _pf; }
int max_w() { return _max_w; }
int max_h() { return _max_h; }
Redraw_manager *redraw() { return _redraw; }
/**
* Bring window to front
*/
virtual void top() { _pf->top_view(); }
/**
* Move window to new position
*/
virtual void vpos(int x, int y) {
_pf->view_geometry(x, y, _pf->vw(), _pf->vh(), 1, _pf->vbx(), _pf->vby()); }
/**
* Define vertical scroll offset
*/
virtual void ypos(int ypos) { }
virtual int ypos() { return 0; }
/**
* Format window
*/
virtual void format(int w, int h) { }
/**
* Element interface
*
* This function just collects the specified regions to be
* redrawn but does not perform any immediate drawing
* operation. The actual drawing must be initiated by
* calling the process_redraw function.
*/
void redraw_area(int x, int y, int w, int h) {
_redraw->request(x, y, w, h); }
};
/********************
** Event handlers **
********************/
class Drag_event_handler : public Event_handler
{
protected:
int _key_cnt; /* number of curr. pressed keys */
int _cmx, _cmy; /* original mouse position */
int _omx, _omy; /* current mouse positon */
virtual void start_drag() = 0;
virtual void do_drag() = 0;
public:
/**
* Constructor
*/
Drag_event_handler() { _key_cnt = 0; }
/**
* Event handler interface
*/
void handle(Event &ev)
{
if (ev.type == Event::PRESS) _key_cnt++;
if (ev.type == Event::RELEASE) _key_cnt--;
if (_key_cnt == 0) return;
/* first click starts dragging */
if ((ev.type == Event::PRESS) && (_key_cnt == 1)) {
_cmx = _omx = ev.mx;
_cmy = _omy = ev.my;
start_drag();
}
/* check if mouse was moved */
if ((ev.mx == _cmx) && (ev.my == _cmy)) return;
/* remember current mouse position */
_cmx = ev.mx;
_cmy = ev.my;
do_drag();
}
};
class Sizer_event_handler : public Drag_event_handler
{
protected:
Window *_window;
int _obw, _obh; /* original window size */
/**
* Event handler interface
*/
void start_drag()
{
_obw = _window->view_w();
_obh = _window->view_h();
}
void do_drag()
{
/* calculate new window size */
int nbw = _obw + _cmx - _omx;
int nbh = _obh + _cmy - _omy;
_window->format(nbw, nbh);
}
public:
/**
* Constructor
*/
Sizer_event_handler(Window *window)
{
_window = window;
}
};
class Mover_event_handler : public Drag_event_handler
{
protected:
Window *_window;
int _obx, _oby; /* original launchpad position */
void start_drag()
{
_obx = _window->view_x();
_oby = _window->view_y();
_window->top();
}
void do_drag()
{
int nbx = _obx + _cmx - _omx;
int nby = _oby + _cmy - _omy;
_window->vpos(nbx, nby);
}
public:
/**
* Constructor
*/
Mover_event_handler(Window *window)
{
_window = window;
}
};
#endif