summaryrefslogtreecommitdiff
path: root/vcl/win
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/win')
-rw-r--r--vcl/win/app/salinst.cxx185
1 files changed, 18 insertions, 167 deletions
diff --git a/vcl/win/app/salinst.cxx b/vcl/win/app/salinst.cxx
index ea4c9420beb0..18605f2f17d4 100644
--- a/vcl/win/app/salinst.cxx
+++ b/vcl/win/app/salinst.cxx
@@ -665,116 +665,8 @@ LRESULT CALLBACK SalComWndProcW( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lPa
return nRet;
}
-namespace {
-
-struct MsgRange
-{
- UINT nStart;
- UINT nEnd;
-};
-
-}
-
-static std::vector<MsgRange> GetOtherRanges( VclInputFlags nType )
-{
- assert( nType != VCL_INPUT_ANY );
-
- // this array must be kept sorted!
- const UINT nExcludeMsgIds[] =
- {
- 0,
-
- WM_MOVE, // 3
- WM_SIZE, // 5
- WM_PAINT, // 15
- WM_KEYDOWN, // 256
- WM_TIMER, // 275
-
- WM_MOUSEFIRST, // 512
- 513,
- 514,
- 515,
- 516,
- 517,
- 518,
- 519,
- 520,
- WM_MOUSELAST, // 521
-
- SAL_MSG_POSTMOVE, // WM_USER+136
- SAL_MSG_POSTCALLSIZE, // WM_USER+137
-
- SAL_MSG_TIMER_CALLBACK, // WM_USER+162
-
- UINT_MAX
- };
- const unsigned MAX_EXCL = SAL_N_ELEMENTS( nExcludeMsgIds );
-
- bool aExcludeMsgList[ MAX_EXCL ] = { false, };
- std::vector<MsgRange> aResult;
-
- // set the excluded values
- if ( !(nType & VclInputFlags::MOUSE) )
- {
- for ( unsigned i = 0; nExcludeMsgIds[ 6 + i ] <= WM_MOUSELAST; ++i )
- aExcludeMsgList[ 6 + i ] = true;
- }
-
- if ( !(nType & VclInputFlags::KEYBOARD) )
- aExcludeMsgList[ 4 ] = true;
-
- if ( !(nType & VclInputFlags::PAINT) )
- {
- aExcludeMsgList[ 1 ] = true;
- aExcludeMsgList[ 2 ] = true;
- aExcludeMsgList[ 3 ] = true;
- aExcludeMsgList[ 16 ] = true;
- aExcludeMsgList[ 17 ] = true;
- }
-
- if ( !(nType & VclInputFlags::TIMER) )
- {
- aExcludeMsgList[ 5 ] = true;
- aExcludeMsgList[ 18 ] = true;
- }
-
- // build the message ranges to check
- MsgRange aRange = { 0, 0 };
- bool doEnd = true;
- for ( unsigned i = 1; i < MAX_EXCL; ++i )
- {
- if ( aExcludeMsgList[ i ] )
- {
- if ( !doEnd )
- {
- if ( nExcludeMsgIds[ i ] == aRange.nStart )
- ++aRange.nStart;
- else
- doEnd = true;
- }
- if ( doEnd )
- {
- aRange.nEnd = nExcludeMsgIds[ i ] - 1;
- aResult.push_back( aRange );
- doEnd = false;
- aRange.nStart = aRange.nEnd + 2;
- }
- }
- }
-
- if ( aRange.nStart != UINT_MAX )
- {
- aRange.nEnd = UINT_MAX;
- aResult.push_back( aRange );
- }
-
- return aResult;
-}
-
bool WinSalInstance::AnyInput( VclInputFlags nType )
{
- MSG aMsg;
-
if ( nType & VclInputFlags::TIMER )
{
const WinSalTimer* pTimer = static_cast<WinSalTimer*>( ImplGetSVData()->maSchedCtx.mpSalTimer );
@@ -782,81 +674,40 @@ bool WinSalInstance::AnyInput( VclInputFlags nType )
return true;
}
+ // Note: Do not use PeekMessage(), despite the name it may dispatch events,
+ // even with PM_NOREMOVE specified, which may lead to unwanted recursion.
+
if ( (nType & VCL_INPUT_ANY) == VCL_INPUT_ANY )
{
// revert bugfix for #108919# which never reported timeouts when called from the timer handler
// which made the application completely unresponsive during background formatting
- if ( PeekMessageW( &aMsg, nullptr, 0, 0, PM_NOREMOVE | PM_NOYIELD ) )
+ if ( GetQueueStatus( QS_ALLEVENTS ))
return true;
}
else
{
- const bool bCheck_KEYBOARD (nType & VclInputFlags::KEYBOARD);
- const bool bCheck_OTHER (nType & VclInputFlags::OTHER);
-
- // If there is a modifier key event, it counts as OTHER
- // Previously we were simply ignoring these events...
- if ( bCheck_KEYBOARD || bCheck_OTHER )
- {
- if ( PeekMessageW( &aMsg, nullptr, WM_KEYDOWN, WM_KEYDOWN,
- PM_NOREMOVE | PM_NOYIELD ) )
- {
- const bool bIsModifier = ( (aMsg.wParam == VK_SHIFT) ||
- (aMsg.wParam == VK_CONTROL) || (aMsg.wParam == VK_MENU) );
- if ( bCheck_KEYBOARD && !bIsModifier )
- return true;
- if ( bCheck_OTHER && bIsModifier )
- return true;
- }
- }
+ UINT flags = 0;
- // Other checks for all messages not excluded.
- // The less we exclude, the less ranges have to be checked!
- if ( bCheck_OTHER )
- {
- // TIMER and KEYBOARD are already handled, so always exclude them!
- VclInputFlags nOtherType = nType &
- ~VclInputFlags(VclInputFlags::KEYBOARD | VclInputFlags::TIMER);
-
- std::vector<MsgRange> aMsgRangeList( GetOtherRanges( nOtherType ) );
- for ( MsgRange const & aRange : aMsgRangeList )
- if ( PeekMessageW( &aMsg, nullptr, aRange.nStart,
- aRange.nEnd, PM_NOREMOVE | PM_NOYIELD ) )
- return true;
-
- // MOUSE and PAINT already handled, so skip further checks
- return false;
- }
+ // This code previously considered modifier keys as OTHER,
+ // but that makes this hard to do without PeekMessage,
+ // is inconsistent with the X11 backend, and I see no good reason.
+ if ( nType & VclInputFlags::KEYBOARD )
+ flags |= QS_KEY;
if ( nType & VclInputFlags::MOUSE )
- {
- if ( PeekMessageW( &aMsg, nullptr, WM_MOUSEFIRST, WM_MOUSELAST,
- PM_NOREMOVE | PM_NOYIELD ) )
- return true;
- }
+ flags |= QS_MOUSE;
if ( nType & VclInputFlags::PAINT )
- {
- if ( PeekMessageW( &aMsg, nullptr, WM_PAINT, WM_PAINT,
- PM_NOREMOVE | PM_NOYIELD ) )
- return true;
+ flags |= QS_PAINT;
- if ( PeekMessageW( &aMsg, nullptr, WM_SIZE, WM_SIZE,
- PM_NOREMOVE | PM_NOYIELD ) )
- return true;
+ if ( nType & VclInputFlags::TIMER )
+ flags |= QS_TIMER;
- if ( PeekMessageW( &aMsg, nullptr, SAL_MSG_POSTCALLSIZE, SAL_MSG_POSTCALLSIZE,
- PM_NOREMOVE | PM_NOYIELD ) )
- return true;
+ if( nType & VclInputFlags::OTHER )
+ flags |= QS_ALLEVENTS & ~QS_KEY & ~QS_MOUSE & ~QS_PAINT & ~QS_TIMER;
- if ( PeekMessageW( &aMsg, nullptr, WM_MOVE, WM_MOVE,
- PM_NOREMOVE | PM_NOYIELD ) )
- return true;
-
- if ( PeekMessageW( &aMsg, nullptr, SAL_MSG_POSTMOVE, SAL_MSG_POSTMOVE,
- PM_NOREMOVE | PM_NOYIELD ) )
- return true;
- }
+ if( GetQueueStatus( flags ))
+ return true;
}
return false;