Hi guys,
Just wondering how this is going =) I could really use an UNO method
that essentially processes all 'idle' handlers synchronously to finish
up all pending work - to help with some profiling tasks - but (of
course) to do that, we need some genuine 'idle' vs. 'timeout'
distinction.
How is that coming along? I see lots of nice things in the wiki page
here:
https://wiki.documentfoundation.org/Development/LHM_LiMux#Priority_Main_Loop
On Wed, 2014-10-01 at 17:04 +0100, Michael Meeks wrote:
Yep - a very helpful table there. I've asked to have that sorted by
timeout not source-location; and to have all the UI related timeouts
split to their own section.
So - I did some thinking and mapped the timeouts to some sort of
descriptive priority names - something like this:
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
};
we can rip/replace the 'ms' comments later of course. Then we would
need a patch something like the attached. Of course, worked through all
of the instances of idle handlers =) Patch is un-tested to avoid having
to trigger a rather slow re-build here; please do hack it about into
whatever form you like.
Is it possible to extend that suitably ? when we have the code changed
around the place, and the problem isolated; we can start to prioritize
and avoid having these silly timeouts at all (I hope).
Having said that, when we get to 400ms - I imagine this is a UI
interaction timeout - which prolly should stay at 400ms ;-) - it'd be
good to review those to see if they are UI / behaviour related - it'd
suck to suddenly have the double-click time be ~instant ;-)
All the best,
Michael.
--
michael.meeks@collabora.com <><, Pseudo Engineer, itinerant idiot
diff --git a/include/vcl/timer.hxx b/include/vcl/timer.hxx
index d3ebe1a..e2cbaa7 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 4448c55..9c8cb08 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..a1b4a18 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 57b7a4b..bc8c43c 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -1027,11 +1027,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() )
Context
- Re: LiMux student "kick-off" (continued)
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.