diff options
author | Isamu Mogi <saturday6c@gmail.com> | 2013-06-08 06:54:34 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-06-11 11:58:39 +0100 |
commit | cbfc61a6ca075eb3fbd9a41dea7f9489c5d56770 (patch) | |
tree | d5818d981720aa7a9c37721482016f7ebc497ee0 /vcl/source | |
parent | a5caaad1b83ecb8d6a17f0608c2716a5e69ae86c (diff) |
fdo#65450 Not to call MenuBar's selection logic for rollover effect
Currently when we rollovers on MenuBar, MenuBar's selection logic
(ChangeHighlightItem et al) is called. But calling these logic on background
window seems to illegal and causes fdo#65450.
(cherry picked from commit 29474304550512f56ef597464bfdb5304bf56bb1)
Diffstat (limited to 'vcl/source')
-rw-r--r-- | vcl/source/window/menu.cxx | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx index 9b4b32f3a98c..2d391893cea1 100644 --- a/vcl/source/window/menu.cxx +++ b/vcl/source/window/menu.cxx @@ -676,6 +676,7 @@ private: Menu* pMenu; PopupMenu* pActivePopup; sal_uInt16 nHighlightedItem; + sal_uInt16 nRolloveredItem; sal_uLong nSaveFocusId; sal_Bool mbAutoPopup; sal_Bool bIgnoreFirstMove; @@ -5152,6 +5153,7 @@ MenuBarWindow::MenuBarWindow( Window* pParent ) : pActivePopup = NULL; nSaveFocusId = 0; nHighlightedItem = ITEMPOS_INVALID; + nRolloveredItem = ITEMPOS_INVALID; mbAutoPopup = sal_True; nSaveFocusId = 0; bIgnoreFirstMove = sal_True; @@ -5416,11 +5418,29 @@ void MenuBarWindow::MouseMove( const MouseEvent& rMEvt ) if ( rMEvt.IsSynthetic() || rMEvt.IsEnterWindow() ) return; - if ( rMEvt.IsLeaveWindow() && !pActivePopup ) + if ( rMEvt.IsLeaveWindow() ) { - ChangeHighlightItem( ITEMPOS_INVALID, sal_False ); + if ( nRolloveredItem != ITEMPOS_INVALID && nRolloveredItem != nHighlightedItem ) + HighlightItem( nRolloveredItem, sal_False ); + + nRolloveredItem = ITEMPOS_INVALID; + return; + } + + sal_uInt16 nEntry = ImplFindEntry( rMEvt.GetPosPixel() ); + if ( nHighlightedItem == ITEMPOS_INVALID ) + { + if ( nRolloveredItem != nEntry ) + { + if ( nRolloveredItem != ITEMPOS_INVALID ) + HighlightItem( nRolloveredItem, sal_False ); + + nRolloveredItem = nEntry; + HighlightItem( nRolloveredItem, sal_True ); + } return; } + nRolloveredItem = nEntry; if( bIgnoreFirstMove ) { @@ -5428,15 +5448,9 @@ void MenuBarWindow::MouseMove( const MouseEvent& rMEvt ) return; } - sal_uInt16 nEntry = ImplFindEntry( rMEvt.GetPosPixel() ); if ( ( nEntry != ITEMPOS_INVALID ) && ( nEntry != nHighlightedItem ) ) - { - if ( ! pActivePopup ) - mbAutoPopup = sal_False; - ChangeHighlightItem( nEntry, sal_False ); - } } void MenuBarWindow::ChangeHighlightItem( sal_uInt16 n, sal_Bool bSelectEntry, sal_Bool bAllowRestoreFocus, sal_Bool bDefaultToDocument) @@ -5505,13 +5519,19 @@ void MenuBarWindow::ChangeHighlightItem( sal_uInt16 n, sal_Bool bSelectEntry, sa if ( nHighlightedItem != ITEMPOS_INVALID ) { - HighlightItem( nHighlightedItem, sal_False ); + if ( nHighlightedItem != nRolloveredItem ) + HighlightItem( nHighlightedItem, sal_False ); + pMenu->ImplCallEventListeners( VCLEVENT_MENU_DEHIGHLIGHT, nHighlightedItem ); } nHighlightedItem = (sal_uInt16)n; DBG_ASSERT( ( nHighlightedItem == ITEMPOS_INVALID ) || pMenu->ImplIsVisible( nHighlightedItem ), "ChangeHighlightItem: Not visible!" ); - HighlightItem( nHighlightedItem, sal_True ); + if ( nHighlightedItem != ITEMPOS_INVALID ) + HighlightItem( nHighlightedItem, sal_True ); + else if ( nRolloveredItem != ITEMPOS_INVALID ) + HighlightItem( nRolloveredItem, sal_True ); + pMenu->ImplCallHighlight( nHighlightedItem ); if( mbAutoPopup ) @@ -5540,7 +5560,7 @@ void MenuBarWindow::HighlightItem( sal_uInt16 nPos, sal_Bool bHighlight ) Rectangle aRect = Rectangle( Point( nX, 1 ), Size( pData->aSz.Width(), GetOutputSizePixel().Height()-2 ) ); Push( PUSH_CLIPREGION ); IntersectClipRegion( aRect ); - bool bRollover = bHighlight && ( !pActivePopup && !mbAutoPopup ); + bool bRollover = bHighlight && nPos != nHighlightedItem; if ( bHighlight ) { if( IsNativeControlSupported( CTRL_MENUBAR, PART_MENU_ITEM ) && |