summaryrefslogtreecommitdiff
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:30:59 +0100
commit29474304550512f56ef597464bfdb5304bf56bb1 (patch)
treecf75b46a20bd4dbaf40c231629fddc09e3127615
parentf7595decdfb5f9aac61ccc61ad38de4a1faa402d (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.
-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 ) &&