fix RT_VALIGN_CENTER
[enigma2.git] / lib / gdi / grc.cpp
index 99fe085916a5ca298332a586e81cc7763834368e..7f88402426d458119387c65d35e84257acc39b13 100644 (file)
@@ -1,5 +1,5 @@
 // for debugging use:
-#define SYNC_PAINT
+// #define SYNC_PAINT
 #include <unistd.h>
 #ifndef SYNC_PAINT
 #include <pthread.h>
@@ -55,6 +55,7 @@ gRC::~gRC()
 
 void *gRC::thread()
 {
+       int need_notify = 0;
 #ifndef SYNC_PAINT
        while (1)
 #else
@@ -66,12 +67,17 @@ void *gRC::thread()
                if (o.opcode==gOpcode::shutdown)
                        break;
                if (o.opcode==gOpcode::notify)
-               {
-                       m_notify_pump.send(1);
-               } else
+                       need_notify = 1;
+               else
                        o.dc->exec(&o);
                o.dc->Release();
                queue.dequeue();
+
+               if ((!queue.size()) && need_notify)
+               {
+                       need_notify = 0;
+                       m_notify_pump.send(1);
+               }
        }
 #ifndef SYNC_PAINT
        pthread_exit(0);
@@ -373,6 +379,10 @@ void gPainter::notify()
 
 void gPainter::end()
 {
+       gOpcode o;
+       o.opcode = gOpcode::flush;
+       o.dc = m_dc.grabRef();
+       m_rc->submit(o);
 }
 
 gDC::gDC()
@@ -432,7 +442,9 @@ void gDC::exec(gOpcode *o)
                if (o->parm.renderText->flags & gPainter::RT_VALIGN_CENTER)
                {
                        eRect bbox = para->getBoundBox();
-                       offset += ePoint(0, (o->parm.renderText->area.height() - bbox.height()) / 2);
+                       int vcentered_top = (o->parm.renderText->area.height() - bbox.height()) / 2;
+                       int correction = vcentered_top - bbox.top();
+                       offset += ePoint(0, correction);
                }
                para->blit(*this, offset, getRGB(m_background_color), getRGB(m_foreground_color));
                delete o->parm.renderText;