fix spinner handling
[enigma2.git] / lib / gdi / grc.cpp
index 1c8e3a6587ee8994089b5019288b5e79ed4e334b..c8af2457e1d67a7911ff1cb6430de257e4b0dbae 100644 (file)
@@ -119,7 +119,7 @@ void *gRC::thread()
                                break;
                        else if (o.opcode==gOpcode::notify)
                                need_notify = 1;
-                       else
+                       else if(o.dc)
                        {
                                o.dc->exec(&o);
                                // o.dc is a gDC* filled with grabref... so we must release it here
@@ -139,24 +139,21 @@ void *gRC::thread()
                        
                                        /* when the main thread is non-idle for a too long time without any display output,
                                           we want to display a spinner. */
-
-                               struct timeval time;
                                struct timespec timeout;
-                               gettimeofday(&time, NULL);
-                               timeout.tv_sec = time.tv_sec;
-                               timeout.tv_nsec = time.tv_usec * 1000;
-                               
+                               clock_gettime(CLOCK_REALTIME, &timeout);
+
                                if (m_spinner_enabled)
+                               {
                                        timeout.tv_nsec += 100*1000*1000;
-                               else
-                                       timeout.tv_nsec += 500*1000*1000;
-
                                        /* yes, this is required. */
-                               if (timeout.tv_nsec > 1000*1000*1000)
-                               {
-                                       timeout.tv_nsec -= 1000*1000*1000;
-                                       timeout.tv_sec++;
+                                       if (timeout.tv_nsec > 1000*1000*1000)
+                                       {
+                                               timeout.tv_nsec -= 1000*1000*1000;
+                                               timeout.tv_sec++;
+                                       }
                                }
+                               else
+                                       timeout.tv_sec += 2;
 
                                int idle = 1;
 
@@ -165,8 +162,6 @@ void *gRC::thread()
                                        if (eApp && !eApp->isIdle())
                                                idle = 0;
                                }
-                               
-                               pthread_mutex_unlock(&mutex);
 
                                if (!idle)
                                {
@@ -176,6 +171,7 @@ void *gRC::thread()
                                } else
                                        disableSpinner();
                        }
+                       pthread_mutex_unlock(&mutex);
 #endif
                }
        }
@@ -207,7 +203,8 @@ void gRC::enableSpinner()
        o.opcode = m_spinner_enabled ? gOpcode::incrementSpinner : gOpcode::enableSpinner;
        m_spinner_dc->exec(&o);
        m_spinner_enabled = 1;
-
+       o.opcode = gOpcode::flush;
+       m_spinner_dc->exec(&o);
 }
 
 void gRC::disableSpinner()
@@ -226,6 +223,8 @@ void gRC::disableSpinner()
        gOpcode o;
        o.opcode = gOpcode::disableSpinner;
        m_spinner_dc->exec(&o);
+       o.opcode = gOpcode::flush;
+       m_spinner_dc->exec(&o);
 }
 
 static int gPainter_instances;
@@ -520,16 +519,6 @@ void gPainter::clippop()
        m_rc->submit(o);
 }
 
-void gPainter::flush()
-{
-       if ( m_dc->islocked() )
-               return;
-       gOpcode o;
-       o.opcode = gOpcode::flush;
-       o.dc = m_dc.grabRef();
-       m_rc->submit(o);
-}
-
 void gPainter::waitVSync()
 {
        if ( m_dc->islocked() )