void MsgRouter::_updateMarkedWidget(bool bPostMouseMoveMsgs) { Widget_p pNowMarked = 0; Widget_p pWidgetTarget = m_pRoot->findWidget( m_pointerPos, WG_SEARCH_ACTION_TARGET ); // Figure out which button of currently pressed has been pressed the longest. // Mouse is only allowed to mark Widgets that were marked on press of that button. int button = 0; // Button that has been pressed for longest, 0 = no button pressed for( int i = 1 ; i <= WG_MAX_BUTTONS ; i++ ) { if( m_bButtonPressed[i] && (button == 0 || m_pLatestPressMsgs[i]->timestamp() < m_pLatestPressMsgs[button]->timestamp()) ) button = i; } // We are only marking the Widget if no mouse button is pressed or the first pressed button // was pressed on it. if( button == 0 || pWidgetTarget == m_latestPressWidgets[button].rawPtr() ) pNowMarked = pWidgetTarget; // Post Leave events for widgets no longer marked, // Post Enter events for new marked widgets // and Move events for those already marked Widget * pFirstAlreadyMarked = _updateEnteredWidgets( pNowMarked.rawPtr() ); if( bPostMouseMoveMsgs && pFirstAlreadyMarked ) post( new MouseMoveMsg( pFirstAlreadyMarked ) ); // Copy content of pNowMarked to m_pMarkedWidget m_pMarkedWidget = pNowMarked.rawPtr(); // Update PointerStyle WgPointerStyle newStyle; if( pNowMarked && pNowMarked->isEnabled() ) newStyle = pNowMarked->pointerStyle(); else if( button != 0 ) newStyle = m_pointerStyle; else newStyle = WG_POINTER_DEFAULT; if( newStyle != m_pointerStyle ) { post( new PointerChangeMsg( newStyle ) ); m_pointerStyle = newStyle; } }
void InputHandler::setPointer( const RootPanel_p& pRoot, Coord pos, int64_t timestamp ) { Coord prevPointerPos = m_pointerPos; if( timestamp == 0 ) timestamp = m_timeStamp; m_pointerPos = pos; m_pMarkedRoot = 0; Widget_p pNowMarked = 0; Widget_p pWidgetTarget = 0; if( pRoot && pRoot->geo().contains( pos ) ) { m_pMarkedRoot = pRoot.rawPtr(); pWidgetTarget = pRoot->findWidget( m_pointerPos, SearchMode::ActionTarget ); } // Figure out which button of currently pressed has been pressed the longest. // Mouse is only allowed to mark Widgets that were marked on press of that button. int button = 0; // Button that has been pressed for longest, 0 = no button pressed for( int i = 1 ; i <= MouseButton_Max ; i++ ) { if( m_bButtonPressed[i] && (button == 0 || m_latestPressTimestamps[i] < m_latestPressTimestamps[button]) ) button = i; } // We are only marking the Widget if no mouse button is pressed or the first pressed button // was pressed on it. if( button == 0 || pWidgetTarget == m_latestPressWidgets[button].rawPtr() ) pNowMarked = pWidgetTarget; // Post Leave events for widgets no longer marked, // Post Enter events for new marked widgets // and Move events for those already marked Widget * pFirstAlreadyMarked = _updateEnteredWidgets( pNowMarked.rawPtr(), timestamp ); if( pFirstAlreadyMarked ) Base::msgRouter()->post( new MouseMoveMsg( m_inputId, pFirstAlreadyMarked, m_modKeys, pos, timestamp ) ); // Copy content of pNowMarked to m_pMarkedWidget m_pMarkedWidget = pNowMarked.rawPtr(); // Post events for button drag for( int i = 0 ; i <= MouseButton_Max ; i++ ) { if( m_bButtonPressed[i] ) Base::msgRouter()->post( new MouseDragMsg( m_inputId, (MouseButton) i, m_latestPressWidgets[i].rawPtr(), m_latestPressPosition[i], prevPointerPos, m_modKeys, m_pointerPos, timestamp ) ); } // Update PointerStyle PointerStyle newStyle; if( pNowMarked && pNowMarked->isEnabled() ) newStyle = pNowMarked->pointerStyle(); else if( button != 0 ) newStyle = m_pointerStyle; else newStyle = PointerStyle::Default; if( newStyle != m_pointerStyle ) { Base::msgRouter()->post( new PointerChangeMsg( m_inputId, newStyle ) ); m_pointerStyle = newStyle; } }