get ready for Linux

This commit is contained in:
cnjinhao 2015-02-04 10:26:08 +08:00
parent ec78324743
commit fd5ff571a7
27 changed files with 180 additions and 176 deletions

View File

@ -1,7 +1,7 @@
/*
* Basic Types definition
* Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,7 +1,7 @@
/*
* A Drawer Implementation
* Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
@ -139,7 +139,11 @@ namespace nana
{
realizer_->_m_reset_overrided();
(realizer_->*mfptr)(graphics, arg);
mth_state_[pos] = (realizer_->_m_overrided() ? method_state::overrided : method_state::not_overrided);
//Check realizer, when the window is closed in that event handler, the drawer will be
//detached and realizer will be a nullptr
if(realizer_)
mth_state_[pos] = (realizer_->_m_overrided() ? method_state::overrided : method_state::not_overrided);
}
else
(realizer_->*mfptr)(graphics, arg);

View File

@ -180,7 +180,7 @@ namespace API
using scheme_type = typename ::nana::dev::widget_traits<Widget>::scheme_type;
internal_scope_guard lock;
auto * wdg_colors = ::nana::dev::get_scheme(wd);
auto * wdg_colors = dev::get_scheme(wd);
if (nullptr == wdg_colors)
throw std::invalid_argument("API::scheme(): bad parameter window handle, no events object or invalid window handle.");

View File

@ -25,7 +25,7 @@ namespace nana
virtual ~display() = default;
/// The index of monitor.
virtual std::size_t index() const = 0;
virtual std::size_t get_index() const = 0;
/// Returns the positional coordinates and size of the display device in reference to the desktop area
virtual const ::nana::rectangle& area() const = 0;
@ -49,4 +49,4 @@ namespace nana
};
}//end namespace nana
#endif
#endif

View File

@ -22,16 +22,13 @@
namespace nana
{
/// A list box combined with a textbox - the list box should drop down when the user selects the arrow next to the control
class combox;
class combox;
struct arg_combox
: public event_arg
{
combox & widget;
arg_combox(combox& wdg)
: widget{ wdg }
{}
arg_combox(combox&);
};
namespace drawerbase

View File

@ -421,7 +421,7 @@ namespace nana
mutable drawerbase::listbox::item_proxy item;
bool selected;
arg_listbox(drawerbase::listbox::item_proxy&, bool selected);
arg_listbox(const drawerbase::listbox::item_proxy&, bool selected);
};
namespace drawerbase

View File

@ -44,7 +44,7 @@ namespace nana
widget * widget_{nullptr};
nana::paint::graphics* graph_{nullptr};
unsigned draw_width_{static_cast<unsigned>(-1)};
bool has_value_{true};
//bool has_value_{true}; //deprecated
bool unknown_{false};
unsigned max_{100};
unsigned value_{0};

View File

@ -27,7 +27,7 @@ namespace nana
scroll<Vert> & widget;
arg_scroll(scroll<Vert> & wdg)
: widget{ wdg }
: widget(wdg)
{}
};
@ -312,7 +312,7 @@ namespace nana
private:
void _m_emit_value_changed()
{
widget_->events().value_changed.emit(::nana::arg_scroll<Vertical>({*widget_}));
widget_->events().value_changed.emit(::nana::arg_scroll<Vertical>(*widget_));
}
void _m_tick()

View File

@ -7,7 +7,7 @@
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*
* @file: nana/gui/widgets/spanbox.hpp
* @file: nana/gui/widgets/spinbox.hpp
*/
#ifndef NANA_GUI_WIDGET_SPINBOX_HPP
@ -23,10 +23,7 @@ namespace nana
: public event_arg
{
spinbox & widget;
arg_spinbox(spinbox& wdg)
: widget{ wdg }
{}
arg_spinbox(spinbox&);
};
namespace drawerbase
@ -137,4 +134,4 @@ namespace nana
}
}//end namespace nana
#endif //NANA_GUI_WIDGET_SPINBOX_HPP
#endif //NANA_GUI_WIDGET_SPINBOX_HPP

View File

@ -1,6 +1,7 @@
/*
* Basic Types definition
* Copyright(C) 2003-2013 Jinhao(cnjinhao@hotmail.com)
* Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -376,9 +376,9 @@ namespace detail
switch(spec.screen_depth())
{
case 16:
rgb = ((((color >> 16) & 0xFF) * 31 / 255) << 11) |
((((color >> 8) & 0xFF) * 63 / 255) << 5) |
(color & 0xFF) * 31 / 255;
rgb = ((((rgb >> 16) & 0xFF) * 31 / 255) << 11) |
((((rgb >> 8) & 0xFF) * 63 / 255) << 5) |
(rgb & 0xFF) * 31 / 255;
break;
}
::XSetForeground(spec.open_display(), context, rgb);
@ -795,9 +795,9 @@ namespace detail
}
addr->visible = false;
addr->graph.make(caret_sz.width, caret_sz.height);
addr->graph.rectangle(0x0, true);
addr->rev_graph.make(caret_sz.width, caret_sz.height);
addr->graph.make(caret_sz);
addr->graph.rectangle(true, colors::black);
addr->rev_graph.make(caret_sz);
addr->size = caret_sz;
@ -1128,7 +1128,7 @@ namespace detail
const nana::paint::graphics& platform_spec::keep_window_icon(native_window_type wd, const nana::paint::image& img)
{
nana::paint::graphics & graph = iconbase_[wd];
graph.make(img.size().width, img.size().height);
graph.make(img.size());
img.paste(graph, 0, 0);
return graph;
}

View File

@ -1,6 +1,7 @@
/*
* Platform Specification Implementation
* Copyright(C) 2003-2013 Jinhao(cnjinhao@hotmail.com)
* Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,7 +1,7 @@
/*
* A Bedrock Implementation
* Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
@ -377,6 +377,12 @@ namespace detail
return impl_->estore;
}
void bedrock::map_through_widgets(core_window_t* wd, native_drawable_type drawable)
{
//No implementation for Linux
}
bool bedrock::emit(event_code evt_code, core_window_t* wd, const arg_mouse& arg, bool ask_update, thread_context* thrd)
{
if(evt_code != arg.evt_code)

View File

@ -1008,7 +1008,7 @@ namespace detail
arg.evt_code = event_code::mouse_up;
emit_drawer(&drawer::mouse_up, msgwnd, arg, &context);
auto evt_ptr = msgwnd->together.events_ptr;
//auto evt_ptr = msgwnd->together.events_ptr; //deprecated
if (fire_click)
{

View File

@ -679,7 +679,7 @@ namespace detail
{
//Copy the root buffer that wd specified into DeviceContext
#if defined(NANA_LINUX)
wd->drawer.map(reinterpret_cast<window>(wd));
wd->drawer.map(reinterpret_cast<window>(wd), forced);
#elif defined(NANA_WINDOWS)
if(nana::system::this_thread_id() == wd->thread_id)
wd->drawer.map(reinterpret_cast<window>(wd), forced);

View File

@ -1,7 +1,7 @@
/*
* Elements of GUI Gadgets
* Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
@ -411,7 +411,7 @@ namespace nana
pixels -= 2;
}
}
break;
default:break;
}
return true;
}

View File

@ -34,17 +34,17 @@ namespace nana
: public form
{
public:
msgbox_window(window wd, const nana::string& title, msgbox::button_t btn, msgbox::icon_t ico)
: form(wd, nana::rectangle(1, 1, 1, 1), appear::decorate<>()),
msgbox_window(window wd, const ::nana::string& title, msgbox::button_t btn, msgbox::icon_t ico)
: form(wd, rectangle(1, 1, 1, 1), appear::decorate<>()),
owner_(wd), pick_(msgbox::pick_yes)
{
this->caption(title);
drawing dw(*this);
dw.draw([this](::nana::paint::graphics& graph)
dw.draw([this](paint::graphics& graph)
{
graph.rectangle(nana::rectangle{0, 0, graph.width(), graph.height() - 50}, 0xFFFFFF, true);
graph.rectangle(rectangle{0, 0, graph.width(), graph.height() - 50}, true, colors::white);
if(ico_.empty() == false)
ico_.stretch(ico_.size(), graph, ::nana::rectangle{12, 25, 32, 32});
ico_.stretch(ico_.size(), graph, rectangle{12, 25, 32, 32});
});
unsigned width_pixel = 45;
@ -298,7 +298,7 @@ namespace nana
{
nana::paint::pixel_buffer pxbuf(32, 32);
pxbuf.put(reinterpret_cast<const unsigned char*>(rawpx), 32, 32, 32, 4*32, true);
ico_.make(32, 32);
ico_.make({32, 32});
pxbuf.paste(ico_.handle(), 0, 0);
}
}
@ -869,6 +869,8 @@ namespace nana
window inputbox::date::create(window parent, unsigned label_px)
{
auto today = ::nana::date().read();
auto impl = impl_.get();
impl->dock.create(parent);
@ -887,7 +889,7 @@ namespace nana
left += 104;
impl->wdg_day.create(impl->dock, rectangle{ left, 0, 38, 0 });
impl->wdg_day.range(1, 31, 1);
impl->wdg_day.range(1, ::nana::date::month_days(today.year, today.month), 1);
impl->wdg_day.set_accept_integer();
left += 48;
@ -895,15 +897,14 @@ namespace nana
impl->wdg_year.range(1601, 9999, 1);
impl->wdg_year.set_accept_integer();
auto date = ::nana::date().read();
impl->wdg_month.option(date.month - 1);
impl->wdg_month.option(today.month - 1);
std::wstringstream ss;
ss << date.day;
ss << today.day;
impl->wdg_day.value(ss.str());
ss.str(L"");
ss.clear();
ss << date.year;
ss << today.year;
impl->wdg_year.value(ss.str());
impl->dock.events().resized.connect_unignorable([impl, label_px](const ::nana::arg_resized& arg)
@ -935,21 +936,15 @@ namespace nana
auto make_days = [impl]
{
int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
auto month = impl->wdg_month.option() + 1;
if (2 == month)
{
auto year = impl->wdg_year.to_int();
if (((0 == year % 4) && (year % 100)) || (0 == (year % 400)))
days[1] = 29;
}
auto year = impl->wdg_year.to_int();
int days = ::nana::date::month_days(year, month);
auto day = impl->wdg_day.to_int();
impl->wdg_day.range(1, days[month - 1], 1); //It resets the current value of wdg_day
impl->wdg_day.range(1, days, 1); //It resets the current value of wdg_day
if (day > days[month - 1])
day = days[month - 1];
if (day > days)
day = days;
std::wstringstream ss;
ss << day;

View File

@ -47,8 +47,7 @@ namespace nana
#else
if (0 == index_)
{
position_.x = position_.y = 0;
size_ = detail::native_interface::primary_monitor_size();
area_ = detail::native_interface::primary_monitor_size();
return;
}
#endif
@ -61,7 +60,7 @@ namespace nana
}
public:
//Implementation of display
std::size_t index() const override
std::size_t get_index() const override
{
return index_;
}
@ -72,7 +71,7 @@ namespace nana
}
private:
const std::size_t index_;
::nana::rectangle area_;
::nana::rectangle area_;
};
//class screen

View File

@ -20,6 +20,9 @@
namespace nana
{
arg_combox::arg_combox(combox& wdg): widget(wdg)
{}
namespace drawerbase
{
namespace combox
@ -29,7 +32,7 @@ namespace nana
{
public:
event_agent(::nana::combox& wdg)
: widget_{wdg}
: widget_(wdg)
{}
void first_change() override{} //empty, because combox does not have this event.

View File

@ -3663,7 +3663,7 @@ namespace nana
}
}//end namespace drawerbase
arg_listbox::arg_listbox(drawerbase::listbox::item_proxy& m, bool selected)
arg_listbox::arg_listbox(const drawerbase::listbox::item_proxy& m, bool selected)
: item(m), selected(selected)
{

View File

@ -4,7 +4,7 @@
namespace nana
{
arg_slider::arg_slider(slider& wdg)
: widget{ wdg }
: widget(wdg)
{}
namespace drawerbase

View File

@ -7,7 +7,7 @@
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*
* @file: nana/gui/widgets/spanbox.cpp
* @file: nana/gui/widgets/spinbox.cpp
*/
#include <nana/gui/widgets/spinbox.hpp>
@ -17,6 +17,9 @@
namespace nana
{
arg_spinbox::arg_spinbox(spinbox& wdg): widget(wdg)
{}
namespace drawerbase
{
namespace spinbox
@ -26,7 +29,7 @@ namespace nana
{
public:
event_agent(::nana::spinbox& wdg)
: widget_{ wdg }
: widget_(wdg)
{}
void first_change() override{} //empty, because spinbox does not have this event.
@ -685,4 +688,4 @@ namespace nana
API::refresh_window(*this);
}
}
}//end namespace nana
}//end namespace nana

View File

@ -18,7 +18,7 @@
namespace nana
{
arg_textbox::arg_textbox(textbox& wdg)
: widget{wdg}
: widget(wdg)
{}
namespace drawerbase {

View File

@ -18,7 +18,7 @@
namespace nana
{
arg_toolbar::arg_toolbar(toolbar& tbar, std::size_t btn)
: widget{ tbar }, button{btn}
: widget(tbar), button{btn}
{}
namespace drawerbase

View File

@ -19,7 +19,7 @@
namespace nana
{
arg_treebox::arg_treebox(treebox& wdg, drawerbase::treebox::item_proxy& m, bool op)
: widget{ wdg }, item{ m }, operated{op}
: widget(wdg), item(m), operated{op}
{}
namespace drawerbase
@ -74,7 +74,92 @@ namespace nana
return nullptr;
}
class tooltip_window;
class tlwnd_drawer
: public drawer_trigger, public compset_interface
{
public:
typedef drawer_trigger::graph_reference graph_reference;
void assign(const item_attribute_t & item_attr, const pat::cloneable<renderer_interface>* renderer, const pat::cloneable<compset_placer_interface> * compset_placer)
{
if(renderer && compset_placer)
{
renderer_ = *renderer;
placer_ = *compset_placer;
item_attr_ = item_attr;
_m_draw();
}
}
private:
void _m_draw()
{
item_r_.x = item_r_.y = 0;
item_r_.width = placer_->item_width(*this->graph_, item_attr_);
item_r_.height = placer_->item_height(*this->graph_);
comp_attribute_t attr;
if(comp_attribute(component::text, attr))
{
nana::paint::graphics item_graph({ item_r_.width, item_r_.height });
item_graph.typeface(graph_->typeface());
renderer_->set_color(widget_->bgcolor(), widget_->fgcolor());
renderer_->bground(item_graph, this);
renderer_->expander(item_graph, this);
renderer_->crook(item_graph, this);
renderer_->icon(item_graph, this);
renderer_->text(item_graph, this);
item_graph.paste(attr.area, *graph_, 1, 1);
graph_->rectangle(false, colors::black);
}
}
private:
// Implementation of drawer_trigger
void attached(widget_reference wd, graph_reference graph) override
{
widget_ = &wd;
graph_ = &graph;
graph.typeface(widget_->typeface());
}
private:
// Implementation of compset_interface
virtual const item_attribute_t& item_attribute() const override
{
return item_attr_;
}
virtual bool comp_attribute(component_t comp, comp_attribute_t& comp_attr) const override
{
comp_attr.area = item_r_;
return placer_->locate(comp, item_attr_, &comp_attr.area);
}
private:
::nana::paint::graphics * graph_;
::nana::pat::cloneable<renderer_interface> renderer_;
::nana::pat::cloneable<compset_placer_interface> placer_;
widget *widget_;
item_attribute_t item_attr_;
nana::rectangle item_r_;
};//end class tlwnd_drawer
class tooltip_window
: public widget_object<category::root_tag, tlwnd_drawer>
{
public:
tooltip_window(window wd, const rectangle& r)
: widget_object<category::root_tag, tlwnd_drawer>(wd, false, rectangle(r).pare_off(-1), appear::bald<appear::floating>())
{
API::take_active(handle(), false, nullptr);
}
drawer_trigger_t & impl()
{
return get_drawer_trigger();
}
};//end class tooltip_window
//item_locator should be defined before the definition of basic_implement
class trigger::item_locator
@ -1368,94 +1453,6 @@ namespace nana
//Treebox Implementation
namespace treebox
{
class tlwnd_drawer
: public drawer_trigger, public compset_interface
{
public:
typedef drawer_trigger::graph_reference graph_reference;
void assign(const item_attribute_t & item_attr, const pat::cloneable<renderer_interface>* renderer, const pat::cloneable<compset_placer_interface> * compset_placer)
{
if(renderer && compset_placer)
{
renderer_ = *renderer;
placer_ = *compset_placer;
item_attr_ = item_attr;
_m_draw();
}
}
private:
void _m_draw()
{
item_r_.x = item_r_.y = 0;
item_r_.width = placer_->item_width(*this->graph_, item_attr_);
item_r_.height = placer_->item_height(*this->graph_);
comp_attribute_t attr;
if(comp_attribute(component::text, attr))
{
nana::paint::graphics item_graph({ item_r_.width, item_r_.height });
item_graph.typeface(graph_->typeface());
renderer_->set_color(widget_->bgcolor(), widget_->fgcolor());
renderer_->bground(item_graph, this);
renderer_->expander(item_graph, this);
renderer_->crook(item_graph, this);
renderer_->icon(item_graph, this);
renderer_->text(item_graph, this);
item_graph.paste(attr.area, *graph_, 1, 1);
graph_->rectangle(false, colors::black);
}
}
private:
// Implementation of drawer_trigger
void attached(widget_reference wd, graph_reference graph) override
{
widget_ = &wd;
graph_ = &graph;
graph.typeface(widget_->typeface());
}
private:
// Implementation of compset_interface
virtual const item_attribute_t& item_attribute() const override
{
return item_attr_;
}
virtual bool comp_attribute(component_t comp, comp_attribute_t& comp_attr) const override
{
comp_attr.area = item_r_;
return placer_->locate(comp, item_attr_, &comp_attr.area);
}
private:
::nana::paint::graphics * graph_;
::nana::pat::cloneable<renderer_interface> renderer_;
::nana::pat::cloneable<compset_placer_interface> placer_;
widget *widget_;
item_attribute_t item_attr_;
nana::rectangle item_r_;
};//end class tlwnd_drawer
class tooltip_window
: public widget_object<category::root_tag, tlwnd_drawer>
{
public:
tooltip_window(window wd, const rectangle& r)
: widget_object<category::root_tag, tlwnd_drawer>(wd, false, rectangle(r).pare_off(-1), appear::bald<appear::floating>())
{
API::take_active(handle(), false, nullptr);
}
drawer_trigger_t & impl()
{
return get_drawer_trigger();
}
};//end class tooltip_window
//class trigger
//struct treebox_node_type
trigger::treebox_node_type::treebox_node_type()

View File

@ -191,7 +191,7 @@ namespace detail
{
(*glyphs++) = XftCharIndex(disp, fs, *chr);
}
XftDrawGlyphs(dw->xftdraw, &(dw->xft_fgcolor), fs, x, y + fs->ascent, glyphs_ptr.get(), len);
XftDrawGlyphs(dw->xftdraw, &(dw->xft_fgcolor), fs, pos.x, pos.y + fs->ascent, glyphs_ptr.get(), len);
#else
XFontSet fs = reinterpret_cast<XFontSet>(dw->font->handle);
XFontSetExtents * ext = ::XExtentsOfFontSet(fs);

View File

@ -1009,9 +1009,8 @@ namespace paint
handle_->update_color();
::XDrawLine(disp, handle_->pixmap, handle_->context,
handle_->line_begin_pos.x, handle_->line_begin_pos.y,
x, y);
handle_->line_begin_pos.x = x;
handle_->line_begin_pos.y = y;
pos.x, pos.y);
handle_->line_begin_pos = pos;
#endif
if (changed_ == false) changed_ = true;
}
@ -1064,18 +1063,18 @@ namespace paint
line_to({ r.x, r.y }, left_clr);
}
void graphics::gradual_rectangle(const ::nana::rectangle& r, const ::nana::color& from, const ::nana::color& to, bool vertical)
void graphics::gradual_rectangle(const ::nana::rectangle& rct, const ::nana::color& from, const ::nana::color& to, bool vertical)
{
#if defined(NANA_WINDOWS)
if (pxbuf_.open(handle_))
{
pxbuf_.gradual_rectangle(r, from, to, 0.0, vertical);
pxbuf_.gradual_rectangle(rct, from, to, 0.0, vertical);
pxbuf_.paste(handle_, 0, 0);
}
#elif defined(NANA_X11)
if (nullptr == handle_) return;
double deltapx = double(vertical ? height : width);
double deltapx = double(vertical ? rct.height : rct.width);
double r, g, b;
const double delta_r = (to.r() - (r = from.r())) / deltapx;
const double delta_g = (to.g() - (g = from.g())) / deltapx;
@ -1084,13 +1083,14 @@ namespace paint
unsigned last_color = (int(r) << 16) | (int(g) << 8) | int(b);
Display * disp = nana::detail::platform_spec::instance().open_display();
handle_->fgcolor(last_color);
const int endpos = deltapx + (vertical ? y : x);
handle_->fgcolor(static_cast<color_rgb>(last_color));
const int endpos = deltapx + (vertical ? rct.y : rct.x);
if (endpos > 0)
{
if (vertical)
{
int x1 = x, x2 = x + static_cast<int>(width);
int x1 = rct.x, x2 = rct.right();
auto y = rct.y;
for (; y < endpos; ++y)
{
::XDrawLine(disp, handle_->pixmap, handle_->context, x1, y, x2, y);
@ -1098,13 +1098,14 @@ namespace paint
if (new_color != last_color)
{
last_color = new_color;
handle_->fgcolor(last_color);
handle_->fgcolor(static_cast<color_rgb>(last_color));
}
}
}
else
{
int y1 = y, y2 = y + static_cast<int>(height);
int y1 = rct.y, y2 = rct.bottom();
auto x = rct.x;
for (; x < endpos; ++x)
{
::XDrawLine(disp, handle_->pixmap, handle_->context, x, y1, x, y2);
@ -1112,7 +1113,7 @@ namespace paint
if (new_color != last_color)
{
last_color = new_color;
handle_->fgcolor(last_color);
handle_->fgcolor(static_cast<color_rgb>(last_color));
}
}
}
@ -1141,15 +1142,15 @@ namespace paint
}
if(changed_ == false) changed_ = true;
#elif defined(NANA_X11)
if(solid && (color == solid_clr))
if(solid && (clr == solid_clr))
{
rectangle(r, true, color);
rectangle(r, true, clr);
}
else
{
rectangle(r, false, color);
rectangle(r, false, clr);
if(solid)
rectangle(rectangle(r).pare_off(1), true, solid_clr);
rectangle(::nana::rectangle(r).pare_off(1), true, solid_clr);
}
#endif
}