void InputHandler::setFocusedWindow( const RootPanel_p& pRoot ) { if( pRoot == m_pFocusedRoot ) return; if( m_pFocusedRoot ) { Widget * p = m_pFocusedRoot->_focusedChild(); if( p ) _setUnfocused( p ); } m_pFocusedRoot = pRoot.rawPtr(); if( pRoot ) { Widget * p = pRoot->_focusedChild(); if( p ) _setFocused( p ); else _setFocused( pRoot->widget().rawPtr() ); // Bottom container gets focus per default. } }
void MsgRouter::setRoot( const RootPanel_p& pRoot ) { m_pRoot = pRoot.rawPtr(); }
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; } }