X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/ddc3964ed95d01e72229dc9af968a327cd84e56c..033a2333874297c1c388ecf4532de2bc2b11fb30:/lib/gui/ewindow.cpp diff --git a/lib/gui/ewindow.cpp b/lib/gui/ewindow.cpp index 1afee2ee..622e8b0a 100644 --- a/lib/gui/ewindow.cpp +++ b/lib/gui/ewindow.cpp @@ -2,13 +2,37 @@ #include #include +#include + +#include eWindow::eWindow(eWidgetDesktop *desktop): eWidget(0) { + m_flags = 0; + /* ask style manager for current style */ + ePtr mgr; + eWindowStyleManager::getInstance(mgr); + + ePtr style; + if (mgr) + mgr->getStyle(style); + + /* when there is either no style manager or no style, revert to simple style. */ + if (!style) + style = new eWindowStyleSimple(); + + setStyle(style); + + /* we are the parent for the child window. */ + /* as we are in the constructor, this is thread safe. */ + m_child = this; m_child = new eWidget(this); desktop->addRootWidget(this, 0); - - m_style = new eWindowStyleSimple(); +} + +eWindow::~eWindow() +{ + getDesktop()->removeRootWidget(this); } void eWindow::setTitle(const std::string &string) @@ -19,25 +43,55 @@ void eWindow::setTitle(const std::string &string) event(evtTitleChanged); } +void eWindow::setFlag(int flags) +{ + m_flags |= flags; +} + +void eWindow::clearFlag(int flags) +{ + m_flags &= ~flags; +} + int eWindow::event(int event, void *data, void *data2) { switch (event) { case evtWillChangeSize: { - const eSize &new_size = *static_cast(data); - eDebug("eWindow::evtWillChangeSize to %d %d", new_size.width(), new_size.height()); - if (m_style) - m_style->handleNewSize(this, new_size); + eSize &new_size = *static_cast(data); + eSize &offset = *static_cast(data2); + if (!(m_flags & wfNoBorder)) + { + ePtr style; + if (!getStyle(style)) + { +// eDebug("eWindow::evtWillChangeSize to %d %d", new_size.width(), new_size.height()); + style->handleNewSize(this, new_size, offset); + } + } else + m_child->resize(new_size); break; } case evtPaint: { - gPainter &painter = *static_cast(data2); - painter.setBackgroundColor(gColor(0x18)); - painter.clear(); - break; + if (!(m_flags & wfNoBorder)) + { + ePtr style; + if (!getStyle(style)) + { + gPainter &painter = *static_cast(data2); + style->paintWindowDecoration(this, painter, m_title); + } + } + return 0; } + case evtTitleChanged: + /* m_visible_region contains, in contrast to m_visible_with_childs, + only the decoration. though repainting the whole decoration is bad, + repainting the whole window is even worse. */ + invalidate(m_visible_region); + break; default: break; }