nitpicker: Add const qualifiers
This commit is contained in:
parent
7e35388336
commit
fa34b79b2c
|
@ -103,7 +103,7 @@ class Log_entry
|
||||||
|
|
||||||
if (new_section) {
|
if (new_section) {
|
||||||
canvas->draw_box(Rect(Point(1, y), Area(label_w + 2, label_h - 1)), label_bgcol);
|
canvas->draw_box(Rect(Point(1, y), Area(label_w + 2, label_h - 1)), label_bgcol);
|
||||||
canvas->draw_string(Point(1, y - 1), &default_font, label_fgcol, _label);
|
canvas->draw_string(Point(1, y - 1), default_font, label_fgcol, _label);
|
||||||
canvas->draw_box(Rect(Point(1, y + label_h - 1), Area(label_w + 2, 1)), Color(0, 0, 0));
|
canvas->draw_box(Rect(Point(1, y + label_h - 1), Area(label_w + 2, 1)), Color(0, 0, 0));
|
||||||
canvas->draw_box(Rect(Point(label_w + 2, y), Area(1, label_h - 1)), _color);
|
canvas->draw_box(Rect(Point(label_w + 2, y), Area(1, label_h - 1)), _color);
|
||||||
canvas->draw_box(Rect(Point(label_w + 3, y), Area(1, label_h - 1)), Color(0, 0, 0));
|
canvas->draw_box(Rect(Point(label_w + 3, y), Area(1, label_h - 1)), Color(0, 0, 0));
|
||||||
|
@ -113,7 +113,7 @@ class Log_entry
|
||||||
canvas->draw_box(Rect(Point(1, y), Area(1000, label_h)), text_bgcol);
|
canvas->draw_box(Rect(Point(1, y), Area(1000, label_h)), text_bgcol);
|
||||||
|
|
||||||
/* draw log text */
|
/* draw log text */
|
||||||
canvas->draw_string(Point(label_w + 6, y), &default_font, text_fgcol, _text);
|
canvas->draw_string(Point(label_w + 6, y), default_font, text_fgcol, _text);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -31,7 +31,7 @@ class Texture : public Area
|
||||||
/**
|
/**
|
||||||
* Return pointer to alpha values, or 0 if no alpha channel exists
|
* Return pointer to alpha values, or 0 if no alpha channel exists
|
||||||
*/
|
*/
|
||||||
virtual unsigned char *alpha() { return 0; }
|
virtual unsigned char const *alpha() const { return 0; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,13 +87,14 @@ class Canvas
|
||||||
* Define/request clipping rectangle
|
* Define/request clipping rectangle
|
||||||
*/
|
*/
|
||||||
void clip(Rect clip) { _clip = Rect::intersect(Rect(Point(0, 0), _size), clip); }
|
void clip(Rect clip) { _clip = Rect::intersect(Rect(Point(0, 0), _size), clip); }
|
||||||
Rect clip() { return _clip; }
|
|
||||||
bool clip_valid() { return _clip.valid(); }
|
Rect clip() const { return _clip; }
|
||||||
|
bool clip_valid() const { return _clip.valid(); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return dimension of canvas in pixels
|
* Return dimension of canvas in pixels
|
||||||
*/
|
*/
|
||||||
Area size() { return _size; }
|
Area size() const { return _size; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw filled box
|
* Draw filled box
|
||||||
|
@ -106,13 +107,13 @@ class Canvas
|
||||||
/**
|
/**
|
||||||
* Draw string
|
* Draw string
|
||||||
*/
|
*/
|
||||||
virtual void draw_string(Point position, Font *font, Color color,
|
virtual void draw_string(Point position, Font const &font, Color color,
|
||||||
const char *str) = 0;
|
const char *str) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw texture
|
* Draw texture
|
||||||
*/
|
*/
|
||||||
virtual void draw_texture(Texture *src, Color mix_color, Point position,
|
virtual void draw_texture(Texture const &src, Color mix_color, Point position,
|
||||||
Mode mode, bool allow_alpha = true) = 0;
|
Mode mode, bool allow_alpha = true) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -23,17 +23,17 @@ class Chunky_texture : public Texture
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
PT *_pixels;
|
PT const *_pixels;
|
||||||
unsigned char *_alpha;
|
unsigned char const *_alpha;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Chunky_texture(PT *pixels, unsigned char *alpha, Area size) :
|
Chunky_texture(PT const *pixels, unsigned char const *alpha, Area size)
|
||||||
Texture(size), _pixels(pixels), _alpha(alpha) { }
|
: Texture(size), _pixels(pixels), _alpha(alpha) { }
|
||||||
|
|
||||||
PT *pixels() { return _pixels; }
|
PT const *pixels() const { return _pixels; }
|
||||||
|
|
||||||
unsigned char *alpha() { return _alpha; }
|
unsigned char const *alpha() const { return _alpha; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -75,19 +75,17 @@ class Chunky_canvas : public Canvas
|
||||||
_flush_pixels(clipped);
|
_flush_pixels(clipped);
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_string(Point p, Font *font, Color color, const char *sstr)
|
void draw_string(Point p, Font const &font, Color color, char const *sstr)
|
||||||
{
|
{
|
||||||
const unsigned char *str = (const unsigned char *)sstr;
|
unsigned char const *str = (unsigned char const *)sstr;
|
||||||
int x = p.x(), y = p.y();
|
int x = p.x(), y = p.y();
|
||||||
|
|
||||||
if (!str || !font) return;
|
unsigned char const *src = font.img;
|
||||||
|
int d, h = font.img_h;
|
||||||
unsigned char const *src = font->img;
|
|
||||||
int d, h = font->img_h;
|
|
||||||
|
|
||||||
/* check top clipping */
|
/* check top clipping */
|
||||||
if ((d = _clip.y1() - y) > 0) {
|
if ((d = _clip.y1() - y) > 0) {
|
||||||
src += d*font->img_w;
|
src += d*font.img_w;
|
||||||
y += d;
|
y += d;
|
||||||
h -= d;
|
h -= d;
|
||||||
}
|
}
|
||||||
|
@ -99,8 +97,8 @@ class Chunky_canvas : public Canvas
|
||||||
if (h < 1) return;
|
if (h < 1) return;
|
||||||
|
|
||||||
/* skip hidden glyphs */
|
/* skip hidden glyphs */
|
||||||
for ( ; *str && (x + font->wtab[*str] < _clip.x1()); )
|
for ( ; *str && (x + font.wtab[*str] < _clip.x1()); )
|
||||||
x += font->wtab[*str++];
|
x += font.wtab[*str++];
|
||||||
|
|
||||||
int x_start = x;
|
int x_start = x;
|
||||||
|
|
||||||
|
@ -110,13 +108,13 @@ class Chunky_canvas : public Canvas
|
||||||
/* draw glyphs */
|
/* draw glyphs */
|
||||||
for ( ; *str && (x <= _clip.x2()); str++) {
|
for ( ; *str && (x <= _clip.x2()); str++) {
|
||||||
|
|
||||||
int w = font->wtab[*str];
|
int w = font.wtab[*str];
|
||||||
int start = max(0, _clip.x1() - x);
|
int start = max(0, _clip.x1() - x);
|
||||||
int end = min(w - 1, _clip.x2() - x);
|
int end = min(w - 1, _clip.x2() - x);
|
||||||
PT *d = dst + x;
|
PT *d = dst + x;
|
||||||
unsigned char const *s = src + font->otab[*str];
|
unsigned char const *s = src + font.otab[*str];
|
||||||
|
|
||||||
for (int j = 0; j < h; j++, s += font->img_w, d += _size.w())
|
for (int j = 0; j < h; j++, s += font.img_w, d += _size.w())
|
||||||
for (int i = start; i <= end; i++)
|
for (int i = start; i <= end; i++)
|
||||||
if (s[i]) d[i] = pix;
|
if (s[i]) d[i] = pix;
|
||||||
|
|
||||||
|
@ -126,27 +124,27 @@ class Chunky_canvas : public Canvas
|
||||||
_flush_pixels(Rect(Point(x_start, y), Area(x - x_start + 1, h)));
|
_flush_pixels(Rect(Point(x_start, y), Area(x - x_start + 1, h)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_texture(Texture *texture, Color mix_color, Point position,
|
void draw_texture(Texture const &texture, Color mix_color, Point position,
|
||||||
Mode mode, bool allow_alpha)
|
Mode mode, bool allow_alpha)
|
||||||
{
|
{
|
||||||
Rect clipped = Rect::intersect(Rect(position, *texture), _clip);
|
Rect clipped = Rect::intersect(Rect(position, texture), _clip);
|
||||||
|
|
||||||
if (!clipped.valid()) return;
|
if (!clipped.valid()) return;
|
||||||
|
|
||||||
int src_w = texture->w();
|
int const src_w = texture.w();
|
||||||
int dst_w = _size.w();
|
int const dst_w = _size.w();
|
||||||
|
|
||||||
Chunky_texture<PT> *tex = static_cast<Chunky_texture<PT> *>(texture);
|
Chunky_texture<PT> const &tex = static_cast<Chunky_texture<PT> const &>(texture);
|
||||||
|
|
||||||
/* calculate offset of first texture pixel to copy */
|
/* calculate offset of first texture pixel to copy */
|
||||||
unsigned long tex_start_offset = (clipped.y1() - position.y())*src_w
|
unsigned long tex_start_offset = (clipped.y1() - position.y())*src_w
|
||||||
+ clipped.x1() - position.x();
|
+ clipped.x1() - position.x();
|
||||||
|
|
||||||
/* start address of source pixels */
|
/* start address of source pixels */
|
||||||
PT *src = tex->pixels() + tex_start_offset;
|
PT const *src = tex.pixels() + tex_start_offset;
|
||||||
|
|
||||||
/* start address of source alpha values */
|
/* start address of source alpha values */
|
||||||
unsigned char *alpha = tex->alpha() + tex_start_offset;
|
unsigned char const *alpha = tex.alpha() + tex_start_offset;
|
||||||
|
|
||||||
/* start address of destination pixels */
|
/* start address of destination pixels */
|
||||||
PT *dst = _addr + clipped.y1()*dst_w + clipped.x1();
|
PT *dst = _addr + clipped.y1()*dst_w + clipped.x1();
|
||||||
|
@ -154,8 +152,9 @@ class Chunky_canvas : public Canvas
|
||||||
PT mix_pixel(mix_color.r, mix_color.g, mix_color.b);
|
PT mix_pixel(mix_color.r, mix_color.g, mix_color.b);
|
||||||
|
|
||||||
int i, j;
|
int i, j;
|
||||||
PT *s, *d;
|
PT const *s;
|
||||||
unsigned char *a;
|
PT *d;
|
||||||
|
unsigned char const *a;
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
|
|
||||||
|
@ -165,7 +164,7 @@ class Chunky_canvas : public Canvas
|
||||||
* If the texture has no alpha channel, we can use
|
* If the texture has no alpha channel, we can use
|
||||||
* a plain pixel blit.
|
* a plain pixel blit.
|
||||||
*/
|
*/
|
||||||
if (tex->alpha() == 0 || !allow_alpha) {
|
if (tex.alpha() == 0 || !allow_alpha) {
|
||||||
blit(src, src_w*sizeof(PT),
|
blit(src, src_w*sizeof(PT),
|
||||||
dst, dst_w*sizeof(PT),
|
dst, dst_w*sizeof(PT),
|
||||||
clipped.w()*sizeof(PT), clipped.h());
|
clipped.w()*sizeof(PT), clipped.h());
|
||||||
|
|
|
@ -33,17 +33,17 @@ class Point
|
||||||
/**
|
/**
|
||||||
* Operator for adding points
|
* Operator for adding points
|
||||||
*/
|
*/
|
||||||
Point operator + (Point p) { return Point(_x + p.x(), _y + p.y()); }
|
Point operator + (Point const &p) const { return Point(_x + p.x(), _y + p.y()); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Operator for subtracting points
|
* Operator for subtracting points
|
||||||
*/
|
*/
|
||||||
Point operator - (Point p) { return Point(_x - p.x(), _y - p.y()); }
|
Point operator - (Point const &p) const { return Point(_x - p.x(), _y - p.y()); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Operator for testing non-equality of two points
|
* Operator for testing non-equality of two points
|
||||||
*/
|
*/
|
||||||
bool operator != (Point p) { return p.x() != _x || p.y() != _y; }
|
bool operator != (Point const &p) const { return p.x() != _x || p.y() != _y; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ class Area
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int _w, _h;
|
int const _w, _h;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -90,11 +90,6 @@ class Rect
|
||||||
|
|
||||||
Rect() { }
|
Rect() { }
|
||||||
|
|
||||||
/**
|
|
||||||
* Assign new coordinates
|
|
||||||
*/
|
|
||||||
void rect(Rect r) { _p1 = r.p1(); _p2 = r.p2(); }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accessors
|
* Accessors
|
||||||
*/
|
*/
|
||||||
|
@ -140,7 +135,7 @@ class Rect
|
||||||
* In the worst case (if we cut a hole into the rectangle) we get
|
* In the worst case (if we cut a hole into the rectangle) we get
|
||||||
* four valid resulting rectangles.
|
* four valid resulting rectangles.
|
||||||
*/
|
*/
|
||||||
void cut(Rect r, Rect *top, Rect *left, Rect *right, Rect *bottom)
|
void cut(Rect r, Rect *top, Rect *left, Rect *right, Rect *bottom) const
|
||||||
{
|
{
|
||||||
/* limit the cut-out area to the actual rectangle */
|
/* limit the cut-out area to the actual rectangle */
|
||||||
r = intersect(r, *this);
|
r = intersect(r, *this);
|
||||||
|
@ -154,7 +149,7 @@ class Rect
|
||||||
/**
|
/**
|
||||||
* Return position of an area when centered within the rectangle
|
* Return position of an area when centered within the rectangle
|
||||||
*/
|
*/
|
||||||
Point center(Area area) {
|
Point center(Area area) const {
|
||||||
return Point((w() - area.w())/2, (h() - area.h())/2) + p1(); }
|
return Point((w() - area.w())/2, (h() - area.h())/2) + p1(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -35,9 +35,9 @@ static inline bool _mouse_button(Keycode keycode) {
|
||||||
** User state interface **
|
** User state interface **
|
||||||
**************************/
|
**************************/
|
||||||
|
|
||||||
User_state::User_state(Global_keys &global_keys, Canvas *canvas, Menubar *menubar)
|
User_state::User_state(Global_keys &global_keys, Canvas &canvas, Menubar &menubar)
|
||||||
:
|
:
|
||||||
View_stack(canvas, this), _global_keys(global_keys), _key_cnt(0),
|
View_stack(canvas, *this), _global_keys(global_keys), _key_cnt(0),
|
||||||
_menubar(menubar), _pointed_view(0), _input_receiver(0),
|
_menubar(menubar), _pointed_view(0), _input_receiver(0),
|
||||||
_global_key_sequence(false)
|
_global_key_sequence(false)
|
||||||
{ }
|
{ }
|
||||||
|
@ -52,7 +52,7 @@ void User_state::handle_event(Input::Event ev)
|
||||||
* Mangle incoming events
|
* Mangle incoming events
|
||||||
*/
|
*/
|
||||||
int ax = _mouse_pos.x(), ay = _mouse_pos.y();
|
int ax = _mouse_pos.x(), ay = _mouse_pos.y();
|
||||||
int rx = 0, ry = 0; /* skip info about relative motion per default */
|
int rx = 0, ry = 0; /* skip info about relative motion by default */
|
||||||
|
|
||||||
/* transparently handle absolute and relative motion events */
|
/* transparently handle absolute and relative motion events */
|
||||||
if (type == Event::MOTION) {
|
if (type == Event::MOTION) {
|
||||||
|
@ -76,22 +76,27 @@ void User_state::handle_event(Input::Event ev)
|
||||||
|
|
||||||
_mouse_pos = Point(ax, ay);
|
_mouse_pos = Point(ax, ay);
|
||||||
|
|
||||||
View * pointed_view = find_view(_mouse_pos);
|
/* count keys */
|
||||||
|
if (type == Event::PRESS) _key_cnt++;
|
||||||
|
if (type == Event::RELEASE && _key_cnt > 0) _key_cnt--;
|
||||||
|
|
||||||
|
View const * const pointed_view = find_view(_mouse_pos);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Deliver a leave event if pointed-to session changed
|
* Deliver a leave event if pointed-to session changed
|
||||||
*/
|
*/
|
||||||
if (pointed_view && _pointed_view &&
|
if (pointed_view && _pointed_view &&
|
||||||
pointed_view->session() != _pointed_view->session()) {
|
!pointed_view->same_session_as(*_pointed_view)) {
|
||||||
|
|
||||||
Input::Event leave_ev(Input::Event::LEAVE, 0, ax, ay, 0, 0);
|
Input::Event leave_ev(Input::Event::LEAVE, 0, ax, ay, 0, 0);
|
||||||
_pointed_view->session()->submit_input_event(&leave_ev);
|
_pointed_view->session().submit_input_event(leave_ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remember currently pointed-at view */
|
|
||||||
_pointed_view = pointed_view;
|
_pointed_view = pointed_view;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Guard that performs a whole-screen update when leaving the scope
|
* Guard that, when 'enabled' is set to true, performs a whole-screen
|
||||||
|
* update when leaving the scope
|
||||||
*/
|
*/
|
||||||
struct Update_all_guard
|
struct Update_all_guard
|
||||||
{
|
{
|
||||||
|
@ -108,40 +113,42 @@ void User_state::handle_event(Input::Event ev)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (user_state._input_receiver)
|
if (user_state._input_receiver)
|
||||||
user_state._menubar->state(user_state, user_state._input_receiver->label(),
|
user_state._menubar.state(user_state,
|
||||||
menu_title, user_state._input_receiver->color());
|
user_state._input_receiver->label(),
|
||||||
|
menu_title,
|
||||||
|
user_state._input_receiver->color());
|
||||||
else
|
else
|
||||||
user_state._menubar->state(user_state, "", "", BLACK);
|
user_state._menubar.state(user_state, "", "", BLACK);
|
||||||
|
|
||||||
user_state.update_all_views();
|
user_state.update_all_views();
|
||||||
}
|
}
|
||||||
} update_all_guard(*this);
|
} update_all_guard(*this);
|
||||||
|
|
||||||
/*
|
|
||||||
* Detect mouse press event in kill mode, used to select the session
|
|
||||||
* to lock out.
|
|
||||||
*/
|
|
||||||
if (kill() && type == Event::PRESS && keycode == Input::BTN_LEFT) {
|
|
||||||
if (pointed_view && pointed_view->session())
|
|
||||||
lock_out_session(pointed_view->session());
|
|
||||||
|
|
||||||
/* leave kill mode */
|
|
||||||
pointed_view = 0;
|
|
||||||
Mode::_mode &= ~KILL;
|
|
||||||
update_all_guard.enabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Handle start of a key sequence
|
* Handle start of a key sequence
|
||||||
*/
|
*/
|
||||||
if (type == Event::PRESS && _key_cnt == 0) {
|
if (type == Event::PRESS && _key_cnt == 1) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Detect mouse press event in kill mode, used to select the session
|
||||||
|
* to lock out.
|
||||||
|
*/
|
||||||
|
if (kill() && keycode == Input::BTN_LEFT) {
|
||||||
|
if (pointed_view)
|
||||||
|
lock_out_session(pointed_view->session());
|
||||||
|
|
||||||
|
/* leave kill mode */
|
||||||
|
update_all_guard.enabled = true;
|
||||||
|
Mode::leave_kill();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* update focused view */
|
/* update focused view */
|
||||||
if (pointed_view != focused_view() && _mouse_button(keycode)) {
|
if (pointed_view != focused_view() && _mouse_button(keycode)) {
|
||||||
|
|
||||||
bool const focus_stays_in_session =
|
bool const focus_stays_in_session =
|
||||||
(_focused_view && pointed_view &&
|
focused_view() && pointed_view &&
|
||||||
_focused_view->session() == pointed_view->session());
|
focused_view()->belongs_to(pointed_view->session());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update the whole screen when the focus change results in
|
* Update the whole screen when the focus change results in
|
||||||
|
@ -155,21 +162,21 @@ void User_state::handle_event(Input::Event ev)
|
||||||
*/
|
*/
|
||||||
if (!focus_stays_in_session) {
|
if (!focus_stays_in_session) {
|
||||||
|
|
||||||
if (_focused_view) {
|
if (focused_view()) {
|
||||||
Input::Event unfocus_ev(Input::Event::FOCUS, 0, ax, ay, 0, 0);
|
Input::Event unfocus_ev(Input::Event::FOCUS, 0, ax, ay, 0, 0);
|
||||||
_focused_view->session()->submit_input_event(&unfocus_ev);
|
focused_view()->session().submit_input_event(unfocus_ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pointed_view) {
|
if (pointed_view) {
|
||||||
Input::Event focus_ev(Input::Event::FOCUS, 1, ax, ay, 0, 0);
|
Input::Event focus_ev(Input::Event::FOCUS, 1, ax, ay, 0, 0);
|
||||||
pointed_view->session()->submit_input_event(&focus_ev);
|
pointed_view->session().submit_input_event(focus_ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!flat() || !_focused_view || !pointed_view)
|
if (!flat() || !focused_view() || !pointed_view)
|
||||||
update_all_guard.enabled = true;
|
update_all_guard.enabled = true;
|
||||||
|
|
||||||
_focused_view = pointed_view;
|
focused_view(pointed_view);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -194,9 +201,9 @@ void User_state::handle_event(Input::Event ev)
|
||||||
* No global rule matched, so the input stream gets directed to the
|
* No global rule matched, so the input stream gets directed to the
|
||||||
* focused view or refers to a built-in operation.
|
* focused view or refers to a built-in operation.
|
||||||
*/
|
*/
|
||||||
if (!global_receiver && _focused_view) {
|
if (!global_receiver && focused_view()) {
|
||||||
_input_receiver = _focused_view->session();
|
_input_receiver = &focused_view()->session();
|
||||||
update_all_guard.menu_title = _focused_view->title();
|
update_all_guard.menu_title = focused_view()->title();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -205,22 +212,17 @@ void User_state::handle_event(Input::Event ev)
|
||||||
*/
|
*/
|
||||||
if (_global_keys.is_operation_key(keycode)) {
|
if (_global_keys.is_operation_key(keycode)) {
|
||||||
|
|
||||||
Mode::_mode ^= _global_keys.is_kill_key(keycode) ? KILL : 0
|
if (_global_keys.is_kill_key(keycode)) Mode::toggle_kill();
|
||||||
| _global_keys.is_xray_key(keycode) ? XRAY : 0;
|
if (_global_keys.is_xray_key(keycode)) Mode::toggle_xray();
|
||||||
|
|
||||||
update_all_guard.enabled = true;
|
update_all_guard.enabled = true;
|
||||||
_input_receiver = 0;
|
_input_receiver = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* count keys */
|
|
||||||
if (type == Event::PRESS) _key_cnt++;
|
|
||||||
if (type == Event::RELEASE && _key_cnt > 0) _key_cnt--;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Deliver event to Nitpicker session except when kill mode is activated
|
* Deliver event to session except when kill mode is activated
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (kill()) return;
|
if (kill()) return;
|
||||||
|
|
||||||
if (type == Event::MOTION || type == Event::WHEEL) {
|
if (type == Event::MOTION || type == Event::WHEEL) {
|
||||||
|
@ -234,23 +236,23 @@ void User_state::handle_event(Input::Event ev)
|
||||||
*/
|
*/
|
||||||
if (flat() || (xray() && focused_view() == pointed_view))
|
if (flat() || (xray() && focused_view() == pointed_view))
|
||||||
if (pointed_view)
|
if (pointed_view)
|
||||||
pointed_view->session()->submit_input_event(&ev);
|
pointed_view->session().submit_input_event(ev);
|
||||||
|
|
||||||
} else if (_input_receiver)
|
} else if (_input_receiver)
|
||||||
_input_receiver->submit_input_event(&ev);
|
_input_receiver->submit_input_event(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* deliver press/release event to session with focused view */
|
/* deliver press/release event to session with focused view */
|
||||||
if (type == Event::PRESS || type == Event::RELEASE)
|
if (type == Event::PRESS || type == Event::RELEASE)
|
||||||
if (_input_receiver)
|
if (_input_receiver)
|
||||||
_input_receiver->submit_input_event(&ev);
|
_input_receiver->submit_input_event(ev);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Detect end of global key sequence
|
* Detect end of global key sequence
|
||||||
*/
|
*/
|
||||||
if (ev.type() == Event::RELEASE && _key_cnt == 0 && _global_key_sequence) {
|
if (ev.type() == Event::RELEASE && _key_cnt == 0 && _global_key_sequence) {
|
||||||
_input_receiver = _focused_view ? _focused_view->session() : 0;
|
_input_receiver = focused_view() ? &focused_view()->session() : 0;
|
||||||
update_all_guard.menu_title = _focused_view ? _focused_view->title() : "";
|
update_all_guard.menu_title = focused_view() ? focused_view()->title() : "";
|
||||||
update_all_guard.enabled = true;
|
update_all_guard.enabled = true;
|
||||||
_global_key_sequence = false;
|
_global_key_sequence = false;
|
||||||
}
|
}
|
||||||
|
@ -261,16 +263,17 @@ void User_state::handle_event(Input::Event ev)
|
||||||
** Mode interface **
|
** Mode interface **
|
||||||
********************/
|
********************/
|
||||||
|
|
||||||
void User_state::forget(View *v)
|
void User_state::forget(View const &view)
|
||||||
{
|
{
|
||||||
if (_focused_view == v) {
|
if (focused_view() == &view) {
|
||||||
Mode::forget(v);
|
Mode::forget(view);
|
||||||
_menubar->state(*this, "", "", BLACK);
|
_menubar.state(*this, "", "", BLACK);
|
||||||
update_all_views();
|
update_all_views();
|
||||||
}
|
}
|
||||||
if (_input_receiver == v->session())
|
if (_input_receiver && view.belongs_to(*_input_receiver))
|
||||||
_input_receiver = 0;
|
_input_receiver = 0;
|
||||||
if (_pointed_view == v)
|
|
||||||
|
if (_pointed_view == &view)
|
||||||
_pointed_view = find_view(_mouse_pos);
|
_pointed_view = find_view(_mouse_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,19 +26,19 @@
|
||||||
/**
|
/**
|
||||||
* Draw rectangle
|
* Draw rectangle
|
||||||
*/
|
*/
|
||||||
static void draw_rect(Canvas *canvas, int x, int y, int w, int h, Color color)
|
static void draw_rect(Canvas &canvas, int x, int y, int w, int h, Color color)
|
||||||
{
|
{
|
||||||
canvas->draw_box(Rect(Point(x, y), Area(w, 1)), color);
|
canvas.draw_box(Rect(Point(x, y), Area(w, 1)), color);
|
||||||
canvas->draw_box(Rect(Point(x, y), Area(1, h)), color);
|
canvas.draw_box(Rect(Point(x, y), Area(1, h)), color);
|
||||||
canvas->draw_box(Rect(Point(x + w - 1, y), Area(1, h)), color);
|
canvas.draw_box(Rect(Point(x + w - 1, y), Area(1, h)), color);
|
||||||
canvas->draw_box(Rect(Point(x, y + h - 1), Area(w, 1)), color);
|
canvas.draw_box(Rect(Point(x, y + h - 1), Area(w, 1)), color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw outlined frame with black outline color
|
* Draw outlined frame with black outline color
|
||||||
*/
|
*/
|
||||||
static void draw_frame(Canvas *canvas, Rect r, Color color, int frame_size)
|
static void draw_frame(Canvas &canvas, Rect r, Color color, int frame_size)
|
||||||
{
|
{
|
||||||
/* draw frame around the view */
|
/* draw frame around the view */
|
||||||
int d = frame_size;
|
int d = frame_size;
|
||||||
|
@ -58,35 +58,33 @@ void View::title(const char *title)
|
||||||
Nitpicker::strncpy(_title, title, TITLE_LEN);
|
Nitpicker::strncpy(_title, title, TITLE_LEN);
|
||||||
|
|
||||||
/* calculate label size, the position is defined by the view stack */
|
/* calculate label size, the position is defined by the view stack */
|
||||||
_label_rect = Rect(Point(0, 0), label_size(_session->label(), _title));
|
_label_rect = Rect(Point(0, 0), label_size(_session.label(), _title));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void View::frame(Canvas *canvas, Mode *mode)
|
void View::frame(Canvas &canvas, Mode const &mode) const
|
||||||
{
|
{
|
||||||
/* do not draw frame in flat mode */
|
/* do not draw frame in flat mode */
|
||||||
if (mode->flat()) return;
|
if (mode.flat()) return;
|
||||||
|
|
||||||
draw_frame(canvas, *this, _session->color(), frame_size(mode));
|
draw_frame(canvas, *this, _session.color(), frame_size(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void View::draw(Canvas *canvas, Mode *mode)
|
void View::draw(Canvas &canvas, Mode const &mode) const
|
||||||
{
|
{
|
||||||
/* use dimming in x-ray mode */
|
|
||||||
Canvas::Mode op = mode->flat() ? Canvas::SOLID : Canvas::MIXED;
|
|
||||||
|
|
||||||
/* is this the currently focused view? */
|
/* is this the currently focused view? */
|
||||||
Session *focused_session = mode->focused_view()
|
bool const view_is_focused = mode.focused_view()
|
||||||
? mode->focused_view()->session()
|
&& mode.focused_view()->belongs_to(_session);
|
||||||
: 0;
|
|
||||||
|
|
||||||
bool view_is_focused = (focused_session == _session);
|
Color const frame_color = _session.color();
|
||||||
Color frame_color = _session->color();
|
|
||||||
|
|
||||||
/* do not dim the focused view in x-ray mode */
|
/*
|
||||||
if (mode->xray() && !mode->kill() && view_is_focused)
|
* Use dimming in x-ray and kill mode, but do not dim the focused view in
|
||||||
op = Canvas::SOLID;
|
* x-ray mode.
|
||||||
|
*/
|
||||||
|
Canvas::Mode const op = mode.flat() || (mode.xray() && view_is_focused)
|
||||||
|
? Canvas::SOLID : Canvas::MIXED;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The view content and label should never overdraw the
|
* The view content and label should never overdraw the
|
||||||
|
@ -97,25 +95,25 @@ void View::draw(Canvas *canvas, Mode *mode)
|
||||||
Clip_guard clip_guard(canvas, *this);
|
Clip_guard clip_guard(canvas, *this);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the clipping area shrinked to zero,
|
* If the clipping area shrinked to zero, we do not process drawing
|
||||||
* we do not process drawing operations.
|
* operations.
|
||||||
*/
|
*/
|
||||||
if (!canvas->clip_valid() || !_session) return;
|
if (!canvas.clip_valid() || !&_session) return;
|
||||||
|
|
||||||
/* allow alpha blending only in flat mode */
|
/* allow alpha blending only in flat mode */
|
||||||
bool allow_alpha = mode->flat();
|
bool allow_alpha = mode.flat();
|
||||||
|
|
||||||
/* draw view content */
|
/* draw view content */
|
||||||
Color mix_color = Color(_session->color().r >> 1,
|
Color const mix_color = mode.kill() ? KILL_COLOR
|
||||||
_session->color().g >> 1,
|
: Color(_session.color().r >> 1,
|
||||||
_session->color().b >> 1);
|
_session.color().g >> 1,
|
||||||
|
_session.color().b >> 1);
|
||||||
|
|
||||||
if (mode->kill()) mix_color = KILL_COLOR;
|
canvas.draw_texture(_session.texture(), mix_color, _buffer_off + p1(),
|
||||||
canvas->draw_texture(_session->texture(), mix_color, _buffer_off + p1(),
|
op, allow_alpha);
|
||||||
op, allow_alpha);
|
|
||||||
|
|
||||||
if (mode->flat()) return;
|
if (mode.flat()) return;
|
||||||
|
|
||||||
/* draw label */
|
/* draw label */
|
||||||
draw_label(canvas, _label_rect.p1(), _session->label(), WHITE, _title, frame_color);
|
draw_label(canvas, _label_rect.p1(), _session.label(), WHITE, _title, frame_color);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
*
|
*
|
||||||
* \param view first view of the view stack
|
* \param view first view of the view stack
|
||||||
*/
|
*/
|
||||||
static View *last_stay_top_view(View *view)
|
static View const *last_stay_top_view(View const *view)
|
||||||
{
|
{
|
||||||
for (; view && view->view_stack_next() && view->view_stack_next()->stay_top(); )
|
for (; view && view->view_stack_next() && view->view_stack_next()->stay_top(); )
|
||||||
view = view->view_stack_next();
|
view = view->view_stack_next();
|
||||||
|
@ -52,13 +52,14 @@ static View *last_stay_top_view(View *view)
|
||||||
** View stack interface **
|
** View stack interface **
|
||||||
**************************/
|
**************************/
|
||||||
|
|
||||||
View *View_stack::_next_view(View *view)
|
template <typename VIEW>
|
||||||
|
VIEW *View_stack::_next_view(VIEW *view) const
|
||||||
{
|
{
|
||||||
Session *active_session = _mode->focused_view() ?
|
Session * const active_session = _mode.focused_view() ?
|
||||||
_mode->focused_view()->session() : 0;
|
&_mode.focused_view()->session() : 0;
|
||||||
|
|
||||||
View *active_background = active_session ?
|
View * const active_background = active_session ?
|
||||||
active_session->background() : 0;
|
active_session->background() : 0;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
view = view ? view->view_stack_next() : 0;
|
view = view ? view->view_stack_next() : 0;
|
||||||
|
@ -77,22 +78,22 @@ View *View_stack::_next_view(View *view)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Rect View_stack::_outline(View *view)
|
Rect View_stack::_outline(View const &view) const
|
||||||
{
|
{
|
||||||
if (_mode->flat()) return *view;
|
if (_mode.flat()) return view;
|
||||||
|
|
||||||
/* request thickness of view frame */
|
/* request thickness of view frame */
|
||||||
int frame_size = view->frame_size(_mode);
|
int const frame_size = view.frame_size(_mode);
|
||||||
|
|
||||||
return Rect(Point(view->x1() - frame_size, view->y1() - frame_size),
|
return Rect(Point(view.x1() - frame_size, view.y1() - frame_size),
|
||||||
Point(view->x2() + frame_size, view->y2() + frame_size));
|
Point(view.x2() + frame_size, view.y2() + frame_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
View *View_stack::_target_stack_position(View *neighbor, bool behind)
|
View const *View_stack::_target_stack_position(View const *neighbor, bool behind)
|
||||||
{
|
{
|
||||||
/* find target position in view stack */
|
/* find target position in view stack */
|
||||||
View *cv = last_stay_top_view(_first_view());
|
View const *cv = last_stay_top_view(_first_view());
|
||||||
|
|
||||||
for ( ; cv; cv = _next_view(cv)) {
|
for ( ; cv; cv = _next_view(cv)) {
|
||||||
|
|
||||||
|
@ -117,7 +118,7 @@ View *View_stack::_target_stack_position(View *neighbor, bool behind)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void View_stack::_optimize_label_rec(View *cv, View *lv, Rect rect, Rect *optimal)
|
void View_stack::_optimize_label_rec(View const *cv, View const *lv, Rect rect, Rect *optimal)
|
||||||
{
|
{
|
||||||
/* if label already fits in optimized rectangle, we are happy */
|
/* if label already fits in optimized rectangle, we are happy */
|
||||||
if (optimal->fits(lv->label_rect().area()))
|
if (optimal->fits(lv->label_rect().area()))
|
||||||
|
@ -125,7 +126,7 @@ void View_stack::_optimize_label_rec(View *cv, View *lv, Rect rect, Rect *optima
|
||||||
|
|
||||||
/* find next view that intersects with the rectangle or the target view */
|
/* find next view that intersects with the rectangle or the target view */
|
||||||
Rect clipped;
|
Rect clipped;
|
||||||
while (cv && cv != lv && !(clipped = Rect::intersect(_outline(cv), rect)).valid())
|
while (cv && cv != lv && !(clipped = Rect::intersect(_outline(*cv), rect)).valid())
|
||||||
cv = _next_view(cv);
|
cv = _next_view(cv);
|
||||||
|
|
||||||
/* reached end of view stack */
|
/* reached end of view stack */
|
||||||
|
@ -165,11 +166,11 @@ void View_stack::_optimize_label_rec(View *cv, View *lv, Rect rect, Rect *optima
|
||||||
void View_stack::_place_labels(Rect rect)
|
void View_stack::_place_labels(Rect rect)
|
||||||
{
|
{
|
||||||
/* do not calculate label positions in flat mode */
|
/* do not calculate label positions in flat mode */
|
||||||
if (_mode->flat()) return;
|
if (_mode.flat()) return;
|
||||||
|
|
||||||
/* ignore mouse cursor */
|
/* ignore mouse cursor */
|
||||||
View *start = _next_view(_first_view());
|
View const *start = _next_view(_first_view());
|
||||||
View *view = start;
|
View *view = _next_view(_first_view());
|
||||||
|
|
||||||
for (; view && _next_view(view); view = _next_view(view))
|
for (; view && _next_view(view); view = _next_view(view))
|
||||||
if (Rect::intersect(*view, rect).valid()) {
|
if (Rect::intersect(*view, rect).valid()) {
|
||||||
|
@ -177,7 +178,7 @@ void View_stack::_place_labels(Rect rect)
|
||||||
Rect old = view->label_rect(), best;
|
Rect old = view->label_rect(), best;
|
||||||
|
|
||||||
/* calculate best visible label position */
|
/* calculate best visible label position */
|
||||||
Rect rect = Rect::intersect(Rect(Point(), _canvas->size()), *view);
|
Rect rect = Rect::intersect(Rect(Point(), _canvas.size()), *view);
|
||||||
if (start) _optimize_label_rec(start, view, rect, &best);
|
if (start) _optimize_label_rec(start, view, rect, &best);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -191,18 +192,19 @@ void View_stack::_place_labels(Rect rect)
|
||||||
view->label_pos(Point(x, best.y1()));
|
view->label_pos(Point(x, best.y1()));
|
||||||
|
|
||||||
/* refresh old and new label positions */
|
/* refresh old and new label positions */
|
||||||
refresh_view(view, view, old);
|
refresh_view(*view, view, old);
|
||||||
refresh_view(view, view, view->label_rect());
|
refresh_view(*view, view, view->label_rect());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void View_stack::draw_rec(View *view, View *dst_view, Session *exclude, Rect rect)
|
void View_stack::draw_rec(View const *view, View const *dst_view,
|
||||||
|
Session const *exclude, Rect rect) const
|
||||||
{
|
{
|
||||||
Rect clipped;
|
Rect clipped;
|
||||||
|
|
||||||
/* find next view that intersects with the current clipping rectangle */
|
/* find next view that intersects with the current clipping rectangle */
|
||||||
for ( ; view && !(clipped = Rect::intersect(_outline(view), rect)).valid(); )
|
for ( ; view && !(clipped = Rect::intersect(_outline(*view), rect)).valid(); )
|
||||||
view = _next_view(view);
|
view = _next_view(view);
|
||||||
|
|
||||||
/* check if we hit the bottom of the view stack */
|
/* check if we hit the bottom of the view stack */
|
||||||
|
@ -211,7 +213,7 @@ void View_stack::draw_rec(View *view, View *dst_view, Session *exclude, Rect rec
|
||||||
Rect top, left, right, bottom;
|
Rect top, left, right, bottom;
|
||||||
rect.cut(clipped, &top, &left, &right, &bottom);
|
rect.cut(clipped, &top, &left, &right, &bottom);
|
||||||
|
|
||||||
View *next = _next_view(view);
|
View const *next = _next_view(view);
|
||||||
|
|
||||||
/* draw areas at the top/left of the current view */
|
/* draw areas at the top/left of the current view */
|
||||||
if (next && top.valid()) draw_rec(next, dst_view, exclude, top);
|
if (next && top.valid()) draw_rec(next, dst_view, exclude, top);
|
||||||
|
@ -223,12 +225,12 @@ void View_stack::draw_rec(View *view, View *dst_view, Session *exclude, Rect rec
|
||||||
Clip_guard clip_guard(_canvas, clipped);
|
Clip_guard clip_guard(_canvas, clipped);
|
||||||
|
|
||||||
/* draw background if view is transparent */
|
/* draw background if view is transparent */
|
||||||
if (view->session()->uses_alpha())
|
if (view->uses_alpha())
|
||||||
draw_rec(_next_view(view), 0, 0, clipped);
|
draw_rec(_next_view(view), 0, 0, clipped);
|
||||||
|
|
||||||
view->frame(_canvas, _mode);
|
view->frame(_canvas, _mode);
|
||||||
|
|
||||||
if (view->session() != exclude)
|
if (!exclude || !view->belongs_to(*exclude))
|
||||||
view->draw(_canvas, _mode);
|
view->draw(_canvas, _mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,10 +240,8 @@ void View_stack::draw_rec(View *view, View *dst_view, Session *exclude, Rect rec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void View_stack::refresh_view(View *view, View *dst_view, Rect rect)
|
void View_stack::refresh_view(View const &view, View const *dst_view, Rect rect)
|
||||||
{
|
{
|
||||||
if (!view) return;
|
|
||||||
|
|
||||||
/* clip argument agains view outline */
|
/* clip argument agains view outline */
|
||||||
rect = Rect::intersect(rect, _outline(view));
|
rect = Rect::intersect(rect, _outline(view));
|
||||||
|
|
||||||
|
@ -249,43 +249,43 @@ void View_stack::refresh_view(View *view, View *dst_view, Rect rect)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void View_stack::viewport(View *view, Rect pos, Point buffer_off, bool do_redraw)
|
void View_stack::viewport(View &view, Rect pos, Point buffer_off, bool do_redraw)
|
||||||
{
|
{
|
||||||
Rect old = _outline(view);
|
Rect old = _outline(view);
|
||||||
|
|
||||||
view->rect(pos);
|
static_cast<Rect &>(view) = Rect(pos);
|
||||||
view->buffer_off(buffer_off);
|
view.buffer_off(buffer_off);
|
||||||
|
|
||||||
Rect compound = Rect::compound(old, _outline(view));
|
Rect compound = Rect::compound(old, _outline(view));
|
||||||
|
|
||||||
/* update labels (except when moving the mouse cursor) */
|
/* update labels (except when moving the mouse cursor) */
|
||||||
if (view != _first_view())
|
if (&view != _first_view())
|
||||||
_place_labels(compound);
|
_place_labels(compound);
|
||||||
|
|
||||||
if (!_mode->flat())
|
if (!_mode.flat())
|
||||||
do_redraw = true;
|
do_redraw = true;
|
||||||
|
|
||||||
/* update area on screen */
|
/* update area on screen */
|
||||||
draw_rec(_first_view(), 0, do_redraw ? 0 : view->session(), compound);
|
draw_rec(_first_view(), 0, do_redraw ? 0 : &view.session(), compound);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void View_stack::stack(View *view, View *neighbor, bool behind, bool do_redraw)
|
void View_stack::stack(View const &view, View const *neighbor, bool behind, bool do_redraw)
|
||||||
{
|
{
|
||||||
_views.remove(view);
|
_views.remove(&view);
|
||||||
_views.insert(view, _target_stack_position(neighbor, behind));
|
_views.insert(&view, _target_stack_position(neighbor, behind));
|
||||||
|
|
||||||
_place_labels(*view);
|
_place_labels(view);
|
||||||
|
|
||||||
/* refresh affected screen area */
|
/* refresh affected screen area */
|
||||||
refresh_view(view, 0, _outline(view));
|
refresh_view(view, 0, _outline(view));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void View_stack::title(View *view, const char *title)
|
void View_stack::title(View &view, const char *title)
|
||||||
{
|
{
|
||||||
view->title(title);
|
view.title(title);
|
||||||
_place_labels(*view);
|
_place_labels(view);
|
||||||
refresh_view(view, 0, _outline(view));
|
refresh_view(view, 0, _outline(view));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -303,13 +303,13 @@ View *View_stack::find_view(Point p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void View_stack::remove_view(View *view)
|
void View_stack::remove_view(View const &view)
|
||||||
{
|
{
|
||||||
/* remember geometry of view to remove */
|
/* remember geometry of view to remove */
|
||||||
Rect rect = _outline(view);
|
Rect rect = _outline(view);
|
||||||
|
|
||||||
/* exclude view from view stack */
|
/* exclude view from view stack */
|
||||||
_views.remove(view);
|
_views.remove(&view);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reset focused and pointed-at view if necessary
|
* Reset focused and pointed-at view if necessary
|
||||||
|
@ -320,7 +320,7 @@ void View_stack::remove_view(View *view)
|
||||||
* the current one, resulting in a dangling pointer right after the view
|
* the current one, resulting in a dangling pointer right after the view
|
||||||
* gets destructed by the caller of 'removed_view'.
|
* gets destructed by the caller of 'removed_view'.
|
||||||
*/
|
*/
|
||||||
_mode->forget(view);
|
_mode.forget(view);
|
||||||
|
|
||||||
/* redraw area where the view was visible */
|
/* redraw area where the view was visible */
|
||||||
draw_rec(_first_view(), 0, 0, rect);
|
draw_rec(_first_view(), 0, 0, rect);
|
||||||
|
|
|
@ -289,11 +289,11 @@ namespace Framebuffer {
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
::Buffer *_buffer;
|
::Buffer &_buffer;
|
||||||
View_stack *_view_stack;
|
View_stack &_view_stack;
|
||||||
::Session *_session;
|
::Session &_session;
|
||||||
Flush_merger *_flush_merger;
|
Flush_merger &_flush_merger;
|
||||||
Framebuffer::Session *_framebuffer;
|
Framebuffer::Session &_framebuffer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -302,37 +302,37 @@ namespace Framebuffer {
|
||||||
*
|
*
|
||||||
* \param session Nitpicker session
|
* \param session Nitpicker session
|
||||||
*/
|
*/
|
||||||
Session_component(::Buffer *buffer, View_stack *view_stack,
|
Session_component(::Buffer &buffer, View_stack &view_stack,
|
||||||
::Session *session, Flush_merger *flush_merger,
|
::Session &session, Flush_merger &flush_merger,
|
||||||
Framebuffer::Session *framebuffer)
|
Framebuffer::Session &framebuffer)
|
||||||
:
|
:
|
||||||
_buffer(buffer), _view_stack(view_stack), _session(session),
|
_buffer(buffer), _view_stack(view_stack), _session(session),
|
||||||
_flush_merger(flush_merger), _framebuffer(framebuffer) { }
|
_flush_merger(flush_merger), _framebuffer(framebuffer) { }
|
||||||
|
|
||||||
Genode::Dataspace_capability dataspace() { return _buffer->ds_cap(); }
|
Genode::Dataspace_capability dataspace() { return _buffer.ds_cap(); }
|
||||||
|
|
||||||
void release() { }
|
void release() { }
|
||||||
|
|
||||||
Mode mode() const
|
Mode mode() const
|
||||||
{
|
{
|
||||||
return Mode(_buffer->size().w(), _buffer->size().h(),
|
return Mode(_buffer.size().w(), _buffer.size().h(),
|
||||||
_buffer->format());
|
_buffer.format());
|
||||||
}
|
}
|
||||||
|
|
||||||
void mode_sigh(Genode::Signal_context_capability) { }
|
void mode_sigh(Genode::Signal_context_capability) { }
|
||||||
|
|
||||||
void refresh(int x, int y, int w, int h)
|
void refresh(int x, int y, int w, int h)
|
||||||
{
|
{
|
||||||
_view_stack->update_session_views(_session,
|
_view_stack.update_session_views(_session,
|
||||||
Rect(Point(x, y), Area(w, h)));
|
Rect(Point(x, y), Area(w, h)));
|
||||||
|
|
||||||
/* flush dirty pixels to physical frame buffer */
|
/* flush dirty pixels to physical frame buffer */
|
||||||
if (_flush_merger->defer == false) {
|
if (_flush_merger.defer == false) {
|
||||||
Rect r = _flush_merger->to_be_flushed();
|
Rect r = _flush_merger.to_be_flushed();
|
||||||
_framebuffer->refresh(r.x1(), r.y1(), r.w(), r.h());
|
_framebuffer.refresh(r.x1(), r.y1(), r.w(), r.h());
|
||||||
_flush_merger->reset();
|
_flush_merger.reset();
|
||||||
}
|
}
|
||||||
_flush_merger->defer = true;
|
_flush_merger.defer = true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -343,25 +343,24 @@ class View_component : public Genode::List<View_component>::Element,
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
View_stack *_view_stack;
|
View_stack &_view_stack;
|
||||||
::View _view;
|
::View _view;
|
||||||
Genode::Rpc_entrypoint *_ep;
|
Genode::Rpc_entrypoint &_ep;
|
||||||
|
|
||||||
static unsigned _flags(Session *session)
|
|
||||||
{
|
|
||||||
return (session && session->stay_top()) ? ::View::STAY_TOP : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
View_component(::Session *session, View_stack *view_stack,
|
View_component(::Session &session, View_stack &view_stack,
|
||||||
Genode::Rpc_entrypoint *ep):
|
Genode::Rpc_entrypoint &ep):
|
||||||
_view_stack(view_stack), _view(session, _flags(session)), _ep(ep) { }
|
_view_stack(view_stack),
|
||||||
|
_view(session,
|
||||||
|
session.stay_top() ? ::View::STAY_TOP : ::View::NOT_STAY_TOP,
|
||||||
|
::View::NOT_TRANSPARENT, ::View::NOT_BACKGROUND, Rect()),
|
||||||
|
_ep(ep) { }
|
||||||
|
|
||||||
::View *view() { return &_view; }
|
::View &view() { return _view; }
|
||||||
|
|
||||||
|
|
||||||
/******************************
|
/******************************
|
||||||
|
@ -372,26 +371,26 @@ class View_component : public Genode::List<View_component>::Element,
|
||||||
int buf_x, int buf_y, bool redraw)
|
int buf_x, int buf_y, bool redraw)
|
||||||
{
|
{
|
||||||
/* transpose y position by vertical session offset */
|
/* transpose y position by vertical session offset */
|
||||||
y += _view.session()->v_offset();
|
y += _view.session().v_offset();
|
||||||
|
|
||||||
_view_stack->viewport(&_view, Rect(Point(x, y), Area(w, h)),
|
_view_stack.viewport(_view, Rect(Point(x, y), Area(w, h)),
|
||||||
Point(buf_x, buf_y), redraw);
|
Point(buf_x, buf_y), redraw);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int stack(Nitpicker::View_capability neighbor_cap, bool behind, bool redraw)
|
int stack(Nitpicker::View_capability neighbor_cap, bool behind, bool redraw)
|
||||||
{
|
{
|
||||||
Genode::Object_pool<View_component>::Guard nvc(_ep->lookup_and_lock(neighbor_cap));
|
Genode::Object_pool<View_component>::Guard nvc(_ep.lookup_and_lock(neighbor_cap));
|
||||||
|
|
||||||
::View *neighbor_view = nvc ? nvc->view() : 0;
|
::View *neighbor_view = nvc ? &nvc->view() : 0;
|
||||||
|
|
||||||
_view_stack->stack(&_view, neighbor_view, behind, redraw);
|
_view_stack.stack(_view, neighbor_view, behind, redraw);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int title(Title const &title)
|
int title(Title const &title)
|
||||||
{
|
{
|
||||||
_view_stack->title(&_view, title.string());
|
_view_stack.title(_view, title.string());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -417,9 +416,9 @@ namespace Nitpicker {
|
||||||
* Entrypoint that is used for the views, input session,
|
* Entrypoint that is used for the views, input session,
|
||||||
* and framebuffer session.
|
* and framebuffer session.
|
||||||
*/
|
*/
|
||||||
Genode::Rpc_entrypoint *_ep;
|
Genode::Rpc_entrypoint &_ep;
|
||||||
|
|
||||||
View_stack *_view_stack;
|
View_stack &_view_stack;
|
||||||
|
|
||||||
Genode::List<View_component> _view_list;
|
Genode::List<View_component> _view_list;
|
||||||
|
|
||||||
|
@ -434,24 +433,24 @@ namespace Nitpicker {
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
Session_component(const char *name,
|
Session_component(char const *name,
|
||||||
::Buffer *buffer,
|
::Buffer &buffer,
|
||||||
Texture *texture,
|
Texture const &texture,
|
||||||
View_stack *view_stack,
|
View_stack &view_stack,
|
||||||
Genode::Rpc_entrypoint *ep,
|
Genode::Rpc_entrypoint &ep,
|
||||||
Flush_merger *flush_merger,
|
Flush_merger &flush_merger,
|
||||||
Framebuffer::Session *framebuffer,
|
Framebuffer::Session &framebuffer,
|
||||||
int v_offset,
|
int v_offset,
|
||||||
unsigned char *input_mask,
|
unsigned char const *input_mask,
|
||||||
bool provides_default_bg,
|
bool provides_default_bg,
|
||||||
Color color,
|
Color color,
|
||||||
bool stay_top)
|
bool stay_top)
|
||||||
:
|
:
|
||||||
::Session(name, texture, v_offset, color, input_mask, stay_top),
|
::Session(name, texture, v_offset, color, input_mask, stay_top),
|
||||||
_framebuffer_session_component(buffer, view_stack, this, flush_merger, framebuffer),
|
_framebuffer_session_component(buffer, view_stack, *this, flush_merger, framebuffer),
|
||||||
_ep(ep), _view_stack(view_stack),
|
_ep(ep), _view_stack(view_stack),
|
||||||
_framebuffer_session_cap(_ep->manage(&_framebuffer_session_component)),
|
_framebuffer_session_cap(_ep.manage(&_framebuffer_session_component)),
|
||||||
_input_session_cap(_ep->manage(&_input_session_component)),
|
_input_session_cap(_ep.manage(&_input_session_component)),
|
||||||
_provides_default_bg(provides_default_bg)
|
_provides_default_bg(provides_default_bg)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
@ -460,11 +459,10 @@ namespace Nitpicker {
|
||||||
*/
|
*/
|
||||||
~Session_component()
|
~Session_component()
|
||||||
{
|
{
|
||||||
_ep->dissolve(&_framebuffer_session_component);
|
_ep.dissolve(&_framebuffer_session_component);
|
||||||
_ep->dissolve(&_input_session_component);
|
_ep.dissolve(&_input_session_component);
|
||||||
|
|
||||||
View_component *vc;
|
while (View_component *vc = _view_list.first())
|
||||||
while ((vc = _view_list.first()))
|
|
||||||
destroy_view(vc->cap());
|
destroy_view(vc->cap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -473,7 +471,7 @@ namespace Nitpicker {
|
||||||
** Nitpicker-internal session interface **
|
** Nitpicker-internal session interface **
|
||||||
******************************************/
|
******************************************/
|
||||||
|
|
||||||
void submit_input_event(Input::Event *ev)
|
void submit_input_event(Input::Event e)
|
||||||
{
|
{
|
||||||
using namespace Input;
|
using namespace Input;
|
||||||
|
|
||||||
|
@ -481,7 +479,6 @@ namespace Nitpicker {
|
||||||
* Transpose absolute coordinates by session-specific vertical
|
* Transpose absolute coordinates by session-specific vertical
|
||||||
* offset.
|
* offset.
|
||||||
*/
|
*/
|
||||||
Event e = *ev;
|
|
||||||
if (e.ax() || e.ay())
|
if (e.ax() || e.ay())
|
||||||
e = Event(e.type(), e.code(), e.ax(),
|
e = Event(e.type(), e.code(), e.ax(),
|
||||||
max(0, e.ay() - v_offset()), e.rx(), e.ry());
|
max(0, e.ay() - v_offset()), e.rx(), e.ry());
|
||||||
|
@ -507,19 +504,19 @@ namespace Nitpicker {
|
||||||
* Use a heap partition!
|
* Use a heap partition!
|
||||||
*/
|
*/
|
||||||
View_component *view = new (Genode::env()->heap())
|
View_component *view = new (Genode::env()->heap())
|
||||||
View_component(this, _view_stack, _ep);
|
View_component(*this, _view_stack, _ep);
|
||||||
|
|
||||||
_view_list.insert(view);
|
_view_list.insert(view);
|
||||||
return _ep->manage(view);
|
return _ep.manage(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroy_view(View_capability view_cap)
|
void destroy_view(View_capability view_cap)
|
||||||
{
|
{
|
||||||
View_component *vc = dynamic_cast<View_component *>(_ep->lookup_and_lock(view_cap));
|
View_component *vc = dynamic_cast<View_component *>(_ep.lookup_and_lock(view_cap));
|
||||||
if (!vc) return;
|
if (!vc) return;
|
||||||
|
|
||||||
_view_stack->remove_view(vc->view());
|
_view_stack.remove_view(vc->view());
|
||||||
_ep->dissolve(vc);
|
_ep.dissolve(vc);
|
||||||
_view_list.remove(vc);
|
_view_list.remove(vc);
|
||||||
destroy(Genode::env()->heap(), vc);
|
destroy(Genode::env()->heap(), vc);
|
||||||
}
|
}
|
||||||
|
@ -527,9 +524,9 @@ namespace Nitpicker {
|
||||||
int background(View_capability view_cap)
|
int background(View_capability view_cap)
|
||||||
{
|
{
|
||||||
if (_provides_default_bg) {
|
if (_provides_default_bg) {
|
||||||
Genode::Object_pool<View_component>::Guard vc(_ep->lookup_and_lock(view_cap));
|
Genode::Object_pool<View_component>::Guard vc(_ep.lookup_and_lock(view_cap));
|
||||||
vc->view()->background(true);
|
vc->view().background(true);
|
||||||
_view_stack->default_background(vc->view());
|
_view_stack.default_background(vc->view());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,11 +534,11 @@ namespace Nitpicker {
|
||||||
if (::Session::background()) ::Session::background()->background(false);
|
if (::Session::background()) ::Session::background()->background(false);
|
||||||
|
|
||||||
/* assign session background */
|
/* assign session background */
|
||||||
Genode::Object_pool<View_component>::Guard vc(_ep->lookup_and_lock(view_cap));
|
Genode::Object_pool<View_component>::Guard vc(_ep.lookup_and_lock(view_cap));
|
||||||
::Session::background(vc->view());
|
::Session::background(&vc->view());
|
||||||
|
|
||||||
/* switch background view to background mode */
|
/* switch background view to background mode */
|
||||||
if (::Session::background()) ::Session::background()->background(true);
|
if (::Session::background()) vc->view().background(true);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -556,9 +553,9 @@ namespace Nitpicker {
|
||||||
Session_list &_session_list;
|
Session_list &_session_list;
|
||||||
Global_keys &_global_keys;
|
Global_keys &_global_keys;
|
||||||
Area _scr_size;
|
Area _scr_size;
|
||||||
View_stack *_view_stack;
|
View_stack &_view_stack;
|
||||||
Flush_merger *_flush_merger;
|
Flush_merger &_flush_merger;
|
||||||
Framebuffer::Session *_framebuffer;
|
Framebuffer::Session &_framebuffer;
|
||||||
int _default_v_offset;
|
int _default_v_offset;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -598,7 +595,7 @@ namespace Nitpicker {
|
||||||
bool provides_default_bg = (Genode::strcmp(label_buf, "backdrop") == 0);
|
bool provides_default_bg = (Genode::strcmp(label_buf, "backdrop") == 0);
|
||||||
|
|
||||||
Session_component *session = new (md_alloc())
|
Session_component *session = new (md_alloc())
|
||||||
Session_component(label_buf, cdt, cdt, _view_stack, ep(),
|
Session_component(label_buf, *cdt, *cdt, _view_stack, *ep(),
|
||||||
_flush_merger, _framebuffer, v_offset,
|
_flush_merger, _framebuffer, v_offset,
|
||||||
cdt->input_mask_buffer(),
|
cdt->input_mask_buffer(),
|
||||||
provides_default_bg, session_color(args),
|
provides_default_bg, session_color(args),
|
||||||
|
@ -612,14 +609,17 @@ namespace Nitpicker {
|
||||||
|
|
||||||
void _destroy_session(Session_component *session)
|
void _destroy_session(Session_component *session)
|
||||||
{
|
{
|
||||||
Chunky_dataspace_texture<PT> *cdt;
|
/* retrieve pointer to texture from session */
|
||||||
cdt = static_cast<Chunky_dataspace_texture<PT> *>(session->texture());
|
Chunky_dataspace_texture<PT> const &cdt =
|
||||||
|
static_cast<Chunky_dataspace_texture<PT> const &>(session->texture());
|
||||||
|
|
||||||
_session_list.remove(session);
|
_session_list.remove(session);
|
||||||
_global_keys.apply_config(_session_list);
|
_global_keys.apply_config(_session_list);
|
||||||
|
|
||||||
destroy(md_alloc(), session);
|
destroy(md_alloc(), session);
|
||||||
destroy(md_alloc(), cdt);
|
|
||||||
|
/* cast away constness just for destruction of the texture */
|
||||||
|
destroy(md_alloc(), const_cast<Chunky_dataspace_texture<PT> *>(&cdt));
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -628,12 +628,12 @@ namespace Nitpicker {
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
Root(Session_list &session_list, Global_keys &global_keys,
|
Root(Session_list &session_list, Global_keys &global_keys,
|
||||||
Genode::Rpc_entrypoint *session_ep, Area scr_size,
|
Genode::Rpc_entrypoint &session_ep, Area scr_size,
|
||||||
View_stack *view_stack, Genode::Allocator *md_alloc,
|
View_stack &view_stack, Genode::Allocator &md_alloc,
|
||||||
Flush_merger *flush_merger,
|
Flush_merger &flush_merger,
|
||||||
Framebuffer::Session *framebuffer, int default_v_offset)
|
Framebuffer::Session &framebuffer, int default_v_offset)
|
||||||
:
|
:
|
||||||
Genode::Root_component<Session_component>(session_ep, md_alloc),
|
Genode::Root_component<Session_component>(&session_ep, &md_alloc),
|
||||||
_session_list(session_list), _global_keys(global_keys),
|
_session_list(session_list), _global_keys(global_keys),
|
||||||
_scr_size(scr_size), _view_stack(view_stack), _flush_merger(flush_merger),
|
_scr_size(scr_size), _view_stack(view_stack), _flush_merger(flush_merger),
|
||||||
_framebuffer(framebuffer), _default_v_offset(default_v_offset) { }
|
_framebuffer(framebuffer), _default_v_offset(default_v_offset) { }
|
||||||
|
@ -657,30 +657,30 @@ class Input_handler_component : public Genode::Rpc_object<Input_handler,
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
User_state *_user_state;
|
User_state &_user_state;
|
||||||
View *_mouse_cursor;
|
View &_mouse_cursor;
|
||||||
Area _mouse_size;
|
Area const _mouse_size;
|
||||||
Flush_merger *_flush_merger;
|
Flush_merger &_flush_merger;
|
||||||
Input::Session *_input;
|
Input::Session &_input;
|
||||||
Input::Event *_ev_buf;
|
Input::Event *_ev_buf;
|
||||||
Framebuffer::Session *_framebuffer;
|
Framebuffer::Session &_framebuffer;
|
||||||
Timer::Session *_timer;
|
Timer::Session &_timer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
Input_handler_component(User_state *user_state, View *mouse_cursor,
|
Input_handler_component(User_state &user_state, View &mouse_cursor,
|
||||||
Area mouse_size, Flush_merger *flush_merger,
|
Area mouse_size, Flush_merger &flush_merger,
|
||||||
Input::Session *input,
|
Input::Session &input,
|
||||||
Framebuffer::Session *framebuffer,
|
Framebuffer::Session &framebuffer,
|
||||||
Timer::Session *timer)
|
Timer::Session &timer)
|
||||||
:
|
:
|
||||||
_user_state(user_state), _mouse_cursor(mouse_cursor),
|
_user_state(user_state), _mouse_cursor(mouse_cursor),
|
||||||
_mouse_size(mouse_size), _flush_merger(flush_merger),
|
_mouse_size(mouse_size), _flush_merger(flush_merger),
|
||||||
_input(input),
|
_input(input),
|
||||||
_ev_buf(Genode::env()->rm_session()->attach(_input->dataspace())),
|
_ev_buf(Genode::env()->rm_session()->attach(_input.dataspace())),
|
||||||
_framebuffer(framebuffer), _timer(timer)
|
_framebuffer(framebuffer), _timer(timer)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
@ -691,7 +691,7 @@ class Input_handler_component : public Genode::Rpc_object<Input_handler,
|
||||||
* \param max size of the event array
|
* \param max size of the event array
|
||||||
* \return number of events subjected to merge
|
* \return number of events subjected to merge
|
||||||
*/
|
*/
|
||||||
unsigned _num_consecutive_events(Input::Event *ev, unsigned max)
|
unsigned _num_consecutive_events(Input::Event const *ev, unsigned max)
|
||||||
{
|
{
|
||||||
if (max < 1) return 0;
|
if (max < 1) return 0;
|
||||||
if (ev->type() != Input::Event::MOTION) return 1;
|
if (ev->type() != Input::Event::MOTION) return 1;
|
||||||
|
@ -714,7 +714,7 @@ class Input_handler_component : public Genode::Rpc_object<Input_handler,
|
||||||
* \param n number of events to merge
|
* \param n number of events to merge
|
||||||
* \return merged motion event
|
* \return merged motion event
|
||||||
*/
|
*/
|
||||||
Input::Event _merge_motion_events(Input::Event *ev, unsigned n)
|
static Input::Event _merge_motion_events(Input::Event const *ev, unsigned n)
|
||||||
{
|
{
|
||||||
Input::Event res;
|
Input::Event res;
|
||||||
for (unsigned i = 0; i < n; i++, ev++)
|
for (unsigned i = 0; i < n; i++, ev++)
|
||||||
|
@ -751,7 +751,7 @@ class Input_handler_component : public Genode::Rpc_object<Input_handler,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* pass event to user state */
|
/* pass event to user state */
|
||||||
_user_state->handle_event(curr);
|
_user_state.handle_event(curr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -761,28 +761,28 @@ class Input_handler_component : public Genode::Rpc_object<Input_handler,
|
||||||
void do_input_handling()
|
void do_input_handling()
|
||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
Point old_mouse_pos = _user_state->mouse_pos();
|
Point old_mouse_pos = _user_state.mouse_pos();
|
||||||
|
|
||||||
/* handle batch of pending events */
|
/* handle batch of pending events */
|
||||||
if (_input->is_pending())
|
if (_input.is_pending())
|
||||||
_import_input_events(_input->flush());
|
_import_input_events(_input.flush());
|
||||||
|
|
||||||
Point new_mouse_pos = _user_state->mouse_pos();
|
Point new_mouse_pos = _user_state.mouse_pos();
|
||||||
|
|
||||||
/* update mouse cursor */
|
/* update mouse cursor */
|
||||||
if (old_mouse_pos != new_mouse_pos)
|
if (old_mouse_pos != new_mouse_pos)
|
||||||
_user_state->viewport(_mouse_cursor,
|
_user_state.viewport(_mouse_cursor,
|
||||||
Rect(new_mouse_pos, _mouse_size),
|
Rect(new_mouse_pos, _mouse_size),
|
||||||
Point(), true);
|
Point(), true);
|
||||||
|
|
||||||
/* flush dirty pixels to physical frame buffer */
|
/* flush dirty pixels to physical frame buffer */
|
||||||
if (_flush_merger->defer == false) {
|
if (_flush_merger.defer == false) {
|
||||||
Rect r = _flush_merger->to_be_flushed();
|
Rect r = _flush_merger.to_be_flushed();
|
||||||
if (r.valid())
|
if (r.valid())
|
||||||
_framebuffer->refresh(r.x1(), r.y1(), r.w(), r.h());
|
_framebuffer.refresh(r.x1(), r.y1(), r.w(), r.h());
|
||||||
_flush_merger->reset();
|
_flush_merger.reset();
|
||||||
}
|
}
|
||||||
_flush_merger->defer = false;
|
_flush_merger.defer = false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In kill mode, we never leave the dispatch function to block
|
* In kill mode, we never leave the dispatch function to block
|
||||||
|
@ -790,10 +790,10 @@ class Input_handler_component : public Genode::Rpc_object<Input_handler,
|
||||||
* spinning for the end of the kill mode less painful for all
|
* spinning for the end of the kill mode less painful for all
|
||||||
* non-blocked processes.
|
* non-blocked processes.
|
||||||
*/
|
*/
|
||||||
if (_user_state->kill())
|
if (_user_state.kill())
|
||||||
_timer->msleep(10);
|
_timer.msleep(10);
|
||||||
|
|
||||||
} while (_user_state->kill());
|
} while (_user_state.kill());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -930,23 +930,23 @@ int main(int argc, char **argv)
|
||||||
*/
|
*/
|
||||||
global_keys.apply_config(session_list);
|
global_keys.apply_config(session_list);
|
||||||
|
|
||||||
static User_state user_state(global_keys, &screen, &menubar);
|
static User_state user_state(global_keys, screen, menubar);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create view stack with default elements
|
* Create view stack with default elements
|
||||||
*/
|
*/
|
||||||
Area mouse_size(big_mouse.w, big_mouse.h);
|
Area mouse_size(big_mouse.w, big_mouse.h);
|
||||||
Mouse_cursor<PT> mouse_cursor((PT *)&big_mouse.pixels[0][0],
|
Mouse_cursor<PT> mouse_cursor((PT *)&big_mouse.pixels[0][0],
|
||||||
mouse_size, &user_state);
|
mouse_size, user_state);
|
||||||
|
|
||||||
menubar.state(user_state, "", "", BLACK);
|
menubar.state(user_state, "", "", BLACK);
|
||||||
|
|
||||||
Background background(screen.size());
|
Background background(screen.size());
|
||||||
|
|
||||||
user_state.default_background(&background);
|
user_state.default_background(background);
|
||||||
user_state.stack(&mouse_cursor);
|
user_state.stack(mouse_cursor);
|
||||||
user_state.stack(&menubar);
|
user_state.stack(menubar);
|
||||||
user_state.stack(&background);
|
user_state.stack(background);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize Nitpicker root interface
|
* Initialize Nitpicker root interface
|
||||||
|
@ -955,9 +955,9 @@ int main(int argc, char **argv)
|
||||||
Sliced_heap sliced_heap(env()->ram_session(), env()->rm_session());
|
Sliced_heap sliced_heap(env()->ram_session(), env()->rm_session());
|
||||||
|
|
||||||
static Nitpicker::Root<PT> np_root(session_list, global_keys,
|
static Nitpicker::Root<PT> np_root(session_list, global_keys,
|
||||||
&ep, Area(mode.width(), mode.height()),
|
ep, Area(mode.width(), mode.height()),
|
||||||
&user_state, &sliced_heap,
|
user_state, sliced_heap,
|
||||||
&screen, &framebuffer,
|
screen, framebuffer,
|
||||||
MENUBAR_HEIGHT);
|
MENUBAR_HEIGHT);
|
||||||
|
|
||||||
env()->parent()->announce(ep.manage(&np_root));
|
env()->parent()->announce(ep.manage(&np_root));
|
||||||
|
@ -971,8 +971,8 @@ int main(int argc, char **argv)
|
||||||
* periodic fashion.
|
* periodic fashion.
|
||||||
*/
|
*/
|
||||||
static Input_handler_component
|
static Input_handler_component
|
||||||
input_handler(&user_state, &mouse_cursor, mouse_size,
|
input_handler(user_state, mouse_cursor, mouse_size,
|
||||||
&screen, &input, &framebuffer, &timer);
|
screen, input, framebuffer, timer);
|
||||||
Capability<Input_handler> input_handler_cap = ep.manage(&input_handler);
|
Capability<Input_handler> input_handler_cap = ep.manage(&input_handler);
|
||||||
|
|
||||||
/* start periodic mode of operation */
|
/* start periodic mode of operation */
|
||||||
|
|
|
@ -17,32 +17,40 @@
|
||||||
#include "view.h"
|
#include "view.h"
|
||||||
#include "clip_guard.h"
|
#include "clip_guard.h"
|
||||||
|
|
||||||
class Background : public Session, public View
|
struct Background : private Texture, Session, View
|
||||||
{
|
{
|
||||||
public:
|
/*
|
||||||
|
* The background uses no texture. Therefore
|
||||||
/*
|
* we can pass a null pointer as texture argument
|
||||||
* The background uses no texture. Therefore
|
* to the Session constructor.
|
||||||
* we can pass a null pointer as texture argument
|
*/
|
||||||
* to the Session constructor.
|
Background(Area size)
|
||||||
*/
|
:
|
||||||
Background(Area size) :
|
Texture(Area(0, 0)), Session("", *this, 0, BLACK),
|
||||||
Session("", 0, 0, BLACK),
|
View(*this, View::NOT_STAY_TOP, View::NOT_TRANSPARENT,
|
||||||
View(this, View::BACKGROUND, Rect(Point(0, 0), size)) { }
|
View::BACKGROUND, Rect(Point(0, 0), size))
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
/********************
|
/***********************
|
||||||
** View interface **
|
** Session interface **
|
||||||
********************/
|
***********************/
|
||||||
|
|
||||||
int frame_size(Mode *mode) { return 0; }
|
void submit_input_event(Input::Event) { }
|
||||||
void frame(Canvas *canvas, Mode *mode) { }
|
|
||||||
|
|
||||||
void draw(Canvas *canvas, Mode *mode)
|
|
||||||
{
|
/********************
|
||||||
Clip_guard clip_guard(canvas, *this);
|
** View interface **
|
||||||
canvas->draw_box(*this, Color(25, 37, 50));
|
********************/
|
||||||
}
|
|
||||||
|
int frame_size(Mode const &mode) const { return 0; }
|
||||||
|
void frame(Canvas &canvas, Mode const &mode) { }
|
||||||
|
|
||||||
|
void draw(Canvas &canvas, Mode const &mode) const
|
||||||
|
{
|
||||||
|
Clip_guard clip_guard(canvas, *this);
|
||||||
|
canvas.draw_box(*this, Color(25, 37, 50));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif /* _BACKGROUND_H_ */
|
||||||
|
|
|
@ -27,25 +27,32 @@ class Chunky_menubar : public Chunky_texture<PT>,
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Chunky_menubar(PT *pixels, Area size) :
|
Chunky_menubar(PT *pixels, Area size)
|
||||||
Chunky_texture<PT>(pixels, 0, size),
|
:
|
||||||
Session("", this, 0, BLACK),
|
Chunky_texture<PT>(pixels, 0, size), Session("", *this, 0, BLACK),
|
||||||
Menubar(&_chunky_canvas, size, this),
|
Menubar(_chunky_canvas, size, *this), _chunky_canvas(pixels, size)
|
||||||
_chunky_canvas(pixels, size) { }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
/***********************
|
||||||
|
** Session interface **
|
||||||
|
***********************/
|
||||||
|
|
||||||
|
void submit_input_event(Input::Event) { }
|
||||||
|
|
||||||
|
|
||||||
/********************
|
/********************
|
||||||
** View interface **
|
** View interface **
|
||||||
********************/
|
********************/
|
||||||
|
|
||||||
int frame_size(Mode *mode) { return 0; }
|
int frame_size(Mode const &mode) const { return 0; }
|
||||||
void frame(Canvas *canvas, Mode *mode) { }
|
void frame(Canvas &canvas, Mode const &mode) { }
|
||||||
void draw(Canvas *canvas, Mode *mode)
|
void draw(Canvas const &canvas, Mode const &mode)
|
||||||
{
|
{
|
||||||
Clip_guard clip_guard(canvas, *this);
|
Clip_guard clip_guard(canvas, *this);
|
||||||
|
|
||||||
/* draw menubar content */
|
/* draw menubar content */
|
||||||
canvas->draw_texture(this, BLACK, p1(), Canvas::SOLID);
|
canvas.draw_texture(*this, BLACK, p1(), Canvas::SOLID);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -34,17 +34,20 @@ class Clip_guard
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Canvas *_canvas;
|
Canvas &_canvas;
|
||||||
Rect _orig_clip_rect;
|
Rect const _orig_clip_rect;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Clip_guard(Canvas *canvas, Rect new_clip_rect):
|
Clip_guard(Canvas &canvas, Rect new_clip_rect)
|
||||||
|
:
|
||||||
_canvas(canvas),
|
_canvas(canvas),
|
||||||
_orig_clip_rect(_canvas->clip()) {
|
_orig_clip_rect(_canvas.clip())
|
||||||
_canvas->clip(Rect::intersect(_orig_clip_rect, new_clip_rect)); }
|
{
|
||||||
|
_canvas.clip(Rect::intersect(_orig_clip_rect, new_clip_rect));
|
||||||
|
}
|
||||||
|
|
||||||
~Clip_guard() { _canvas->clip(_orig_clip_rect); }
|
~Clip_guard() { _canvas.clip(_orig_clip_rect); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif /* _CLIP_GUARD_H_ */
|
||||||
|
|
|
@ -24,12 +24,12 @@ enum { LABEL_GAP = 5 };
|
||||||
/**
|
/**
|
||||||
* Draw black outline of string
|
* Draw black outline of string
|
||||||
*/
|
*/
|
||||||
inline void draw_string_outline(Canvas *canvas, Point pos, const char *s)
|
inline void draw_string_outline(Canvas &canvas, Point pos, const char *s)
|
||||||
{
|
{
|
||||||
for (int j = -1; j <= 1; j++)
|
for (int j = -1; j <= 1; j++)
|
||||||
for (int i = -1; i <= 1; i++)
|
for (int i = -1; i <= 1; i++)
|
||||||
if (i || j)
|
if (i || j)
|
||||||
canvas->draw_string(pos + Point(i, j), &default_font, BLACK, s);
|
canvas.draw_string(pos + Point(i, j), default_font, BLACK, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,19 +52,19 @@ inline Area label_size(const char *sl, const char *vt) {
|
||||||
* policy. In contrast, the view title can individually be defined by the
|
* policy. In contrast, the view title can individually be defined by the
|
||||||
* application.
|
* application.
|
||||||
*/
|
*/
|
||||||
static void draw_label(Canvas *canvas, Point pos,
|
static void draw_label(Canvas &canvas, Point pos,
|
||||||
const char *session_label, Color session_label_color,
|
const char *session_label, Color session_label_color,
|
||||||
const char *view_title, Color view_title_color)
|
const char *view_title, Color view_title_color)
|
||||||
{
|
{
|
||||||
pos = pos + Point(1, 1);
|
pos = pos + Point(1, 1);
|
||||||
|
|
||||||
draw_string_outline(canvas, pos, session_label);
|
draw_string_outline(canvas, pos, session_label);
|
||||||
canvas->draw_string(pos, &default_font, session_label_color, session_label);
|
canvas.draw_string(pos, default_font, session_label_color, session_label);
|
||||||
|
|
||||||
pos = pos + Point(default_font.str_w(session_label) + LABEL_GAP, 0);
|
pos = pos + Point(default_font.str_w(session_label) + LABEL_GAP, 0);
|
||||||
|
|
||||||
draw_string_outline(canvas, pos, view_title);
|
draw_string_outline(canvas, pos, view_title);
|
||||||
canvas->draw_string(pos, &default_font, view_title_color, view_title);
|
canvas.draw_string(pos, default_font, view_title_color, view_title);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _DRAW_LABEL_H_ */
|
#endif /* _DRAW_LABEL_H_ */
|
||||||
|
|
|
@ -32,7 +32,7 @@ class List
|
||||||
|
|
||||||
friend class List;
|
friend class List;
|
||||||
|
|
||||||
LT *_next;
|
LT mutable *_next;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ class List
|
||||||
/**
|
/**
|
||||||
* Return next element in list
|
* Return next element in list
|
||||||
*/
|
*/
|
||||||
LT *next() { return _next; }
|
LT *next() const { return _next; }
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -56,7 +56,8 @@ class List
|
||||||
/**
|
/**
|
||||||
* Return first list element
|
* Return first list element
|
||||||
*/
|
*/
|
||||||
LT *first() { return _first; }
|
LT *first() { return _first; }
|
||||||
|
LT const *first() const { return _first; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert element into list
|
* Insert element into list
|
||||||
|
@ -65,22 +66,22 @@ class List
|
||||||
* \param at target position (preceding list element) or
|
* \param at target position (preceding list element) or
|
||||||
* 0 to insert element at the beginning of the list
|
* 0 to insert element at the beginning of the list
|
||||||
*/
|
*/
|
||||||
void insert(LT *le, LT *at = 0)
|
void insert(LT const *le, LT const *at = 0)
|
||||||
{
|
{
|
||||||
/* insert element at the beginning of the list */
|
/* insert element at the beginning of the list */
|
||||||
if (at == 0) {
|
if (at == 0) {
|
||||||
le->_next = _first;
|
le->_next = _first;
|
||||||
_first = le;
|
_first = const_cast<LT *>(le);
|
||||||
} else {
|
} else {
|
||||||
le->_next = at->_next;
|
le->_next = at->_next;
|
||||||
at->_next = le;
|
at->_next = const_cast<LT *>(le);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove element from list
|
* Remove element from list
|
||||||
*/
|
*/
|
||||||
void remove(LT *le)
|
void remove(LT const *le)
|
||||||
{
|
{
|
||||||
if (!_first) return;
|
if (!_first) return;
|
||||||
|
|
||||||
|
|
|
@ -22,20 +22,24 @@ class Menubar : public View
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Canvas *_canvas;
|
Canvas &_canvas;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
Menubar(Canvas *canvas, Area size, Session *session):
|
Menubar(Canvas &canvas, Area size, Session &session)
|
||||||
View(session, View::STAY_TOP, Rect(Point(0, 0), size)), _canvas(canvas) { }
|
:
|
||||||
|
View(session, View::STAY_TOP, View::NOT_TRANSPARENT,
|
||||||
|
View::NOT_BACKGROUND, Rect(Point(0, 0), size)),
|
||||||
|
_canvas(canvas)
|
||||||
|
{ }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set state that is displayed in the trusted menubar
|
* Set state that is displayed in the trusted menubar
|
||||||
*/
|
*/
|
||||||
void state(Mode mode, const char *session_label, const char *view_title,
|
void state(Mode const &mode, const char *session_label,
|
||||||
Color session_color)
|
const char *view_title, Color session_color)
|
||||||
{
|
{
|
||||||
/* choose base color dependent on the Nitpicker state */
|
/* choose base color dependent on the Nitpicker state */
|
||||||
int r = (mode.kill()) ? 200 : (mode.xray()) ? session_color.r : (session_color.r + 100) >> 1;
|
int r = (mode.kill()) ? 200 : (mode.xray()) ? session_color.r : (session_color.r + 100) >> 1;
|
||||||
|
@ -43,20 +47,20 @@ class Menubar : public View
|
||||||
int b = (mode.kill()) ? 70 : (mode.xray()) ? session_color.b : (session_color.b + 100) >> 1;
|
int b = (mode.kill()) ? 70 : (mode.xray()) ? session_color.b : (session_color.b + 100) >> 1;
|
||||||
|
|
||||||
/* highlight first line with slightly brighter color */
|
/* highlight first line with slightly brighter color */
|
||||||
_canvas->draw_box(Rect(Point(0, 0), Area(w(), 1)),
|
_canvas.draw_box(Rect(Point(0, 0), Area(w(), 1)),
|
||||||
Color(r + (r / 2), g + (g / 2), b + (b / 2)));
|
Color(r + (r / 2), g + (g / 2), b + (b / 2)));
|
||||||
|
|
||||||
/* draw slightly shaded background */
|
/* draw slightly shaded background */
|
||||||
for (int i = 1; i < h() - 1; i++) {
|
for (int i = 1; i < h() - 1; i++) {
|
||||||
r -= r > 3 ? 4 : 0;
|
r -= r > 3 ? 4 : 0;
|
||||||
g -= g > 3 ? 4 : 0;
|
g -= g > 3 ? 4 : 0;
|
||||||
b -= b > 4 ? 4 : 0;
|
b -= b > 4 ? 4 : 0;
|
||||||
_canvas->draw_box(Rect(Point(0, i), Area(w(), 1)), Color(r, g, b));
|
_canvas.draw_box(Rect(Point(0, i), Area(w(), 1)), Color(r, g, b));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draw last line darker */
|
/* draw last line darker */
|
||||||
_canvas->draw_box(Rect(Point(0, h() - 1), Area(w(), 1)),
|
_canvas.draw_box(Rect(Point(0, h() - 1), Area(w(), 1)),
|
||||||
Color(r / 4, g / 4, b / 4));
|
Color(r / 4, g / 4, b / 4));
|
||||||
|
|
||||||
/* draw label */
|
/* draw label */
|
||||||
draw_label(_canvas, center(label_size(session_label, view_title)),
|
draw_label(_canvas, center(label_size(session_label, view_title)),
|
||||||
|
|
|
@ -18,44 +18,43 @@ class View;
|
||||||
|
|
||||||
class Mode
|
class Mode
|
||||||
{
|
{
|
||||||
protected:
|
private:
|
||||||
|
|
||||||
unsigned _mode;
|
bool _xray;
|
||||||
|
bool _kill;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Last clicked view. This view is receiving
|
* Last clicked view. This view is receiving keyboard input, except
|
||||||
* keyboard input.
|
* for global keys.
|
||||||
*/
|
*/
|
||||||
View *_focused_view;
|
View const *_focused_view;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/*
|
Mode(): _xray(false), _kill(false), _focused_view(0) { }
|
||||||
* Bitmasks for the different Nitpicker modes
|
|
||||||
*/
|
|
||||||
enum {
|
|
||||||
XRAY = 0x1,
|
|
||||||
KILL = 0x2,
|
|
||||||
};
|
|
||||||
|
|
||||||
Mode(): _mode(0), _focused_view(0) { }
|
|
||||||
|
|
||||||
virtual ~Mode() { }
|
virtual ~Mode() { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accessors
|
* Accessors
|
||||||
*/
|
*/
|
||||||
bool xray() { return _mode & XRAY; }
|
bool xray() const { return _xray; }
|
||||||
bool kill() { return _mode & KILL; }
|
bool kill() const { return _kill; }
|
||||||
bool flat() { return _mode == 0; }
|
bool flat() const { return !_xray && !_kill; }
|
||||||
|
|
||||||
View *focused_view() { return _focused_view; }
|
void leave_kill() { _kill = false; }
|
||||||
|
void toggle_kill() { _kill = !_kill; }
|
||||||
|
void toggle_xray() { _xray = !_xray; }
|
||||||
|
|
||||||
|
View const *focused_view() const { return _focused_view; }
|
||||||
|
|
||||||
|
void focused_view(View const *view) { _focused_view = view; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Discard all references to specified view
|
* Discard all references to specified view
|
||||||
*/
|
*/
|
||||||
virtual void forget(View *v) {
|
virtual void forget(View const &v) {
|
||||||
if (v == _focused_view) _focused_view = 0; }
|
if (&v == _focused_view) _focused_view = 0; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,18 +27,28 @@ class Mouse_cursor : public Chunky_texture<PT>, public Session, public View
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
View_stack *_view_stack;
|
View_stack const &_view_stack;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
Mouse_cursor(PT *pixels, Area size, View_stack *view_stack):
|
Mouse_cursor(PT const *pixels, Area size, View_stack const &view_stack)
|
||||||
|
:
|
||||||
Chunky_texture<PT>(pixels, 0, size),
|
Chunky_texture<PT>(pixels, 0, size),
|
||||||
Session("", this, 0, BLACK),
|
Session("", *this, 0, BLACK),
|
||||||
View(this, View::STAY_TOP | View::TRANSPARENT),
|
View(*this, View::STAY_TOP, View::TRANSPARENT, View::NOT_BACKGROUND,
|
||||||
_view_stack(view_stack) { }
|
Rect()),
|
||||||
|
_view_stack(view_stack)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
/***********************
|
||||||
|
** Session interface **
|
||||||
|
***********************/
|
||||||
|
|
||||||
|
void submit_input_event(Input::Event) { }
|
||||||
|
|
||||||
|
|
||||||
/********************
|
/********************
|
||||||
|
@ -49,19 +59,19 @@ class Mouse_cursor : public Chunky_texture<PT>, public Session, public View
|
||||||
* The mouse cursor is always displayed without a surrounding frame.
|
* The mouse cursor is always displayed without a surrounding frame.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int frame_size(Mode *mode) { return 0; }
|
int frame_size(Mode const &mode) const { return 0; }
|
||||||
|
|
||||||
void frame(Canvas *canvas, Mode *mode) { }
|
void frame(Canvas &canvas, Mode const &mode) const { }
|
||||||
|
|
||||||
void draw(Canvas *canvas, Mode *mode)
|
void draw(Canvas &canvas, Mode const &mode) const
|
||||||
{
|
{
|
||||||
Clip_guard clip_guard(canvas, *this);
|
Clip_guard clip_guard(canvas, *this);
|
||||||
|
|
||||||
/* draw area behind the mouse cursor */
|
/* draw area behind the mouse cursor */
|
||||||
_view_stack->draw_rec(view_stack_next(), 0, 0, *this);
|
_view_stack.draw_rec(view_stack_next(), 0, 0, *this);
|
||||||
|
|
||||||
/* draw mouse cursor */
|
/* draw mouse cursor */
|
||||||
canvas->draw_texture(this, BLACK, p1(), Canvas::MASKED);
|
canvas.draw_texture(*this, BLACK, p1(), Canvas::MASKED);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -36,13 +36,13 @@ class Session : public Session_list::Element
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
char _label[LABEL_LEN];
|
char _label[LABEL_LEN];
|
||||||
Color _color;
|
Color _color;
|
||||||
Texture *_texture;
|
Texture const &_texture;
|
||||||
View *_background;
|
View *_background;
|
||||||
int _v_offset;
|
int _v_offset;
|
||||||
unsigned char *_input_mask;
|
unsigned char const *_input_mask;
|
||||||
bool _stay_top;
|
bool const _stay_top;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -64,8 +64,8 @@ class Session : public Session_list::Element
|
||||||
* 'input_mask' is a null pointer, user input is
|
* 'input_mask' is a null pointer, user input is
|
||||||
* unconditionally consumed by the view.
|
* unconditionally consumed by the view.
|
||||||
*/
|
*/
|
||||||
Session(const char *label, Texture *texture, int v_offset,
|
Session(char const *label, Texture const &texture, int v_offset,
|
||||||
Color color, unsigned char *input_mask = 0,
|
Color color, unsigned char const *input_mask = 0,
|
||||||
bool stay_top = false)
|
bool stay_top = false)
|
||||||
:
|
:
|
||||||
_color(color), _texture(texture), _background(0),
|
_color(color), _texture(texture), _background(0),
|
||||||
|
@ -74,13 +74,13 @@ class Session : public Session_list::Element
|
||||||
|
|
||||||
virtual ~Session() { }
|
virtual ~Session() { }
|
||||||
|
|
||||||
virtual void submit_input_event(Input::Event *ev) { }
|
virtual void submit_input_event(Input::Event ev) = 0;
|
||||||
|
|
||||||
char *label() { return _label; }
|
char const *label() const { return _label; }
|
||||||
|
|
||||||
Texture *texture() const { return _texture; }
|
Texture const &texture() const { return _texture; }
|
||||||
|
|
||||||
Color color() { return _color; }
|
Color color() const { return _color; }
|
||||||
|
|
||||||
View *background() const { return _background; }
|
View *background() const { return _background; }
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ class Session : public Session_list::Element
|
||||||
/**
|
/**
|
||||||
* Return true if session uses an alpha channel
|
* Return true if session uses an alpha channel
|
||||||
*/
|
*/
|
||||||
bool uses_alpha() const { return _texture && _texture->alpha(); }
|
bool uses_alpha() const { return _texture.alpha(); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return vertical offset of session
|
* Return vertical offset of session
|
||||||
|
@ -101,16 +101,16 @@ class Session : public Session_list::Element
|
||||||
/**
|
/**
|
||||||
* Return input mask value at specified buffer position
|
* Return input mask value at specified buffer position
|
||||||
*/
|
*/
|
||||||
unsigned char input_mask_at(Point p)
|
unsigned char input_mask_at(Point p) const
|
||||||
{
|
{
|
||||||
if (!_input_mask) return 0;
|
if (!_input_mask) return 0;
|
||||||
|
|
||||||
/* check boundaries */
|
/* check boundaries */
|
||||||
if (p.x() < 0 || p.x() >= _texture->w()
|
if (p.x() < 0 || p.x() >= _texture.w()
|
||||||
|| p.y() < 0 || p.y() >= _texture->h())
|
|| p.y() < 0 || p.y() >= _texture.h())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return _input_mask[p.y()*_texture->w() + p.x()];
|
return _input_mask[p.y()*_texture.w() + p.x()];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ class User_state : public Mode, public View_stack
|
||||||
* according to the current Mitpicker mode and the
|
* according to the current Mitpicker mode and the
|
||||||
* focused view.
|
* focused view.
|
||||||
*/
|
*/
|
||||||
Menubar *_menubar;
|
Menubar &_menubar;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Current mouse cursor position
|
* Current mouse cursor position
|
||||||
|
@ -56,7 +56,7 @@ class User_state : public Mode, public View_stack
|
||||||
/*
|
/*
|
||||||
* Currently pointed-at view
|
* Currently pointed-at view
|
||||||
*/
|
*/
|
||||||
View *_pointed_view;
|
View const *_pointed_view;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Session that receives the current stream of input events
|
* Session that receives the current stream of input events
|
||||||
|
@ -73,7 +73,7 @@ class User_state : public Mode, public View_stack
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
User_state(Global_keys &global_keys, Canvas *canvas, Menubar *menubar);
|
User_state(Global_keys &global_keys, Canvas &canvas, Menubar &menubar);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle input event
|
* Handle input event
|
||||||
|
@ -86,12 +86,12 @@ class User_state : public Mode, public View_stack
|
||||||
/**
|
/**
|
||||||
* Accessors
|
* Accessors
|
||||||
*/
|
*/
|
||||||
Point mouse_pos() { return _mouse_pos; }
|
Point mouse_pos() { return _mouse_pos; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mode interface
|
* Mode interface
|
||||||
*/
|
*/
|
||||||
void forget(View *);
|
void forget(View const &);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -41,34 +41,39 @@ class View : public Same_buffer_list_elem, public View_stack_elem, public Rect
|
||||||
|
|
||||||
enum { TITLE_LEN = 32 }; /* max.characters of a title */
|
enum { TITLE_LEN = 32 }; /* max.characters of a title */
|
||||||
|
|
||||||
|
enum Stay_top { NOT_STAY_TOP = 0, STAY_TOP = 1 };
|
||||||
|
enum Transparent { NOT_TRANSPARENT = 0, TRANSPARENT = 1 };
|
||||||
|
enum Background { NOT_BACKGROUND = 0, BACKGROUND = 1 };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
unsigned _flags; /* properties of the view */
|
Stay_top const _stay_top; /* keep view always on top */
|
||||||
|
Transparent const _transparent; /* background is partly visible */
|
||||||
|
Background _background; /* view is a background view */
|
||||||
|
|
||||||
Rect _label_rect; /* position and size of label */
|
Rect _label_rect; /* position and size of label */
|
||||||
Point _buffer_off; /* offset to the visible buffer area */
|
Point _buffer_off; /* offset to the visible buffer area */
|
||||||
Session *_session; /* session that created the view */
|
Session &_session; /* session that created the view */
|
||||||
char _title[TITLE_LEN];
|
char _title[TITLE_LEN];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
enum {
|
View(Session &session, Stay_top stay_top, Transparent transparent,
|
||||||
STAY_TOP = 0x01, /* keep view always on top */
|
Background background, Rect rect)
|
||||||
TRANSPARENT = 0x02, /* background is partly visible */
|
:
|
||||||
BACKGROUND = 0x20, /* view is a background view */
|
Rect(rect), _stay_top(stay_top), _transparent(transparent),
|
||||||
};
|
_background(background), _session(session)
|
||||||
|
{ title(""); }
|
||||||
View(Session *session, unsigned flags = 0, Rect rect = Rect()):
|
|
||||||
Rect(rect), _flags(flags), _session(session) { title(""); }
|
|
||||||
|
|
||||||
virtual ~View() { }
|
virtual ~View() { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return thickness of frame that surrounds the view
|
* Return thickness of frame that surrounds the view
|
||||||
*/
|
*/
|
||||||
virtual int frame_size(Mode *mode)
|
virtual int frame_size(Mode const &mode) const
|
||||||
{
|
{
|
||||||
if (mode->focused_view()
|
if (mode.focused_view()
|
||||||
&& mode->focused_view()->session() == _session)
|
&& mode.focused_view()->belongs_to(_session))
|
||||||
return 5;
|
return 5;
|
||||||
|
|
||||||
return 3;
|
return 3;
|
||||||
|
@ -77,12 +82,12 @@ class View : public Same_buffer_list_elem, public View_stack_elem, public Rect
|
||||||
/**
|
/**
|
||||||
* Draw view-surrounding frame on canvas
|
* Draw view-surrounding frame on canvas
|
||||||
*/
|
*/
|
||||||
virtual void frame(Canvas *canvas, Mode *mode);
|
virtual void frame(Canvas &canvas, Mode const &mode) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw view on canvas
|
* Draw view on canvas
|
||||||
*/
|
*/
|
||||||
virtual void draw(Canvas *canvas, Mode *mode);
|
virtual void draw(Canvas &canvas, Mode const &mode) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set view title
|
* Set view title
|
||||||
|
@ -92,6 +97,9 @@ class View : public Same_buffer_list_elem, public View_stack_elem, public Rect
|
||||||
/**
|
/**
|
||||||
* Return successor in view stack
|
* Return successor in view stack
|
||||||
*/
|
*/
|
||||||
|
View const *view_stack_next() const {
|
||||||
|
return static_cast<View const *>(View_stack_elem::next()); }
|
||||||
|
|
||||||
View *view_stack_next() {
|
View *view_stack_next() {
|
||||||
return static_cast<View *>(View_stack_elem::next()); }
|
return static_cast<View *>(View_stack_elem::next()); }
|
||||||
|
|
||||||
|
@ -100,29 +108,34 @@ class View : public Same_buffer_list_elem, public View_stack_elem, public Rect
|
||||||
*
|
*
|
||||||
* \param is_bg true if view is background
|
* \param is_bg true if view is background
|
||||||
*/
|
*/
|
||||||
void background(bool is_bg)
|
void background(bool is_bg) {
|
||||||
{
|
_background = is_bg ? BACKGROUND : NOT_BACKGROUND; }
|
||||||
if (is_bg) _flags |= BACKGROUND;
|
|
||||||
else _flags &= ~BACKGROUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accessors
|
* Accessors
|
||||||
*/
|
*/
|
||||||
Session *session() { return _session; }
|
Session &session() const { return _session; }
|
||||||
bool stay_top() { return _flags & STAY_TOP; }
|
|
||||||
bool transparent() { return _flags & TRANSPARENT || _session->uses_alpha(); }
|
bool belongs_to(Session const &session) const { return &session == &_session; }
|
||||||
bool background() { return _flags & BACKGROUND; }
|
bool same_session_as(View const &other) const { return &_session == &other._session; }
|
||||||
void buffer_off(Point buffer_off) { _buffer_off = buffer_off; }
|
|
||||||
Point buffer_off() { return _buffer_off; }
|
bool stay_top() const { return _stay_top; }
|
||||||
Rect label_rect() { return _label_rect; }
|
bool transparent() const { return _transparent || _session.uses_alpha(); }
|
||||||
void label_pos(Point pos) { _label_rect = Rect(pos, _label_rect.area()); }
|
bool background() const { return _background; }
|
||||||
char *title() { return _title; }
|
Point buffer_off() const { return _buffer_off; }
|
||||||
|
Rect label_rect() const { return _label_rect; }
|
||||||
|
bool uses_alpha() const { return _session.uses_alpha(); }
|
||||||
|
|
||||||
|
char const *title() const { return _title; }
|
||||||
|
|
||||||
|
void buffer_off(Point buffer_off) { _buffer_off = buffer_off; }
|
||||||
|
|
||||||
|
void label_pos(Point pos) { _label_rect = Rect(pos, _label_rect.area()); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if input at screen position 'p' refers to the view
|
* Return true if input at screen position 'p' refers to the view
|
||||||
*/
|
*/
|
||||||
bool input_response_at(Point p, Mode *mode)
|
bool input_response_at(Point p, Mode const &mode) const
|
||||||
{
|
{
|
||||||
/* check if point lies outside view geometry */
|
/* check if point lies outside view geometry */
|
||||||
if ((p.x() < x1()) || (p.x() > x2())
|
if ((p.x() < x1()) || (p.x() > x2())
|
||||||
|
@ -130,12 +143,11 @@ class View : public Same_buffer_list_elem, public View_stack_elem, public Rect
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* if view uses an alpha channel, check the input mask */
|
/* if view uses an alpha channel, check the input mask */
|
||||||
if (mode->flat() && session()->uses_alpha())
|
if (mode.flat() && session().uses_alpha())
|
||||||
return session()->input_mask_at(p - p1() + _buffer_off);
|
return session().input_mask_at(p - p1() + _buffer_off);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif /* _VIEW_H_ */
|
||||||
#endif
|
|
||||||
|
|
|
@ -22,8 +22,8 @@ class View_stack
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Canvas *_canvas;
|
Canvas &_canvas;
|
||||||
Mode *_mode;
|
Mode &_mode;
|
||||||
List<View_stack_elem> _views;
|
List<View_stack_elem> _views;
|
||||||
View *_default_background;
|
View *_default_background;
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ class View_stack
|
||||||
* active Nitpicker mode. In non-flat modes, we incorporate the
|
* active Nitpicker mode. In non-flat modes, we incorporate the
|
||||||
* surrounding frame.
|
* surrounding frame.
|
||||||
*/
|
*/
|
||||||
Rect _outline(View *view);
|
Rect _outline(View const &view) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return top-most view of the view stack
|
* Return top-most view of the view stack
|
||||||
|
@ -44,12 +44,12 @@ class View_stack
|
||||||
/**
|
/**
|
||||||
* Find position in view stack for inserting a view
|
* Find position in view stack for inserting a view
|
||||||
*/
|
*/
|
||||||
View *_target_stack_position(View *neighbor, bool behind);
|
View const *_target_stack_position(View const *neighbor, bool behind);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find best visible label position
|
* Find best visible label position
|
||||||
*/
|
*/
|
||||||
void _optimize_label_rec(View *cv, View *lv, Rect rect, Rect *optimal);
|
void _optimize_label_rec(View const *cv, View const *lv, Rect rect, Rect *optimal);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Position labels that are affected by specified area
|
* Position labels that are affected by specified area
|
||||||
|
@ -58,21 +58,25 @@ class View_stack
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return view following the specified view in the view stack
|
* Return view following the specified view in the view stack
|
||||||
|
*
|
||||||
|
* The function is a template to capture both const and non-const
|
||||||
|
* usage.
|
||||||
*/
|
*/
|
||||||
View *_next_view(View *view);
|
template <typename VIEW>
|
||||||
|
VIEW *_next_view(VIEW *view) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
View_stack(Canvas *canvas, Mode *mode) :
|
View_stack(Canvas &canvas, Mode &mode) :
|
||||||
_canvas(canvas), _mode(mode), _default_background(0) { }
|
_canvas(canvas), _mode(mode), _default_background(0) { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return size
|
* Return size
|
||||||
*/
|
*/
|
||||||
Area size() { return _canvas->size(); }
|
Area size() { return _canvas.size(); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw views in specified area (recursivly)
|
* Draw views in specified area (recursivly)
|
||||||
|
@ -82,22 +86,22 @@ class View_stack
|
||||||
* if all views should be drawn
|
* if all views should be drawn
|
||||||
* \param exclude do not draw views of this session
|
* \param exclude do not draw views of this session
|
||||||
*/
|
*/
|
||||||
void draw_rec(View *view, View *dst_view, Session *exclude, Rect);
|
void draw_rec(View const *view, View const *dst_view, Session const *exclude, Rect) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw whole view stack
|
* Draw whole view stack
|
||||||
*/
|
*/
|
||||||
void update_all_views()
|
void update_all_views()
|
||||||
{
|
{
|
||||||
_place_labels(Rect(Point(), _canvas->size()));
|
_place_labels(Rect(Point(), _canvas.size()));
|
||||||
draw_rec(_first_view(), 0, 0, Rect(Point(), _canvas->size()));
|
draw_rec(_first_view(), 0, 0, Rect(Point(), _canvas.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update all views belonging to the specified session
|
* Update all views belonging to the specified session
|
||||||
*
|
*
|
||||||
* \param Session * Session that created the view
|
* \param Session Session that created the view
|
||||||
* \param Rect Buffer area to update
|
* \param Rect Buffer area to update
|
||||||
*
|
*
|
||||||
* Note: For now, we perform an independent view-stack traversal
|
* Note: For now, we perform an independent view-stack traversal
|
||||||
* for each view when calling 'refresh_view'. This becomes
|
* for each view when calling 'refresh_view'. This becomes
|
||||||
|
@ -105,11 +109,11 @@ class View_stack
|
||||||
* a tailored 'draw_rec_session' function would overcome
|
* a tailored 'draw_rec_session' function would overcome
|
||||||
* this problem.
|
* this problem.
|
||||||
*/
|
*/
|
||||||
void update_session_views(Session *session, Rect rect)
|
void update_session_views(Session const &session, Rect rect)
|
||||||
{
|
{
|
||||||
for (View *view = _first_view(); view; view = view->view_stack_next()) {
|
for (View const *view = _first_view(); view; view = view->view_stack_next()) {
|
||||||
|
|
||||||
if (view->session() != session)
|
if (!view->belongs_to(session))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -119,7 +123,7 @@ class View_stack
|
||||||
Point offset = view->p1() + view->buffer_off();
|
Point offset = view->p1() + view->buffer_off();
|
||||||
Rect r = Rect::intersect(Rect(rect.p1() + offset,
|
Rect r = Rect::intersect(Rect(rect.p1() + offset,
|
||||||
rect.p2() + offset), *view);
|
rect.p2() + offset), *view);
|
||||||
refresh_view(view, view, r);
|
refresh_view(*view, view, r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,7 +135,7 @@ class View_stack
|
||||||
* refreshed or 'view' if the refresh should be limited to
|
* refreshed or 'view' if the refresh should be limited to
|
||||||
* the specified view.
|
* the specified view.
|
||||||
*/
|
*/
|
||||||
void refresh_view(View *view, View *dst, Rect);
|
void refresh_view(View const &view, View const *dst, Rect);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define position and viewport
|
* Define position and viewport
|
||||||
|
@ -140,7 +144,7 @@ class View_stack
|
||||||
* \param buffer_off view offset of displayed buffer
|
* \param buffer_off view offset of displayed buffer
|
||||||
* \param do_redraw perform screen update immediately
|
* \param do_redraw perform screen update immediately
|
||||||
*/
|
*/
|
||||||
void viewport(View *view, Rect pos, Point buffer_off, bool do_redraw);
|
void viewport(View &view, Rect pos, Point buffer_off, bool do_redraw);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert view at specified position in view stack
|
* Insert view at specified position in view stack
|
||||||
|
@ -153,13 +157,13 @@ class View_stack
|
||||||
* bottom of the view stack, specify neighbor = 0 and
|
* bottom of the view stack, specify neighbor = 0 and
|
||||||
* behind = false.
|
* behind = false.
|
||||||
*/
|
*/
|
||||||
void stack(View *view, View *neighbor = 0, bool behind = true,
|
void stack(View const &view, View const *neighbor = 0,
|
||||||
bool do_redraw = true);
|
bool behind = true, bool do_redraw = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set view title
|
* Set view title
|
||||||
*/
|
*/
|
||||||
void title(View *view, const char *title);
|
void title(View &view, char const *title);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find view at specified position
|
* Find view at specified position
|
||||||
|
@ -169,17 +173,17 @@ class View_stack
|
||||||
/**
|
/**
|
||||||
* Remove view from view stack
|
* Remove view from view stack
|
||||||
*/
|
*/
|
||||||
void remove_view(View *);
|
void remove_view(View const &);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define default background
|
* Define default background
|
||||||
*/
|
*/
|
||||||
void default_background(View *view) { _default_background = view; }
|
void default_background(View &view) { _default_background = &view; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if view is the default background
|
* Return true if view is the default background
|
||||||
*/
|
*/
|
||||||
bool is_default_background(View *view) { return view == _default_background; }
|
bool is_default_background(View const *view) const { return view == _default_background; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove all views of specified session from view stack
|
* Remove all views of specified session from view stack
|
||||||
|
@ -187,11 +191,11 @@ class View_stack
|
||||||
* Rather than removing the views from the view stack, this function moves
|
* Rather than removing the views from the view stack, this function moves
|
||||||
* the session views out of the visible screen area.
|
* the session views out of the visible screen area.
|
||||||
*/
|
*/
|
||||||
void lock_out_session(Session *session)
|
void lock_out_session(Session const &session)
|
||||||
{
|
{
|
||||||
View *view = _first_view(), *next_view = view->view_stack_next();
|
View const *view = _first_view(), *next_view = view->view_stack_next();
|
||||||
while (view) {
|
while (view) {
|
||||||
if (view->session() == session) remove_view(view);
|
if (view->belongs_to(session)) remove_view(*view);
|
||||||
view = next_view;
|
view = next_view;
|
||||||
next_view = view ? view->view_stack_next() : 0;
|
next_view = view ? view->view_stack_next() : 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -255,7 +255,7 @@ void Vancouver_console::entry()
|
||||||
((fg & 0x2) >> 1)*127+lum, /* G+luminosity */
|
((fg & 0x2) >> 1)*127+lum, /* G+luminosity */
|
||||||
(fg & 0x1)*127+lum /* B+luminosity */);
|
(fg & 0x1)*127+lum /* B+luminosity */);
|
||||||
|
|
||||||
canvas.draw_string(where, &default_font, color, buffer);
|
canvas.draw_string(where, default_font, color, buffer);
|
||||||
|
|
||||||
/* Checksum for comparing */
|
/* Checksum for comparing */
|
||||||
if (cmp_even) checksum1 += character;
|
if (cmp_even) checksum1 += character;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user