[Libreoffice-commits] core.git: Branch 'feature/priorities' - include/vcl vcl/inc vcl/source

Jennifer Liebel jliebel94 at gmail.com
Fri Oct 31 01:19:34 PDT 2014


 include/vcl/timer.hxx        |   35 +++++++++++++++++++++++++++++++++
 vcl/inc/window.h             |    4 +--
 vcl/source/app/timer.cxx     |   45 +++++++++++++++++++++++++++++++++++++++++++
 vcl/source/window/window.cxx |    8 +++----
 4 files changed, 86 insertions(+), 6 deletions(-)

New commits:
commit ad71bd6715be6b37ecc3af1beef96e22caa5b394
Author: Jennifer Liebel <jliebel94 at gmail.com>
Date:   Fri Oct 31 08:17:33 2014 +0000

    applied patch from Michael Meeks
    
    Change-Id: I57f22b6d9bfbef4a50d162076b01e8e64edb4718

diff --git a/include/vcl/timer.hxx b/include/vcl/timer.hxx
index d3ebe1a..5c3a49a 100644
--- a/include/vcl/timer.hxx
+++ b/include/vcl/timer.hxx
@@ -73,6 +73,41 @@ public:
     AutoTimer&      operator=( const AutoTimer& rTimer );
 };
 
+enum IdlePriority {
+    VCL_IDLE_PRIORITY_HIGHEST, // -> 0ms
+    VCL_IDLE_PRIORITY_HIGH,    // -> 1ms
+    VCL_IDLE_PRIORITY_REPAINT, // -> 30ms
+    VCL_IDLE_PRIORITY_RESIZE,  // -> 50ms
+    VCL_IDLE_PRIORITY_MEDIUM,  // -> 50ms
+    VCL_IDLE_PRIORITY_LOW,     // -> 100ms
+    VCL_IDLE_PRIORITY_LOWER,   // -> 200ms
+    VCL_IDLE_PRIORITY_LOWEST   // -> 400ms
+};
+
+
+// To port from Timer -> Idle switch class name,
+// s/Timeout/DoIdle/ etc. and select priority
+class VCL_DLLPUBLIC Idle : private Timer
+{
+ public:
+    Idle( IdlePriority ePriority );
+    virtual ~Idle();
+
+    void SetPriority( IdlePriority ePriority );
+
+    /// Make it possible to associate a callback with this idle handler
+    /// of course, you can also sub-class and override 'DoIdle'
+    void            SetIdleHdl( const Link& rLink ) { SetTimeoutHdl( rLink ); }
+    const Link&     GetIdleHdl() const              { return GetTimeoutHdl(); }
+
+    void            Start() { Timer::Start(); }
+    void            Stop()  { Timer::Stop();  }
+
+    virtual void    DoIdle() = 0;
+
+    virtual void    Timeout() SAL_OVERRIDE { DoIdle(); }
+};
+
 #endif // INCLUDED_VCL_TIMER_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/window.h b/vcl/inc/window.h
index 53d077f..60a4489 100644
--- a/vcl/inc/window.h
+++ b/vcl/inc/window.h
@@ -127,8 +127,8 @@ struct ImplOverlapData
 
 struct ImplFrameData
 {
-    Timer               maPaintTimer;           //< paint timer
-    Timer               maResizeTimer;          //< resize timer
+    Idle                maPaintIdle;            //< paint idle handler
+    Idle                maResizeTimer;          //< resize timer
     InputContext        maOldInputContext;      //< last set Input Context
     vcl::Window*        mpNextFrame;            //< next frame window
     vcl::Window*        mpFirstOverlap;         //< first overlap vcl::Window
diff --git a/vcl/source/app/timer.cxx b/vcl/source/app/timer.cxx
index ecbfa74..e38c347 100644
--- a/vcl/source/app/timer.cxx
+++ b/vcl/source/app/timer.cxx
@@ -336,4 +336,49 @@ AutoTimer& AutoTimer::operator=( const AutoTimer& rTimer )
     return *this;
 }
 
+Idle::Idle( IdlePriority ePriority )
+    : Timer()
+{
+    SetPriority( ePriority );
+}
+
+void Idle::SetPriority( IdlePriority ePriority )
+{
+    sal_ulong nTimeoutMS = 0;
+
+    // Ultimately this will just be a sort key in a work queue.
+    switch (ePriority) {
+    case VCL_IDLE_PRIORITY_HIGHEST:
+        nTimeoutMS = 0;
+        break;
+    case VCL_IDLE_PRIORITY_HIGH:
+        nTimeoutMS = 1;
+        break;
+    case VCL_IDLE_PRIORITY_REPAINT:
+        nTimeoutMS = 30;
+        break;
+    case VCL_IDLE_PRIORITY_RESIZE:
+        nTimeoutMS = 50;
+        break;
+    case VCL_IDLE_PRIORITY_MEDIUM:
+        nTimeoutMS = 50;
+        break;
+    case VCL_IDLE_PRIORITY_LOW:
+        nTimeoutMS = 100;
+        break;
+    case VCL_IDLE_PRIORITY_LOWER:
+        nTimeoutMS = 200;
+        break;
+    case VCL_IDLE_PRIORITY_LOWEST:
+    default:
+        nTimeoutMS = 400;
+        break;
+    }
+    SetTimeout( nTimeoutMS );
+}
+
+Idle::~Idle()
+{
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 606a4f5..a1ac1a1 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -1029,11 +1029,11 @@ void Window::ImplInit( vcl::Window* pParent, WinBits nStyle, SystemParentData* p
         mpWindowImpl->mpFrameData->mbSysObjFocus      = false;
         if (!ImplDoTiledRendering())
         {
-            mpWindowImpl->mpFrameData->maPaintTimer.SetTimeout( 30 );
-            mpWindowImpl->mpFrameData->maPaintTimer.SetTimeoutHdl( LINK( this, Window, ImplHandlePaintHdl ) );
+            mpWindowImpl->mpFrameData->maPaintIdle.SetPriority( VCL_IDLE_PRIORITY_REPAINT );
+            mpWindowImpl->mpFrameData->maPaintIDle.SetIdleHdl( LINK( this, Window, ImplHandlePaintHdl ) );
         }
-        mpWindowImpl->mpFrameData->maResizeTimer.SetTimeout( 50 );
-        mpWindowImpl->mpFrameData->maResizeTimer.SetTimeoutHdl( LINK( this, Window, ImplHandleResizeTimerHdl ) );
+        mpWindowImpl->mpFrameData->maResizeIdle.SetPriority( VCL_IDLE_PRIORITY_RESIZE );
+        mpWindowImpl->mpFrameData->maResizeIdle.SetIdleHdl( LINK( this, Window, ImplHandleResizeTimerHdl ) );
         mpWindowImpl->mpFrameData->mbInternalDragGestureRecognizer = false;
 
         if ( pRealParent && IsTopWindow() )


More information about the Libreoffice-commits mailing list