223 lines
4.1 KiB
C++
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
|