summaryrefslogtreecommitdiff
path: root/vcl/source
diff options
context:
space:
mode:
authorIsamu Mogi <saturday6c@gmail.com>2013-06-08 06:54:34 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-06-11 11:58:39 +0100
commitcbfc61a6ca075eb3fbd9a41dea7f9489c5d56770 (patch)
treed5818d981720aa7a9c37721482016f7ebc497ee0 /vcl/source
parenta5caaad1b83ecb8d6a17f0608c2716a5e69ae86c (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.cxx42
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 ) &&