From ba02fb4aced5868d047a5bffbd2ed87583daee4d Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Sun, 9 Jan 2005 16:29:34 +0000 Subject: [PATCH] - add more python stuff - fix some gui/gdi - add eslider - improve windowstyle --- components.py | 149 ++++++++++++++++++++++++++++++++++ lib/base/init_num.h | 1 + lib/gdi/epoint.h | 29 ++----- lib/gdi/erect.cpp | 1 - lib/gdi/erect.h | 24 ++++++ lib/gdi/esize.h | 22 ----- lib/gdi/font.cpp | 6 +- lib/gdi/grc.cpp | 23 +++++- lib/gdi/grc.h | 8 +- lib/gdi/region.cpp | 2 + lib/gui/Makefile.am | 2 +- lib/gui/ebutton.cpp | 14 +++- lib/gui/ebutton.h | 2 +- lib/gui/elabel.cpp | 15 ++-- lib/gui/eslider.cpp | 56 +++++++++++++ lib/gui/eslider.h | 24 ++++++ lib/gui/ewidget.cpp | 81 ++++++++++++++++--- lib/gui/ewidget.h | 19 ++++- lib/gui/ewidgetdesktop.cpp | 5 ++ lib/gui/ewidgetdesktop.h | 1 + lib/gui/ewindow.cpp | 35 +++++--- lib/gui/ewindow.h | 2 +- lib/gui/ewindowstyle.cpp | 53 ++++++++++++- lib/gui/ewindowstyle.h | 16 +++- lib/network/Makefile.am | 2 +- lib/network/http.cpp | 33 ++++++++ lib/network/http.h | 28 +++++++ lib/network/http_dyn.cpp | 20 +++-- lib/network/http_dyn.h | 12 ++- lib/network/http_file.cpp | 25 ++++-- lib/network/http_file.h | 8 +- lib/network/httpd.cpp | 43 ++++------ lib/network/httpd.h | 24 ++++-- lib/network/socket.cpp | 1 + lib/network/xmlrpc.h | 3 +- lib/python/enigma_python.i | 23 +++++- lib/service/iservice.h | 15 +++- main/enigma.cpp | 159 +++++++++++++++++-------------------- mytest.py | 141 +++++++++++++++++++++++++++----- screens.py | 42 ++++++++++ skin.py | 28 +++++++ 41 files changed, 953 insertions(+), 244 deletions(-) create mode 100644 components.py create mode 100644 lib/gui/eslider.cpp create mode 100644 lib/gui/eslider.h create mode 100644 lib/network/http.cpp create mode 100644 lib/network/http.h create mode 100644 screens.py create mode 100644 skin.py diff --git a/components.py b/components.py new file mode 100644 index 00000000..e66e43b1 --- /dev/null +++ b/components.py @@ -0,0 +1,149 @@ +from enigma import * +import time + +# some helper classes first: +class HTMLComponent: + def produceHTML(self): + return "" + +class HTMLSkin: + order = () + + def __init__(self, order): + self.order = order + + def produceHTML(self): + res = "\n" + for name in self.order: + res += self[name].produceHTML() + res += "\n"; + return res + +class GUISkin: + data = { } + def createGUIScreen(self, parent): + for (name, val) in self.items(): + self.data[name] = { } + val.GUIcreate(self.data[name], parent, None) + +class GUIComponent: + """ GUI component """ + + def __init__(self): + self.notifier = [ ] + + def GUIcreate(self, priv, parent, skindata): + i = self.GUIcreateInstance(self, parent, skindata) + priv["instance"] = i + print str(self) + " notifier list before " + str(self.notifier) + self.notifier.append(i) + print str(self) + " notifier list now " + str(self.notifier) + if self.notifierAdded: + self.notifierAdded(i) + +class VariableText: + """VariableText can be used for components which have a variable text, based on any widget with setText call""" + + def __init__(self): + self.message = "" + + def notifierAdded(self, notifier): + notifier.setText(self.message) + + def setText(self, text): + if self.message != text: + self.message = text + print self.notifier + for x in self.notifier: + x.setText(self.message) + + def getText(self): + return self.message + +class VariableValue: + """VariableValue can be used for components which have a variable value (like eSlider), based on any widget with setValue call""" + + def __init__(self): + self.value = 0 + + def notifierAdded(self, notifier): + notifier.setValue(self.value) + + def setValue(self, value): + if self.value != value: + self.value = value + for x in self.notifier: + x.setValue(self.value) + + def getValue(self): + return self.value + +# now some "real" components: + +class Clock(HTMLComponent, GUIComponent, VariableText): + def __init__(self): + VariableText.__init__(self) + GUIComponent.__init__(self) + self.doClock() + +# "funktionalitaet" + def doClock(self): + self.setText("clock: " + time.asctime()) + +# realisierung als GUI + def GUIcreateInstance(self, priv, parent, skindata): + g = eLabel(parent) + return g + +# ...und als HTML: + def produceHTML(self): + return self.getText() + +class Button(HTMLComponent, GUIComponent, VariableText): + onClick = {} + + def __init__(self, text=""): + GUIComponent.__init__(self) + VariableText.__init__(self) + self.setText(text) + + def click(self): + for x in self.onClick: + x() + +# html: + def produceHTML(self): + return "\n" + +# GUI: + def GUIcreateInstance(self, priv, parent, skindata): + g = eButton(parent) +# g.clicked = [ self.click ] + return g + +class Header(HTMLComponent, GUIComponent, VariableText): + + def __init__(self, message): + GUIComponent.__init__(self) + VariableText.__init__(self) + self.setText(message) + + def produceHTML(self): + return "

" + self.getText() + "

\n" + + def GUIcreateInstance(self, priv, parent, skindata): + g = eLabel(parent) + g.setText(self.message) + return g + +class VolumeBar(HTMLComponent, GUIComponent, VariableValue): + + def __init__(self): + GUIComponent.__init__(self) + VariableValue.__init__(self) + + def GUIcreateInstance(self, priv, parent, skindata): + g = eSlider(parent) + g.setRange(0, 100) + return g + diff --git a/lib/base/init_num.h b/lib/base/init_num.h index a9da0624..a9431c6b 100644 --- a/lib/base/init_num.h +++ b/lib/base/init_num.h @@ -8,6 +8,7 @@ namespace eAutoInitNumbers { configuration=0, lowlevel=configuration+increment, + network=lowlevel, graphic=lowlevel+increment, skin=graphic+increment, rc=skin+increment, diff --git a/lib/gdi/epoint.h b/lib/gdi/epoint.h index fc5f9836..d7cdf399 100644 --- a/lib/gdi/epoint.h +++ b/lib/gdi/epoint.h @@ -1,8 +1,6 @@ #ifndef EPOINT_H #define EPOINT_H -#include - #ifndef ABS #define ABS(x) ( x>0 ? x : -x ) #endif @@ -35,7 +33,9 @@ public: friend inline bool operator==( const ePoint &, const ePoint & ); friend inline bool operator!=( const ePoint &, const ePoint & ); friend inline ePoint operator+( const ePoint &, const ePoint & ); + friend inline ePoint operator+( const ePoint &, const eSize & ); friend inline ePoint operator-( const ePoint &, const ePoint & ); + friend inline ePoint operator-( const ePoint &, const eSize & ); friend inline ePoint operator*( const ePoint &, int ); friend inline ePoint operator*( int, const ePoint & ); friend inline ePoint operator*( const ePoint &, double ); @@ -55,25 +55,6 @@ inline int ePoint::manhattanLength() const } -/***************************************************************************** - ePoint stream functions - *****************************************************************************/ -namespace std -{ - inline ostream &operator<<( ostream & s, const ePoint & p ) - { - s << p.x() << p.y(); - return s; - } - - inline istream &operator>>( istream & s, ePoint & p ) - { - s >> p.rx() >> p.ry(); - return s; - } -} - - /***************************************************************************** ePoint inline functions *****************************************************************************/ @@ -129,6 +110,12 @@ inline ePoint operator+( const ePoint &p1, const ePoint &p2 ) inline ePoint operator-( const ePoint &p1, const ePoint &p2 ) { return ePoint(p1.xp-p2.xp, p1.yp-p2.yp); } +inline ePoint operator+( const ePoint &p1, const eSize &p2 ) +{ return ePoint(p1.xp+p2.width(), p1.yp+p2.height()); } + +inline ePoint operator-( const ePoint &p1, const eSize &p2 ) +{ return ePoint(p1.xp-p2.width(), p1.yp-p2.height()); } + inline ePoint operator*( const ePoint &p, int c ) { return ePoint(p.xp*c, p.yp*c); } diff --git a/lib/gdi/erect.cpp b/lib/gdi/erect.cpp index a3878797..43cefc53 100644 --- a/lib/gdi/erect.cpp +++ b/lib/gdi/erect.cpp @@ -1,5 +1,4 @@ #include -#include /***************************************************************************** eRect member functions diff --git a/lib/gdi/erect.h b/lib/gdi/erect.h index a67d0fb9..65fd8d71 100644 --- a/lib/gdi/erect.h +++ b/lib/gdi/erect.h @@ -52,6 +52,18 @@ public: ePoint bottomRight() const; ePoint topRight() const; ePoint bottomLeft() const; + + /* the sole intention of these functions + is to allow painting frames without + messing around with the coordinates. + they point to the last pixel included + in the rectangle (which means that 1 is + subtracted from the right and bottom + coordinates */ + ePoint topLeft1() const; + ePoint bottomRight1() const; + ePoint topRight1() const; + ePoint bottomLeft1() const; ePoint center() const; void rect( int *x, int *y, int *w, int *h ) const; @@ -196,6 +208,18 @@ inline ePoint eRect::topRight() const inline ePoint eRect::bottomLeft() const { return ePoint(x1, y2); } +inline ePoint eRect::topLeft1() const +{ return ePoint(x1, y1); } + +inline ePoint eRect::bottomRight1() const +{ return ePoint(x2-1, y2-1); } + +inline ePoint eRect::topRight1() const +{ return ePoint(x2-1, y1); } + +inline ePoint eRect::bottomLeft1() const +{ return ePoint(x1, y2-1); } + inline ePoint eRect::center() const { return ePoint((x1+x2)/2, (y1+y2)/2); } diff --git a/lib/gdi/esize.h b/lib/gdi/esize.h index d4bd4afb..de0a6ecb 100644 --- a/lib/gdi/esize.h +++ b/lib/gdi/esize.h @@ -1,8 +1,6 @@ #ifndef ESIZE_H #define ESIZE_H -#include - #define MIN(a,b) (a < b ? a : b) #define MAX(a,b) (a > b ? a : b) @@ -52,26 +50,6 @@ private: }; -/***************************************************************************** - eSize stream functions - *****************************************************************************/ - -namespace std -{ - inline ostream &operator<<( ostream &s, const eSize &sz ) - { - s << sz.width() << sz.height(); - return s; - } - - inline istream &operator>>( istream &s, eSize &sz ) - { - s >> sz.rwidth() >> sz.rheight(); - return s; - } -} - - /***************************************************************************** eSize inline functions *****************************************************************************/ diff --git a/lib/gdi/font.cpp b/lib/gdi/font.cpp index ee228576..f7c62209 100644 --- a/lib/gdi/font.cpp +++ b/lib/gdi/font.cpp @@ -63,9 +63,9 @@ static gLookup &getColor(const gPalette &pal, const gRGB &start, const gRGB &end eDebug("[FONT] creating new font color cache entry %02x%02x%02x%02x .. %02x%02x%02x%02x", start.a, start.r, start.g, start.b, end.a, end.r, end.g, end.b); n.build(16, pal, start, end); -/* for (int i=0; i<16; i++) + for (int i=0; i<16; i++) eDebugNoNewLine("%02x|%02x%02x%02x%02x ", (int)n.lookup[i], pal.data[n.lookup[i]].a, pal.data[n.lookup[i]].r, pal.data[n.lookup[i]].g, pal.data[n.lookup[i]].b); - eDebug("");*/ + eDebug(""); return n; } @@ -675,6 +675,7 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons continue; int rx=i->x+glyph_bitmap->left + offset.x(); int ry=i->y-glyph_bitmap->top + offset.y(); + __u8 *d=(__u8*)(surface->data)+buffer_stride*ry+rx*surface->bypp; __u8 *s=glyph_bitmap->buffer; register int sx=glyph_bitmap->width; @@ -706,6 +707,7 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons { register __u8 *td=d; register int ax; + for (ax=0; ax>4; diff --git a/lib/gdi/grc.cpp b/lib/gdi/grc.cpp index 4597034f..cb2a6de9 100644 --- a/lib/gdi/grc.cpp +++ b/lib/gdi/grc.cpp @@ -164,6 +164,17 @@ void gPainter::fill(const eRect &area) m_rc->submit(o); } +void gPainter::fill(const gRegion ®ion) +{ + gOpcode o; + o.opcode=gOpcode::fillRegion; + + o.dc = m_dc.grabRef(); + o.parm.fillRegion = new gOpcode::para::pfillRegion; + o.parm.fillRegion->region = region; + m_rc->submit(o); +} + void gPainter::clear() { gOpcode o; @@ -332,13 +343,13 @@ void gDC::exec(gOpcode *o) assert(m_current_font); para->setFont(m_current_font); para->renderString(o->parm.renderText->text, o->parm.renderText->flags); - para->blit(*this, m_current_offset, getRGB(m_foreground_color), getRGB(m_background_color)); + para->blit(*this, m_current_offset, getRGB(m_background_color), getRGB(m_foreground_color)); delete o->parm.renderText; break; } case gOpcode::renderPara: { - o->parm.renderPara->textpara->blit(*this, o->parm.renderPara->offset + m_current_offset, getRGB(m_foreground_color), getRGB(m_background_color)); + o->parm.renderPara->textpara->blit(*this, o->parm.renderPara->offset + m_current_offset, getRGB(m_background_color), getRGB(m_foreground_color)); o->parm.renderPara->textpara->Release(); delete o->parm.renderPara; break; @@ -352,6 +363,14 @@ void gDC::exec(gOpcode *o) delete o->parm.fill; break; } + case gOpcode::fillRegion: + { + o->parm.fillRegion->region.moveBy(m_current_offset); + gRegion clip = m_current_clip & o->parm.fillRegion->region; + m_pixmap->fill(clip, m_foreground_color); + delete o->parm.fillRegion; + break; + } case gOpcode::clear: m_pixmap->fill(m_current_clip, m_background_color); delete o->parm.fill; diff --git a/lib/gdi/grc.h b/lib/gdi/grc.h index a02068ae..d6a3cd70 100644 --- a/lib/gdi/grc.h +++ b/lib/gdi/grc.h @@ -29,7 +29,7 @@ struct gOpcode renderPara, setFont, - fill, clear, + fill, fillRegion, clear, blit, setPalette, @@ -55,6 +55,11 @@ struct gOpcode eRect area; } *fill; + struct pfillRegion + { + gRegion region; + } *fillRegion; + struct prenderText { eRect area; @@ -173,6 +178,7 @@ public: void renderPara(eTextPara *para, ePoint offset=ePoint(0, 0)); void fill(const eRect &area); + void fill(const gRegion &area); void clear(); diff --git a/lib/gdi/region.cpp b/lib/gdi/region.cpp index f79b403f..d75221fe 100644 --- a/lib/gdi/region.cpp +++ b/lib/gdi/region.cpp @@ -325,6 +325,8 @@ void gRegion::regionOp(const gRegion ®1, const gRegion ®2, int opcode, int for (unsigned int a = 0; a style; + + getStyle(style); + + eLabel::event(event, data, data2); + style->drawButtonFrame(painter, eRect(ePoint(0, 0), size())); + + return 0; + } default: break; } diff --git a/lib/gui/ebutton.h b/lib/gui/ebutton.h index 31c9cb3c..25087077 100644 --- a/lib/gui/ebutton.h +++ b/lib/gui/ebutton.h @@ -7,7 +7,7 @@ class eButton: public eLabel { public: eButton(eWidget *parent); - Signal0 selected; +// Signal0 selected; void push(); protected: diff --git a/lib/gui/elabel.cpp b/lib/gui/elabel.cpp index f133b661..f9dcf31b 100644 --- a/lib/gui/elabel.cpp +++ b/lib/gui/elabel.cpp @@ -11,15 +11,18 @@ int eLabel::event(int event, void *data, void *data2) { case evtPaint: { + ePtr style; + + getStyle(style); + + eWidget::event(event, data, data2); + gPainter &painter = *(gPainter*)data2; - ePtr fnt = new gFont("Arial", 70); + ePtr fnt = new gFont("Arial", 14); painter.setFont(fnt); - painter.setBackgroundColor(gColor(0x10)); - painter.setForegroundColor(gColor(0x1f)); - painter.clear(); - painter.setBackgroundColor(gColor(0x1f)); - painter.setForegroundColor(gColor(0x10)); + style->setForegroundStyle(painter); painter.renderText(eRect(0, 0, size().width(), size().height()), m_text); + return 0; } case evtChangedText: diff --git a/lib/gui/eslider.cpp b/lib/gui/eslider.cpp new file mode 100644 index 00000000..20b3ab47 --- /dev/null +++ b/lib/gui/eslider.cpp @@ -0,0 +1,56 @@ +#include + +eSlider::eSlider(eWidget *parent): eWidget(parent) +{ +} + +int eSlider::event(int event, void *data, void *data2) +{ + switch (event) + { + case evtPaint: + { + ePtr style; + gPainter &painter = *(gPainter*)data2; + + + getStyle(style); + style->paintBackground(painter, ePoint(0, 0), size()); + style->setForegroundStyle(painter); + painter.fill(m_currently_filled); + + return 0; + } + case evtChangedSlider: + { + + int num_pix = 0; + if (m_min < m_max) + num_pix = size().width() * m_value / (m_max - m_min); + gRegion old_currently_filled = m_currently_filled; + m_currently_filled = eRect(0, 0, num_pix, size().height()); + + // redraw what *was* filled before and now isn't. + invalidate(m_currently_filled - old_currently_filled); + // redraw what wasn't filled before and is now. + invalidate(old_currently_filled - m_currently_filled); + + return 0; + } + default: + return eWidget::event(event, data, data2); + } +} + +void eSlider::setValue(int value) +{ + m_value = value; + event(evtChangedSlider); +} + +void eSlider::setRange(int min, int max) +{ + m_min = min; + m_max = max; + event(evtChangedSlider); +} diff --git a/lib/gui/eslider.h b/lib/gui/eslider.h new file mode 100644 index 00000000..5b7b59f0 --- /dev/null +++ b/lib/gui/eslider.h @@ -0,0 +1,24 @@ +#ifndef __lib_gui_eslider_h +#define __lib_gui_eslider_h + +#include + +class eSlider: public eWidget +{ +public: + eSlider(eWidget *parent); + void setValue(int val); + void setRange(int min, int max); +protected: + int event(int event, void *data=0, void *data2=0); +private: + enum eSliderEvent + { + evtChangedSlider = evtUserWidget + }; + int m_min, m_max, m_value; + + gRegion m_currently_filled; +}; + +#endif diff --git a/lib/gui/ewidget.cpp b/lib/gui/ewidget.cpp index 89fbfe95..3ebac357 100644 --- a/lib/gui/ewidget.cpp +++ b/lib/gui/ewidget.cpp @@ -3,34 +3,68 @@ extern void dumpRegion(const gRegion ®ion); -eWidget::eWidget(eWidget *parent): m_parent(parent) +eWidget::eWidget(eWidget *parent): m_parent(parent ? parent->child() : 0) { m_vis = 0; m_desktop = 0; - if (parent) + if (m_parent) m_vis = wVisShow; - if (parent) - parent->m_childs.push_back(this); + if (m_parent) + { + m_parent->m_childs.push_back(this); + m_parent->getStyle(m_style); + } } void eWidget::move(ePoint pos) { + if (m_position == pos) + return; + m_position = pos; + /* we invalidate before and after the move to + cause a correct redraw. The area which is + included both before and after isn't redrawn + twice because a invalidate doesn't immediately + redraws the region. */ + invalidate(); event(evtChangedPosition); + recalcClipRegionsWhenVisible(); + invalidate(); } void eWidget::resize(eSize size) { + /* same strategy as with move: we first check if + the size changed at all, and if it did, we + invalidate both the old and new area. + TODO: check if either the old or new area + fits into the other completely, and invalidate + only once. */ + eSize old_size = m_size; event(evtWillChangeSize, &size); + if (old_size == m_size) + return; + + invalidate(); event(evtChangedSize); + recalcClipRegionsWhenVisible(); + invalidate(); } void eWidget::invalidate(const gRegion ®ion) { - gRegion res = /* region & */ m_visible_with_childs; + /* we determine the area to redraw, and re-position this + area to the absolute position, and then call the + desktop's invalidate() with that, which adds this + area into the dirty region. */ + gRegion res = m_visible_with_childs; + if (region.valid()) + res &= region; + if (res.empty()) return; @@ -103,10 +137,14 @@ void eWidget::destruct() eWidget::~eWidget() { + if (m_parent) + m_parent->m_childs.remove(this); + /* destroy all childs */ ePtrList::iterator i(m_childs.begin()); while (i != m_childs.end()) { + (*i)->m_parent = 0; delete *i; i = m_childs.erase(i); } @@ -129,24 +167,45 @@ void eWidget::doPaint(gPainter &painter, const gRegion &r) /* check if there's anything for us to paint */ region &= m_visible_region; - painter.resetClip(region); - event(evtPaint, ®ion, &painter); + if (!region.empty()) + { + painter.resetClip(region); + event(evtPaint, ®ion, &painter); + } painter.moveOffset(-position()); } +void eWidget::recalcClipRegionsWhenVisible() +{ + eWidget *t = this; + do + { + if (!(t->m_vis & wVisShow)) + break; + if (t->m_desktop) + { + t->m_desktop->recalcClipRegions(); + break; + } + t = t->m_parent; + assert(t); + } while(1); +} + int eWidget::event(int event, void *data, void *data2) { switch (event) { case evtPaint: { - static int counter = 0x18; gPainter &painter = *(gPainter*)data2; -// eDebug("eWidget::evtPaint %d", counter); + +// eDebug("eWidget::evtPaint"); // dumpRegion(*(gRegion*)data); - painter.setBackgroundColor(gColor(++counter)); - painter.clear(); + ePtr style; + if (!getStyle(style)) + style->paintBackground(painter, ePoint(0, 0), size()); break; } case evtKey: diff --git a/lib/gui/ewidget.h b/lib/gui/ewidget.h index a551b8a3..fa8cd8ca 100644 --- a/lib/gui/ewidget.h +++ b/lib/gui/ewidget.h @@ -3,6 +3,9 @@ #include /* for gRegion */ #include /* for eSmartPtrList */ +#include /* for eWindowStyle */ + +class eWindowStyle; class eWidget { @@ -17,11 +20,21 @@ public: eSize size() const { return m_size; } void invalidate(const gRegion ®ion = gRegion::invalidRegion()); + + /* the window were to attach childs to. Normally, this + is "this", but it can be overridden in case a widget + has a "client area", which is implemented as a child + widget. eWindow overrides this, for example. */ + virtual eWidget *child() { return this; } void show(); void hide(); void destruct(); + + int getStyle(ePtr &style) { if (!m_style) return 1; style = m_style; return 0; } + void setStyle(eWindowStyle *style) { m_style = style; } + private: eWidgetDesktop *m_desktop; @@ -33,12 +46,14 @@ private: int m_vis; ePtrList m_childs; - eWidget *m_parent; ePoint m_position; eSize m_size; + eWidget *m_parent; + ePtr m_style; void doPaint(gPainter &painter, const gRegion ®ion); + void recalcClipRegionsWhenVisible(); protected: virtual ~eWidget(); public: @@ -63,4 +78,6 @@ public: virtual int event(int event, void *data = 0, void *data2 = 0); }; +extern eWidgetDesktop *getDesktop(); + #endif diff --git a/lib/gui/ewidgetdesktop.cpp b/lib/gui/ewidgetdesktop.cpp index 10c92b71..ff913680 100644 --- a/lib/gui/ewidgetdesktop.cpp +++ b/lib/gui/ewidgetdesktop.cpp @@ -11,6 +11,11 @@ void eWidgetDesktop::addRootWidget(eWidget *root, int top) root->m_desktop = this; } +void eWidgetDesktop::removeRootWidget(eWidget *root) +{ + m_root.remove(root); +} + void eWidgetDesktop::calcWidgetClipRegion(eWidget *widget, gRegion &parent_visible) { /* start with our clip region, clipped with the parent's */ diff --git a/lib/gui/ewidgetdesktop.h b/lib/gui/ewidgetdesktop.h index 197693f8..42e6b61e 100644 --- a/lib/gui/ewidgetdesktop.h +++ b/lib/gui/ewidgetdesktop.h @@ -16,6 +16,7 @@ public: eWidgetDesktop(eSize screen); ~eWidgetDesktop(); void addRootWidget(eWidget *root, int top); + void removeRootWidget(eWidget *root); void recalcClipRegions(); void invalidate(const gRegion ®ion); diff --git a/lib/gui/ewindow.cpp b/lib/gui/ewindow.cpp index 1afee2ee..630a8aa3 100644 --- a/lib/gui/ewindow.cpp +++ b/lib/gui/ewindow.cpp @@ -5,10 +5,18 @@ eWindow::eWindow(eWidgetDesktop *desktop): eWidget(0) { + setStyle(new eWindowStyleSimple()); + + /* 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) @@ -25,18 +33,25 @@ int eWindow::event(int event, void *data, void *data2) { 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); + ePtr style; + if (!getStyle(style)) + { + const eSize &new_size = *static_cast(data); + eDebug("eWindow::evtWillChangeSize to %d %d", new_size.width(), new_size.height()); + style->handleNewSize(this, new_size); + } break; } case evtPaint: { - gPainter &painter = *static_cast(data2); - painter.setBackgroundColor(gColor(0x18)); - painter.clear(); - break; + ePtr style; + if (!getStyle(style)) + { + gPainter &painter = *static_cast(data2); + style->paintWindowDecoration(this, painter, m_title); + } else + eDebug("no style :("); + return 0; } default: break; diff --git a/lib/gui/ewindow.h b/lib/gui/ewindow.h index 671a0079..f5bcd51a 100644 --- a/lib/gui/ewindow.h +++ b/lib/gui/ewindow.h @@ -11,6 +11,7 @@ class eWindow: public eWidget friend class eWindowStyle; public: eWindow(eWidgetDesktop *desktop); + ~eWindow(); void setTitle(const std::string &string); eWidget *child() { return m_child; } protected: @@ -22,7 +23,6 @@ protected: private: std::string m_title; eWidget *m_child; - ePtr m_style; }; #endif diff --git a/lib/gui/ewindowstyle.cpp b/lib/gui/ewindowstyle.cpp index 932a3102..778291c7 100644 --- a/lib/gui/ewindowstyle.cpp +++ b/lib/gui/ewindowstyle.cpp @@ -3,11 +3,23 @@ #include #include + +eWindowStyle::~eWindowStyle() {} + DEFINE_REF(eWindowStyleSimple); eWindowStyleSimple::eWindowStyleSimple() { - m_border_left = m_border_right = m_border_top = m_border_bottom = 10; + m_border_left = m_border_right = m_border_bottom = 1; + m_border_top = 30; + + m_fnt = new gFont("Arial", 25); + + m_border_color_tl = gColor(0x14); + m_border_color_br = gColor(0x1c); + m_title_color_back = gColor(0x20); + m_title_color = gColor(0x2f); + m_background_color = gColor(0x18); } void eWindowStyleSimple::handleNewSize(eWindow *wnd, const eSize &size) @@ -21,3 +33,42 @@ void eWindowStyleSimple::handleNewSize(eWindow *wnd, const eSize &size) child->move(ePoint(m_border_left, m_border_top)); child->resize(eSize(size.width() - m_border_left - m_border_right, size.height() - m_border_top - m_border_bottom)); } + +void eWindowStyleSimple::paintWindowDecoration(eWindow *wnd, gPainter &painter, const std::string &title) +{ + painter.setBackgroundColor(m_title_color_back); + painter.setForegroundColor(m_title_color); + painter.clear(); + painter.setFont(m_fnt); + painter.renderText(eRect(1, 1, wnd->size().width() - 2, m_border_top - 2), title); + + eRect frame(ePoint(0, 0), wnd->size()); + painter.setForegroundColor(m_border_color_tl); + painter.line(frame.topLeft1(), frame.topRight1()); + painter.line(frame.topRight1(), frame.bottomRight1()); + painter.setForegroundColor(m_border_color_br); + painter.line(frame.bottomRight1(), frame.bottomLeft1()); + painter.line(frame.bottomLeft1(), frame.topLeft1()); +} + +void eWindowStyleSimple::paintBackground(gPainter &painter, const ePoint &offset, const eSize &size) +{ + eDebug("eWindowStyleSimple::paintBackground"); + painter.setBackgroundColor(m_background_color); + painter.clear(); +} + +void eWindowStyleSimple::setForegroundStyle(gPainter &painter) +{ + painter.setForegroundColor(gColor(0x1F)); +} + +void eWindowStyleSimple::drawButtonFrame(gPainter &painter, const eRect &frame) +{ + painter.setForegroundColor(m_border_color_tl); + painter.line(frame.topLeft1(), frame.topRight1()); + painter.line(frame.topRight1(), frame.bottomRight1()); + painter.setForegroundColor(m_border_color_br); + painter.line(frame.bottomRight1(), frame.bottomLeft1()); + painter.line(frame.bottomLeft1(), frame.topLeft1()); +} diff --git a/lib/gui/ewindowstyle.h b/lib/gui/ewindowstyle.h index 02f155af..d5da5a34 100644 --- a/lib/gui/ewindowstyle.h +++ b/lib/gui/ewindowstyle.h @@ -3,6 +3,7 @@ class eWindow; class eSize; +class gFont; #include @@ -10,15 +11,28 @@ class eWindowStyle: public iObject { public: virtual void handleNewSize(eWindow *wnd, const eSize &size) = 0; + virtual void paintWindowDecoration(eWindow *wnd, gPainter &painter, const std::string &title) = 0; + virtual void paintBackground(gPainter &painter, const ePoint &offset, const eSize &size) = 0; + virtual void setForegroundStyle(gPainter &painter) = 0; + virtual void drawButtonFrame(gPainter &painter, const eRect &frame) = 0; + virtual ~eWindowStyle() = 0; }; class eWindowStyleSimple: public eWindowStyle { DECLARE_REF; +private: + ePtr m_fnt; + gColor m_border_color_tl, m_border_color_br, m_title_color_back, m_title_color, m_background_color; + + int m_border_top, m_border_left, m_border_right, m_border_bottom; public: eWindowStyleSimple(); void handleNewSize(eWindow *wnd, const eSize &size); - int m_border_top, m_border_left, m_border_right, m_border_bottom; + void paintWindowDecoration(eWindow *wnd, gPainter &painter, const std::string &title); + void paintBackground(gPainter &painter, const ePoint &offset, const eSize &size); + void setForegroundStyle(gPainter &painter); + void drawButtonFrame(gPainter &painter, const eRect &frame); }; #endif diff --git a/lib/network/Makefile.am b/lib/network/Makefile.am index f5efef9a..f9677a10 100644 --- a/lib/network/Makefile.am +++ b/lib/network/Makefile.am @@ -4,6 +4,6 @@ INCLUDES = \ noinst_LIBRARIES = libenigma_network.a libenigma_network_a_SOURCES = \ - http_dyn.cpp http_file.cpp httpd.cpp serversocket.cpp socket.cpp + httpd.cpp http_dyn.cpp http_file.cpp http.cpp serversocket.cpp socket.cpp # xmlrpc.cpp diff --git a/lib/network/http.cpp b/lib/network/http.cpp new file mode 100644 index 00000000..dc98a0bd --- /dev/null +++ b/lib/network/http.cpp @@ -0,0 +1,33 @@ +#include +#include +#include + +eHTTPServer *eHTTPServer::m_instance; + +RESULT eHTTPServer::getDynResolver(eHTTPDynPathResolverPtr &ptr) +{ + ptr = m_dyn; + if (!m_dyn) + return -1; + return 0; +} + +RESULT eHTTPServer::getFileResolver(eHTTPFilePathResolverPtr &ptr) +{ + ptr = m_file; + if (!m_file) + return -1; + return 0; +} + +eHTTPServer::eHTTPServer(): m_httpd(8080, eApp) +{ + m_instance = this; + m_dyn = new eHTTPDynPathResolver(); + m_file = new eHTTPFilePathResolver(); + + m_httpd.addResolver(m_dyn); + m_httpd.addResolver(m_file); +} + +eAutoInitP0 init_eHTTPServer(eAutoInitNumbers::network, "main http server"); diff --git a/lib/network/http.h b/lib/network/http.h new file mode 100644 index 00000000..fa2a4fba --- /dev/null +++ b/lib/network/http.h @@ -0,0 +1,28 @@ +#ifndef __http_h +#define __http_h + +#include +#include +#include + +class eHTTPDynPathResolver; +class eHTTPFilePathResolver; + +typedef ePtr eHTTPDynPathResolverPtr; +typedef ePtr eHTTPFilePathResolverPtr; + +class eHTTPServer +{ + eHTTPD m_httpd; + static eHTTPServer *m_instance; + eHTTPDynPathResolverPtr m_dyn; + eHTTPFilePathResolverPtr m_file; +public: + RESULT getDynResolver(eHTTPDynPathResolverPtr &ptr); + RESULT getFileResolver(eHTTPFilePathResolverPtr &ptr); + + eHTTPServer(); + static eHTTPServer *getInstance() { return m_instance; } +}; + +#endif diff --git a/lib/network/http_dyn.cpp b/lib/network/http_dyn.cpp index eb94d462..c3a49048 100644 --- a/lib/network/http_dyn.cpp +++ b/lib/network/http_dyn.cpp @@ -1,5 +1,6 @@ #include +DEFINE_REF(eHTTPDyn); eHTTPDyn::eHTTPDyn(eHTTPConnection *c, std::string result): eHTTPDataSource(c), result(result) { wptr=0; @@ -29,9 +30,11 @@ int eHTTPDyn::doWrite(int hm) return (size > wptr) ? 1 : -1; } +DEFINE_REF(eHTTPDynPathResolver); +DEFINE_REF(eHTTPDynPathResolver::eHTTPDynEntry); + eHTTPDynPathResolver::eHTTPDynPathResolver() { -#warning autodelete removed } void eHTTPDynPathResolver::addDyn(std::string request, std::string path, std::string (*function)(std::string, std::string, std::string, eHTTPConnection*)) @@ -39,7 +42,7 @@ void eHTTPDynPathResolver::addDyn(std::string request, std::string path, std::st dyn.push_back(new eHTTPDynEntry(request, path, function)); } -eHTTPDataSource *eHTTPDynPathResolver::getDataSource(std::string request, std::string path, eHTTPConnection *conn) +RESULT eHTTPDynPathResolver::getDataSource(eHTTPDataSourcePtr &ptr, std::string request, std::string path, eHTTPConnection *conn) { std::string p, opt; if (path.find('?')!=std::string::npos) @@ -51,16 +54,21 @@ eHTTPDataSource *eHTTPDynPathResolver::getDataSource(std::string request, std::s p=path; opt=""; } - for (ePtrList::iterator i(dyn); i != dyn.end(); ++i) + for (eSmartPtrList::iterator i(dyn); i != dyn.end(); ++i) if ((i->path==p) && (i->request==request)) { conn->code=-1; std::string s=i->function(request, path, opt, conn); if (!s.empty()) - return new eHTTPDyn(conn, s); + { + ptr = new eHTTPDyn(conn, s); + return 0; + } - return new eHTTPError(conn, 500); + ptr = new eHTTPError(conn, 500); + return 0; } - return 0; + ptr = 0; + return -1; } diff --git a/lib/network/http_dyn.h b/lib/network/http_dyn.h index d714403b..61116409 100644 --- a/lib/network/http_dyn.h +++ b/lib/network/http_dyn.h @@ -5,6 +5,8 @@ class eHTTPDyn: public eHTTPDataSource { + DECLARE_REF; +private: std::string result; int wptr, size; public: @@ -13,10 +15,14 @@ public: int doWrite(int); }; -class eHTTPDynPathResolver: public eHTTPPathResolver +class eHTTPDynPathResolver: public iHTTPPathResolver { + DECLARE_REF; +private: struct eHTTPDynEntry { + DECLARE_REF; + public: std::string request, path; std::string (*function)(std::string request, std::string path, std::string opt, eHTTPConnection *content); @@ -24,11 +30,11 @@ class eHTTPDynPathResolver: public eHTTPPathResolver { } }; - ePtrList dyn; + eSmartPtrList dyn; public: void addDyn(std::string request, std::string path, std::string (*function)(std::string, std::string, std::string, eHTTPConnection *conn)); eHTTPDynPathResolver(); - eHTTPDataSource *getDataSource(std::string request, std::string path, eHTTPConnection *conn); + RESULT getDataSource(eHTTPDataSourcePtr &ptr, std::string request, std::string path, eHTTPConnection *conn); }; #endif diff --git a/lib/network/http_file.cpp b/lib/network/http_file.cpp index 2b47d63c..6c6abc83 100644 --- a/lib/network/http_file.cpp +++ b/lib/network/http_file.cpp @@ -6,6 +6,8 @@ #include #include +DEFINE_REF(eHTTPFile); + eHTTPFile::eHTTPFile(eHTTPConnection *c, int _fd, int method, const char *mime): eHTTPDataSource(c), method(method) { fd=_fd; @@ -58,7 +60,6 @@ eHTTPFile::~eHTTPFile() eHTTPFilePathResolver::eHTTPFilePathResolver() { -#warning autodelete removed } @@ -138,7 +139,9 @@ static int checkAuth(const std::string cauth) return 0; } -eHTTPDataSource *eHTTPFilePathResolver::getDataSource(std::string request, std::string path, eHTTPConnection *conn) +DEFINE_REF(eHTTPFilePathResolver); + +RESULT eHTTPFilePathResolver::getDataSource(eHTTPDataSourcePtr &ptr, std::string request, std::string path, eHTTPConnection *conn) { int method; eDebug("request = %s, path = %s", request.c_str(), path.c_str()); @@ -147,9 +150,15 @@ eHTTPDataSource *eHTTPFilePathResolver::getDataSource(std::string request, std:: else if (request == "PUT") method=eHTTPFile::methodPUT; else - return new eHTTPError(conn, 405); // method not allowed + { + ptr = new eHTTPError(conn, 405); // method not allowed + return 0; + } if (path.find("../")!=std::string::npos) // evil hax0r - return new eHTTPError(conn, 403); + { + ptr = new eHTTPError(conn, 403); + return 0; + } if (path[0] != '/') // prepend '/' path.insert(0,"/"); if (path[path.length()-1]=='/') @@ -171,7 +180,8 @@ eHTTPDataSource *eHTTPFilePathResolver::getDataSource(std::string request, std:: if ((i == conn->remote_header.end()) || checkAuth(i->second)) { conn->local_header["WWW-Authenticate"]="Basic realm=\"dreambox\""; - return new eHTTPError(conn, 401); // auth req'ed + ptr = new eHTTPError(conn, 401); // auth req'ed + return 0; } } @@ -215,7 +225,10 @@ eHTTPDataSource *eHTTPFilePathResolver::getDataSource(std::string request, std:: break; } } - return data; + if (!data) + return -1; + ptr = data; + return 0; } void eHTTPFilePathResolver::addTranslation(std::string path, std::string root, int authorized) diff --git a/lib/network/http_file.h b/lib/network/http_file.h index 109dc07e..6feb562d 100644 --- a/lib/network/http_file.h +++ b/lib/network/http_file.h @@ -5,6 +5,8 @@ class eHTTPFile: public eHTTPDataSource { + DECLARE_REF; +private: int fd, size; const char *mime; int method; @@ -16,8 +18,10 @@ public: void haveData(void *data, int len); }; -class eHTTPFilePathResolver: public eHTTPPathResolver +class eHTTPFilePathResolver: public iHTTPPathResolver { + DECLARE_REF; +public: struct eHTTPFilePath { std::string path; @@ -30,7 +34,7 @@ class eHTTPFilePathResolver: public eHTTPPathResolver ePtrList translate; public: eHTTPFilePathResolver(); - eHTTPDataSource *getDataSource(std::string request, std::string path, eHTTPConnection *conn); + RESULT getDataSource(eHTTPDataSourcePtr &ptr, std::string request, std::string path, eHTTPConnection *conn); void addTranslation(std::string path, std::string root, int auth); }; diff --git a/lib/network/httpd.cpp b/lib/network/httpd.cpp index f706ccf8..c89ad7e3 100644 --- a/lib/network/httpd.cpp +++ b/lib/network/httpd.cpp @@ -2,12 +2,16 @@ #include #include +#include #include #include #include #include #include +#include +#include + eHTTPDataSource::eHTTPDataSource(eHTTPConnection *c): connection(c) { } @@ -25,6 +29,8 @@ int eHTTPDataSource::doWrite(int) return 0; } +DEFINE_REF(eHTTPError); + eHTTPError::eHTTPError(eHTTPConnection *c, int errcode): eHTTPDataSource(c), errcode(errcode) { std::string error="unknown error"; @@ -71,6 +77,7 @@ eHTTPConnection::eHTTPConnection(int socket, int issocket, eHTTPD *parent, int p void eHTTPConnection::destruct() { + eDebug("destruct, this %p!", this); gotHangup(); delete this; } @@ -108,11 +115,7 @@ void eHTTPConnection::gotHangup() { if (data && remotestate == stateData) data->haveData(0, 0); - if (data) - { - delete data; - data=0; - } + data = 0; transferDone(0); localstate=stateWait; @@ -345,10 +348,8 @@ int eHTTPConnection::processLocalState() #endif if (persistent) { - if (data) - delete data; - data=0; - localstate=stateWait; + data = 0; + localstate = stateWait; } else close(); // bye, bye, remote return 1; @@ -401,8 +402,7 @@ int eHTTPConnection::processRemoteState() del[1]=line.find(" ", del[0]+1); if (del[0]==-1) { - if (data) - delete data; + data = 0; eDebug("request buggy"); httpversion="HTTP/1.0"; data=new eHTTPError(this, 400); @@ -490,20 +490,17 @@ int eHTTPConnection::processRemoteState() if (parent) { - for (ePtrList::iterator i(parent->resolver); i != parent->resolver.end(); ++i) - { - if ((data=i->getDataSource(request, requestpath, this))) + for (eSmartPtrList::iterator i(parent->resolver); i != parent->resolver.end(); ++i) + if (!(i->getDataSource(data, request, requestpath, this))) break; - } localstate=stateResponse; // can be overridden by dataSource } else data=createDataSource(this); if (!data) { - if (data) - delete data; - data=new eHTTPError(this, 404); + data = 0; + data = new eHTTPError(this, 404); } if (content_length || // if content-length is set, we have content @@ -600,11 +597,7 @@ int eHTTPConnection::getLine(std::string &line) void eHTTPConnection::gotError(int err) { - if (data) - { - delete data; - data=0; - } + data = 0; transferDone(err); delete this; } @@ -615,15 +608,13 @@ eHTTPD::eHTTPD(int port, eMainloop *ml): eServerSocket(port, ml), ml(ml) eDebug("[NET] httpd server FAILED on port %d", port); else eDebug("[NET] httpd server started on port %d", port); -#warning resolver autodelete removed } eHTTPConnection::~eHTTPConnection() { + eDebug("HTTP connection destruct"); if ((!persistent) && (state()!=Idle)) eWarning("~eHTTPConnection, status still %d", state()); - if (data) - delete data; } void eHTTPD::newConnection(int socket) diff --git a/lib/network/httpd.h b/lib/network/httpd.h index 61fe2c75..30c3c032 100644 --- a/lib/network/httpd.h +++ b/lib/network/httpd.h @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -15,14 +16,17 @@ class eHTTPConnection; class eHTTPDataSource; class eHTTPD; -class eHTTPPathResolver +class eHTTPDataSource; +typedef ePtr eHTTPDataSourcePtr; + +class iHTTPPathResolver: public iObject { public: - virtual ~eHTTPPathResolver() {}; - virtual eHTTPDataSource *getDataSource(std::string request, std::string path, eHTTPConnection *conn)=0; + virtual ~iHTTPPathResolver() {}; + virtual RESULT getDataSource(eHTTPDataSourcePtr &source, std::string request, std::string path, eHTTPConnection *conn)=0; }; -class eHTTPDataSource +class eHTTPDataSource: public iObject { protected: eHTTPConnection *connection; @@ -33,8 +37,12 @@ public: virtual int doWrite(int bytes); // number of written bytes, -1 for "no more" }; +typedef ePtr eHTTPDataSourcePtr; + class eHTTPError: public eHTTPDataSource { + DECLARE_REF; +private: int errcode; public: eHTTPError(eHTTPConnection *c, int errcode); @@ -53,7 +61,7 @@ class eHTTPConnection: public eSocket int processRemoteState(); void writeString(const char *data); - eHTTPDataSource *data; + eHTTPDataSourcePtr data; eHTTPD *parent; int buffersize; @@ -110,14 +118,14 @@ public: class eHTTPD: public eServerSocket { friend class eHTTPConnection; - ePtrList resolver; + eSmartPtrList resolver; eMainloop *ml; public: eHTTPD(int port, eMainloop *ml); void newConnection(int socket); - void addResolver(eHTTPPathResolver *r) { resolver.push_back(r); } - void removeResolver(eHTTPPathResolver *r) { resolver.remove(r); } + void addResolver(iHTTPPathResolver *r) { resolver.push_back(r); } + void removeResolver(iHTTPPathResolver *r) { resolver.remove(r); } }; #endif diff --git a/lib/network/socket.cpp b/lib/network/socket.cpp index 628a128b..b2ab7437 100644 --- a/lib/network/socket.cpp +++ b/lib/network/socket.cpp @@ -269,6 +269,7 @@ int eSocket::connectToHost(std::string hostname, int port) eSocket::eSocket(eMainloop *ml): readbuffer(32768), writebuffer(32768), rsn(0) { + ASSERT(ml); int s=socket(AF_INET, SOCK_STREAM, 0); #if 0 eDebug("[SOCKET]: initalized socket %d", socketdesc); diff --git a/lib/network/xmlrpc.h b/lib/network/xmlrpc.h index 5347dbfe..05fd3cca 100644 --- a/lib/network/xmlrpc.h +++ b/lib/network/xmlrpc.h @@ -69,8 +69,9 @@ void xmlrpc_addMethod(std::string methodName, int (*)(std::vector &res, int faultCode, std::string faultString); int xmlrpc_checkArgs(std::string args, std::vector&, ePtrList &res); -class eHTTPXMLRPCResolver: public eHTTPPathResolver +class eHTTPXMLRPCResolver: public iHTTPPathResolver { + DECLARE_REF; public: eHTTPXMLRPCResolver(); eHTTPDataSource *getDataSource(std::string request, std::string path, eHTTPConnection *conn); diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i index 67244f10..c9dc42e4 100644 --- a/lib/python/enigma_python.i +++ b/lib/python/enigma_python.i @@ -6,6 +6,13 @@ #include #include #include + +#include +#include +#include +#include +#include +#include %} #define DEBUG @@ -17,7 +24,15 @@ %include %include %template(eServiceCenterPtr) ePtr; -%template(iPlayableServicePtr) ePtr; -%template(iPauseableServicePtr) ePtr; -%template(iRecordableServicePtr) ePtr; -%template(iListableServicePtr) ePtr; + +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include + diff --git a/lib/service/iservice.h b/lib/service/iservice.h index a6369574..766d850e 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -6,6 +6,14 @@ #include #include +#ifdef SWIG +#define TEMPLATE_TYPEDEF(x, y) \ +%template(y) x; \ +typedef x y +#else +#define TEMPLATE_TYPEDEF(x, y) typedef x y +#endif + class eServiceReference { public: @@ -167,7 +175,7 @@ public: virtual RESULT getIServiceInformation(ePtr &ptr)=0; }; -typedef ePtr iPlayableServicePtr; +TEMPLATE_TYPEDEF(ePtr, iPlayableServicePtr); class iRecordableService: public iObject { @@ -178,13 +186,16 @@ public: typedef ePtr iRecordableServicePtr; +// TEMPLATE_TYPEDEF(std::list, eServiceReferenceList); +typedef std::list eServiceReferenceList; + class iListableService: public iObject { public: virtual RESULT getContent(std::list &list)=0; }; -typedef ePtr iListableServicePtr; +TEMPLATE_TYPEDEF(ePtr, iListableServicePtr); class iServiceHandler: public iObject { diff --git a/main/enigma.cpp b/main/enigma.cpp index 81391c32..d350f445 100644 --- a/main/enigma.cpp +++ b/main/enigma.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -27,6 +28,11 @@ void object_dump() printf("%d items left\n", object_total_remaining); } #endif +using namespace std; + void print(const string &str, const char *c) + { + printf("%s (%s)\n", str.c_str(), c); + } void dumpRegion(const gRegion ®ion) { @@ -47,20 +53,31 @@ void dumpRegion(const gRegion ®ion) } } -int main() + +class eMain: public eApplication, public Object +{ + eInit init; +public: + eMain() + { + init.setRunlevel(eAutoInitNumbers::main); + } +}; + +eWidgetDesktop *wdsk; + +int main(int argc, char **argv) { #ifdef OBJECT_DEBUG atexit(object_dump); #endif - eInit init; - - init.setRunlevel(eAutoInitNumbers::main); - // gui stuff -#if 0 + +#if 1 + eMain main; + ePtr my_dc; gFBDC::getInstance(my_dc); -#if 1 gPainter p(my_dc); @@ -71,65 +88,38 @@ int main() pal[3] = 0x00ff00; for (int a=0; a<0x10; ++a) - pal[a | 0x10] = (0x111111 * a) | 0xFF; + pal[a | 0x10] = 0x111111 * a; + for (int a=0; a<0x10; ++a) + pal[a | 0x20] = (0x111100 * a) | 0xFF; + for (int a=0; a<0x10; ++a) + pal[a | 0x30] = (0x110011 * a) | 0xFF00; + for (int a=0; a<0x10; ++a) + pal[a | 0x40] = (0x001111 * a) | 0xFF0000; p.setPalette(pal, 0, 256); fontRenderClass::getInstance()->AddFont("/dbox2/cdkroot/share/fonts/arial.ttf", "Arial", 100); -#if 0 - p.resetClip(gRegion(eRect(0, 0, 720, 576))); - - - gRegion c; - eDebug("0"); - int i; - - c |= eRect(0, 20, 100, 10); - c |= eRect(0, 50, 100, 10); - c |= eRect(10, 10, 80, 100); - - c -= eRect(20, 20, 40, 40); - - p.setForegroundColor(gColor(3)); - p.fill(eRect(0, 0, 100, 100)); - p.fill(eRect(200, 0, 100, 100)); - - for (int a=0; a %d %d", c.rects[a].left(), c.rects[a].top(), c.rects[a].right(), c.rects[a].bottom()); - eDebug("extends: %d %d %d %d", c.extends.left(), c.extends.top(), c.extends.right(), c.extends.bottom()); - p.setOffset(ePoint(100, 100)); - p.clip(c); - - p.setBackgroundColor(gColor(1)); - p.clear(); - p.setForegroundColor(gColor(2)); - p.line(ePoint(0, 0), ePoint(220, 190)); - p.clippop(); - - p.setBackgroundColor(gColor(0x1f)); - p.setForegroundColor(gColor(0x10)); - - ePtr fnt = new gFont("Arial", 70); - p.setFont(fnt); - p.renderText(eRect(100, 100, 500, 200), "Hello welt!"); -#else - - eWidgetDesktop dsk(eSize(720, 576)); + + wdsk = &dsk; dsk.setDC(my_dc); - eWindow *bla = new eWindow(&dsk); - - bla->move(ePoint(100, 100)); - bla->resize(eSize(200, 200)); - bla->show(); + eWindow *wnd = new eWindow(&dsk); + wnd->move(ePoint(100, 100)); + wnd->resize(eSize(200, 200)); + wnd->show(); - eLabel *blablub = new eLabel(bla->child()); - blablub->setText("hello world"); - blablub->move(ePoint(0, 0)); - blablub->resize(eSize(400,400)); + eLabel *label = new eButton(wnd); + label->setText("Hello!!"); + label->move(ePoint(40, 40)); + label->resize(eSize(100, 40)); -#if 0 + label = new eButton(wnd); + label->setText("2nd!!"); + label->move(ePoint(40, 90)); + label->resize(eSize(100, 40)); + +#if 0 eWidget *bla2 = new eWidget(0); dsk.addRootWidget(bla2, 0); @@ -138,43 +128,44 @@ int main() bla2->show(); #endif - dsk.recalcClipRegions(); +// dsk.recalcClipRegions(); +// dsk.paint(); +// dsk.invalidate(gRegion(eRect(0, 0, 720, 576))); -// dumpRegion(bla->m_visible_region); -// dumpRegion(bla2->m_visible_region); -// dumpRegion(blablub->m_visible_region); +// dumpRegion(wnd->m_visible_region); +// dumpRegion(label->m_visible_region); +// dumpRegion(label->m_visible_region); eDebug("painting!"); + - dsk.invalidate(gRegion(eRect(0, 0, 720, 576))); - dsk.paint(); -#endif - -#else - - extern void contentTest(); - - eDebug("Contenttest"); - contentTest(); + ePython python; + + printf("about to execute TEST :)\n"); + python.execute("mytest", "test"); + sleep(2); #endif - p.resetClip(gRegion(eRect(0, 0, 720, 576))); -// p.clear(); - sleep(1); - -// blablub->setText("123"); -// dumpRegion(blablub->m_visible_region); -// dumpRegion(dsk.m_dirty_region); - dsk.paint(); - +#if 0 -#endif + // connections mit parametern: geht! :) + using namespace std; + using namespace SigC; - ePython python; - printf("about to execute TEST :)\n"); - python.execute("mytest", "test"); + Signal1 printer; + int i; + for (i=1; i " + str(y) + " (" + y["instance"].getText() + ")" + +# print components["$001"].data["okbutton"]["instance"].doClick() + +# diese sachen gehoeren in den skin! :) + applyGUIskin(components["$002"], None, "clockDialog") + +# das ist dann schon die echte funktionalitaet ;) + components["clock"].doClock() + components["clock"].doClock() + + +# output as html + print "--------------------------------------" + html.create(components["$001"]) + print "--------------------------------------" + html.create(components["$002"]) + print "--------------------------------------" - sc = eServiceCenterPtr() - print sc - if eServiceCenter.getInstance(sc): - print "no eServiceCenter instance!" - else: - print "now trying to play!" - i = iPlayableServicePtr(); - if sc.play(ref, i): - print "play failed! :(" +# direkter test der GUI aus python: +# label1 = eLabel(wnd) +# label1.setText("hello world!\nfrom python!") +# label1.move(ePoint(10, 10)) +# label1.resize(eSize(80, 50)) +# +# label2 = eLabel(wnd) +# label2.setText("the second\nlabel works\nas well!") +# label2.move(ePoint(90, 10)) +# label2.resize(eSize(80, 50)) +# +# button = eButton(wnd) +# button.setText("OK") +# button.move(ePoint(200, 10)) +# button.resize(eSize(80, 50)) + + for x in range(200): + time.sleep(0.1) + components["clock"].doClock() + if x > 100: + r = 200 - x else: - print "play ruled!" - - p = iPauseableServicePtr() - if (i.getIPausableService(p)): - print "no pause available" - else: - p.pause() - p.unpause() + r = x +# components["$002"]["okbutton"].setValue(r) + desktop.paint() + +# +# print "delete label1" +# del button +# del label2 +# del label1 +# print "delete wnd" +# del wnd +# print "bye" + return 0 diff --git a/screens.py b/screens.py new file mode 100644 index 00000000..bd0f6fc4 --- /dev/null +++ b/screens.py @@ -0,0 +1,42 @@ +from components import * + +# some screens +def doGlobal(screen): + screen["clock"] = Clock() + +class Screen(dict, HTMLSkin, GUISkin): + """ bla """ + +# a test dialog +class testDialog(Screen): + def testDialogClick(self): + print "test dialog clicked!" + self["title"].setText("bla") + + def __init__(self): + HTMLSkin.__init__(self, ("title", "okbutton")) + b = Button("ok") + b.onClick = [ self.testDialogClick ] + self["okbutton"] = b + self["title"] = Header("Test Dialog - press ok to leave!") + +# a clock display dialog +class clockDisplay(Screen): + def okbutton(self): + print "clockDisplay close" + + def __init__(self, clock): + HTMLSkin.__init__(self, ("title", "theClock", "okbutton")) + self["theClock"] = clock + b = Button("bye") + b.onClick = [ self.okbutton ] + self["okbutton"] = b + #VolumeBar() + self["title"] = Header("clock dialog: here you see the current uhrzeit!") + +# defined screens +screens = { + "global": doGlobal, + "testDialog": testDialog, + "clockDisplay": clockDisplay } + diff --git a/skin.py b/skin.py new file mode 100644 index 00000000..415f3412 --- /dev/null +++ b/skin.py @@ -0,0 +1,28 @@ +from enigma import * +import xml.dom.minidom + +def dump(x, i=0): + print " " * i + str(x) + try: + for n in x.childNodes: + dump(n, i + 1) + except: + None + +dom = xml.dom.minidom.parseString( + " \ + \ + \ + \ + ") + +def applyGUIskin(screen, skin, name): + dump(dom[screen]) + screen.data["okbutton"]["instance"].move(ePoint(10, 10)) + screen.data["okbutton"]["instance"].resize(eSize(280, 40)) + + screen.data["theClock"]["instance"].move(ePoint(10, 60)) + screen.data["theClock"]["instance"].resize(eSize(280, 50)) + + screen.data["title"]["instance"].move(ePoint(10, 120)) + screen.data["title"]["instance"].resize(eSize(280, 50)) -- 2.30.2