summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/vcl/window.hxx2
-rw-r--r--vcl/inc/window.h2
-rw-r--r--vcl/source/window/mouse.cxx2
-rw-r--r--vcl/source/window/syschild.cxx7
-rw-r--r--vcl/source/window/window.cxx13
-rw-r--r--vcl/source/window/winproc.cxx21
-rw-r--r--vcl/win/window/salframe.cxx2
7 files changed, 31 insertions, 18 deletions
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 6b383bd1bf3f..3ade2a846b3b 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -537,7 +537,7 @@ public:
DECL_DLLPRIVATE_LINK_TYPED( ImplHandlePaintHdl, Idle*, void );
DECL_DLLPRIVATE_LINK_TYPED( ImplGenerateMouseMoveHdl, void*, void );
DECL_DLLPRIVATE_LINK_TYPED( ImplTrackTimerHdl, Timer*, void );
- DECL_DLLPRIVATE_LINK_TYPED( ImplAsyncFocusHdl, void*, void );
+ DECL_DLLPRIVATE_LINK_TYPED( ImplAsyncFocusHdl, Idle*, void );
DECL_DLLPRIVATE_LINK_TYPED( ImplHandleResizeTimerHdl, Idle*, void );
diff --git a/vcl/inc/window.h b/vcl/inc/window.h
index 64551af7d186..4c8b541ca075 100644
--- a/vcl/inc/window.h
+++ b/vcl/inc/window.h
@@ -143,7 +143,7 @@ struct ImplFrameData
sal_Int32 mnDPIY; //< Original Screen Resolution
ImplMapRes maMapUnitRes; //< for LogicUnitToPixel
sal_uIntPtr mnAllSaveBackSize; //< size of all bitmaps of saved backgrounds
- ImplSVEvent * mnFocusId; //< FocusId for PostUserLink
+ Idle * mpFocusIdle;
ImplSVEvent * mnMouseMoveId; //< MoveId for PostUserLink
long mnLastMouseX; //< last x mouse position
long mnLastMouseY; //< last y mouse position
diff --git a/vcl/source/window/mouse.cxx b/vcl/source/window/mouse.cxx
index 330cb701a695..4747abd97804 100644
--- a/vcl/source/window/mouse.cxx
+++ b/vcl/source/window/mouse.cxx
@@ -256,7 +256,7 @@ void Window::ImplGrabFocus( GetFocusFlags nFlags )
vcl::Window *pFrame = pSVData->maWinData.mpFirstFrame;
while( pFrame )
{
- if( pFrame != mpWindowImpl->mpFrameWindow.get() && pFrame->mpWindowImpl->mpFrameData->mnFocusId )
+ if( pFrame != mpWindowImpl->mpFrameWindow.get() && pFrame->mpWindowImpl->mpFrameData->mpFocusIdle )
{
bAsyncFocusWaiting = true;
break;
diff --git a/vcl/source/window/syschild.cxx b/vcl/source/window/syschild.cxx
index d0c8e8ca375d..7a007a96cc62 100644
--- a/vcl/source/window/syschild.cxx
+++ b/vcl/source/window/syschild.cxx
@@ -79,10 +79,13 @@ long ImplSysChildProc( void* pInst, SalObject* /* pObject */,
// trigger a LoseFocus which matches the status
// of the window with matching Activate-Status
pWindow->ImplGetFrameData()->mbSysObjFocus = false;
- if ( !pWindow->ImplGetFrameData()->mnFocusId )
+ if ( !pWindow->ImplGetFrameData()->mpFocusIdle )
{
pWindow->ImplGetFrameData()->mbStartFocusState = true;
- pWindow->ImplGetFrameData()->mnFocusId = Application::PostUserEvent( LINK( pWindow->ImplGetFrameWindow(), vcl::Window, ImplAsyncFocusHdl ), nullptr, true );
+ pWindow->ImplGetFrameData()->mpFocusIdle = new Idle("loseFocus");
+ pWindow->ImplGetFrameData()->mpFocusIdle->SetIdleHdl(LINK( pWindow->ImplGetFrameWindow(), vcl::Window, ImplAsyncFocusHdl ));
+ pWindow->ImplGetFrameData()->mpFocusIdle->SetPriority(SchedulerPriority::LOW);
+ pWindow->ImplGetFrameData()->mpFocusIdle->Start();
}
break;
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index d50871932fd1..61e62b365e7a 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -498,9 +498,12 @@ void Window::dispose()
if ( mpWindowImpl->mpFrameData )
{
- if ( mpWindowImpl->mpFrameData->mnFocusId )
- Application::RemoveUserEvent( mpWindowImpl->mpFrameData->mnFocusId );
- mpWindowImpl->mpFrameData->mnFocusId = nullptr;
+ if ( mpWindowImpl->mpFrameData->mpFocusIdle )
+ {
+ mpWindowImpl->mpFrameData->mpFocusIdle->Stop();
+ delete mpWindowImpl->mpFrameData->mpFocusIdle;
+ mpWindowImpl->mpFrameData->mpFocusIdle = nullptr;
+ }
if ( mpWindowImpl->mpFrameData->mnMouseMoveId )
Application::RemoveUserEvent( mpWindowImpl->mpFrameData->mnMouseMoveId );
mpWindowImpl->mpFrameData->mnMouseMoveId = nullptr;
@@ -570,7 +573,7 @@ void Window::dispose()
}
mpWindowImpl->mpFrame->SetCallback( nullptr, nullptr );
pSVData->mpDefInst->DestroyFrame( mpWindowImpl->mpFrame );
- assert (mpWindowImpl->mpFrameData->mnFocusId == nullptr);
+ assert (mpWindowImpl->mpFrameData->mpFocusIdle == nullptr);
assert (mpWindowImpl->mpFrameData->mnMouseMoveId == nullptr);
delete mpWindowImpl->mpFrameData;
}
@@ -1036,7 +1039,7 @@ void Window::ImplInit( vcl::Window* pParent, WinBits nStyle, SystemParentData* p
mpWindowImpl->mpFrameData->mpFontCollection = pSVData->maGDIData.mpScreenFontList;
mpWindowImpl->mpFrameData->mpFontCache = pSVData->maGDIData.mpScreenFontCache;
mpWindowImpl->mpFrameData->mnAllSaveBackSize = 0;
- mpWindowImpl->mpFrameData->mnFocusId = nullptr;
+ mpWindowImpl->mpFrameData->mpFocusIdle = nullptr;
mpWindowImpl->mpFrameData->mnMouseMoveId = nullptr;
mpWindowImpl->mpFrameData->mnLastMouseX = -1;
mpWindowImpl->mpFrameData->mnLastMouseY = -1;
diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx
index e61ea101dfcb..ad02eebfbcdc 100644
--- a/vcl/source/window/winproc.cxx
+++ b/vcl/source/window/winproc.cxx
@@ -1135,7 +1135,7 @@ static bool ImplHandleExtTextInput( vcl::Window* pWindow,
if ( !pChild )
return false;
}
- if( !pChild->ImplGetWindowImpl()->mpFrameData->mnFocusId )
+ if( !pChild->ImplGetWindowImpl()->mpFrameData->mpFocusIdle )
break;
Application::Yield();
}
@@ -1739,9 +1739,10 @@ static void ImplActivateFloatingWindows( vcl::Window* pWindow, bool bActive )
}
}
-IMPL_LINK_NOARG_TYPED(vcl::Window, ImplAsyncFocusHdl, void*, void)
+IMPL_LINK_NOARG_TYPED(vcl::Window, ImplAsyncFocusHdl, Idle *, void)
{
- ImplGetWindowImpl()->mpFrameData->mnFocusId = nullptr;
+ delete ImplGetWindowImpl()->mpFrameData->mpFocusIdle;
+ ImplGetWindowImpl()->mpFrameData->mpFocusIdle = nullptr;
// If the status has been preserved, because we got back the focus
// in the meantime, we do nothing
@@ -1852,10 +1853,13 @@ static void ImplHandleGetFocus( vcl::Window* pWindow )
// execute Focus-Events after a delay, such that SystemChildWindows
// do not blink when they receive focus
- if ( !pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId )
+ if ( !pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusIdle )
{
pWindow->ImplGetWindowImpl()->mpFrameData->mbStartFocusState = !pWindow->ImplGetWindowImpl()->mpFrameData->mbHasFocus;
- pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId = Application::PostUserEvent( LINK( pWindow, vcl::Window, ImplAsyncFocusHdl ), nullptr, true);
+ pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusIdle = new Idle("getFocus");
+ pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusIdle->SetIdleHdl(LINK( pWindow, vcl::Window, ImplAsyncFocusHdl ));
+ pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusIdle->SetPriority(SchedulerPriority::LOW);
+ pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusIdle->Start();
vcl::Window* pFocusWin = pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusWin;
if ( pFocusWin && pFocusWin->ImplGetWindowImpl()->mpCursor )
pFocusWin->ImplGetWindowImpl()->mpCursor->ImplShow();
@@ -1881,10 +1885,13 @@ static void ImplHandleLoseFocus( vcl::Window* pWindow )
// execute Focus-Events after a delay, such that SystemChildWindows
// do not flicker when they receive focus
- if ( !pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId )
+ if ( !pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusIdle )
{
pWindow->ImplGetWindowImpl()->mpFrameData->mbStartFocusState = !pWindow->ImplGetWindowImpl()->mpFrameData->mbHasFocus;
- pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId = Application::PostUserEvent( LINK( pWindow, vcl::Window, ImplAsyncFocusHdl ), nullptr, true );
+ pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusIdle = new Idle("loseFocus2");
+ pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusIdle->SetIdleHdl(LINK( pWindow, vcl::Window, ImplAsyncFocusHdl ));
+ pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusIdle->SetPriority(SchedulerPriority::LOW);
+ pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusIdle->Start();
}
vcl::Window* pFocusWin = pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusWin;
diff --git a/vcl/win/window/salframe.cxx b/vcl/win/window/salframe.cxx
index 62883261dfe3..56bce3dc3b72 100644
--- a/vcl/win/window/salframe.cxx
+++ b/vcl/win/window/salframe.cxx
@@ -3031,7 +3031,7 @@ static long ImplHandleMouseMsg( HWND hWnd, UINT nMsg,
// hopefully we will not receive the corresponding button up before this
// button down arrives again
vcl::Window *pWin = pFrame->GetWindow();
- if( pWin && pWin->ImplGetWindowImpl()->mpFrameData->mnFocusId )
+ if( pWin && pWin->ImplGetWindowImpl()->mpFrameData->mpFocusIdle )
{
PostMessageW( hWnd, nMsg, wParam, lParam );
return 1;