void TopWindow::processEvent( EvtMouse &rEvtMouse ) { // Get the control hit by the mouse CtrlGeneric *pNewHitControl = findHitControl( rEvtMouse.getXPos(), rEvtMouse.getYPos() ); setLastHit( pNewHitControl ); // Change the focused control if( rEvtMouse.getAction() == EvtMouse::kDown ) { // Raise the window m_rWindowManager.raise( *this ); if( pNewHitControl && pNewHitControl->isFocusable() ) { // If a new control gains the focus, the previous one loses it if( m_pFocusControl && m_pFocusControl != pNewHitControl ) { EvtFocus evt( getIntf(), false ); m_pFocusControl->handleEvent( evt ); } if( pNewHitControl != m_pFocusControl ) { m_pFocusControl = pNewHitControl; EvtFocus evt( getIntf(), false ); pNewHitControl->handleEvent( evt ); } } else if( m_pFocusControl ) { // The previous control loses the focus EvtFocus evt( getIntf(), false ); m_pFocusControl->handleEvent( evt ); m_pFocusControl = NULL; } } // Send a mouse event to the hit control, or to the control // that captured the mouse, if any CtrlGeneric *pActiveControl = pNewHitControl; if( m_pCapturingControl ) { pActiveControl = m_pCapturingControl; } if( pActiveControl ) { pActiveControl->handleEvent( rEvtMouse ); } }
void TopWindow::processEvent( EvtMotion &rEvtMotion ) { // New control hit by the mouse CtrlGeneric *pNewHitControl = findHitControl( rEvtMotion.getXPos() - getLeft(), rEvtMotion.getYPos() - getTop() ); setLastHit( pNewHitControl ); /// Update the help text VarManager *pVarManager = VarManager::instance( getIntf() ); if( pNewHitControl ) { pVarManager->getHelpText().set( pNewHitControl->getHelpText() ); } // Send a motion event to the hit control, or to the control // that captured the mouse, if any CtrlGeneric *pActiveControl = pNewHitControl; if( m_pCapturingControl ) { pActiveControl = m_pCapturingControl; } if( pActiveControl ) { // Compute the coordinates relative to the window int xPos = rEvtMotion.getXPos() - getLeft(); int yPos = rEvtMotion.getYPos() - getTop(); // Send a motion event EvtMotion evt( getIntf(), xPos, yPos ); pActiveControl->handleEvent( evt ); } }
void TopWindow::processEvent( EvtDragDrop &rEvtDragDrop ) { // Get the control hit by the mouse int xPos = rEvtDragDrop.getXPos() - getLeft(); int yPos = rEvtDragDrop.getYPos() - getTop(); CtrlGeneric *pHitControl = findHitControl( xPos, yPos ); if( pHitControl && pHitControl->getType() == "tree" ) { // Send a dragDrop event EvtDragDrop evt( getIntf(), xPos, yPos, rEvtDragDrop.getFiles() ); pHitControl->handleEvent( evt ); } else { list<string> files = rEvtDragDrop.getFiles(); list<string>::const_iterator it = files.begin(); for( bool first = true; it != files.end(); ++it, first = false ) { bool playOnDrop = m_playOnDrop && first; CmdAddItem( getIntf(), it->c_str(), playOnDrop ).execute(); } } m_pDragControl = NULL; }
void TopWindow::processEvent( EvtScroll &rEvtScroll ) { // Raise the windows raise(); // Get the control hit by the mouse CtrlGeneric *pNewHitControl = findHitControl( rEvtScroll.getXPos(), rEvtScroll.getYPos()); setLastHit( pNewHitControl ); // send a mouse event to the right control when scrollable // if none, send it directly to the vlc core CtrlGeneric *pHitControl = m_pCapturingControl ? m_pCapturingControl : pNewHitControl; if( pHitControl && pHitControl->isScrollable() ) { pHitControl->handleEvent( rEvtScroll ); } else { // Treat the scroll event as a hotkey plus current modifiers int i = (rEvtScroll.getDirection() == EvtScroll::kUp ? KEY_MOUSEWHEELUP : KEY_MOUSEWHEELDOWN) | m_currModifier; var_SetInteger( getIntf()->p_libvlc, "key-pressed", i ); } }
void TopWindow::processEvent( EvtScroll &rEvtScroll ) { // Raise the windows raise(); // Get the control hit by the mouse CtrlGeneric *pNewHitControl = findHitControl( rEvtScroll.getXPos(), rEvtScroll.getYPos()); setLastHit( pNewHitControl ); // Send a mouse event to the hit control, or to the control // that captured the mouse, if any CtrlGeneric *pActiveControl = pNewHitControl; if( m_pCapturingControl ) { pActiveControl = m_pCapturingControl; } if( pActiveControl ) { pActiveControl->handleEvent( rEvtScroll ); } else { // Treat the scroll event as a hotkey plus current modifiers int i = (rEvtScroll.getDirection() == EvtScroll::kUp ? KEY_MOUSEWHEELUP : KEY_MOUSEWHEELDOWN) | m_currModifier; var_SetInteger( getIntf()->p_libvlc, "key-pressed", i ); } }
void TopWindow::processEvent( EvtScroll &rEvtScroll ) { // Raise the windows raise(); // Get the control hit by the mouse CtrlGeneric *pNewHitControl = findHitControl( rEvtScroll.getXPos(), rEvtScroll.getYPos()); setLastHit( pNewHitControl ); // Send a mouse event to the hit control, or to the control // that captured the mouse, if any CtrlGeneric *pActiveControl = pNewHitControl; if( m_pCapturingControl ) { pActiveControl = m_pCapturingControl; } if( pActiveControl ) { pActiveControl->handleEvent( rEvtScroll ); } else { // Treat the scroll event as a hotkey vlc_value_t val; if( rEvtScroll.getDirection() == EvtScroll::kUp ) { val.i_int = KEY_MOUSEWHEELUP; } else { val.i_int = KEY_MOUSEWHEELDOWN; } // Add the modifiers val.i_int |= m_currModifier; var_Set( getIntf()->p_vlc, "key-pressed", val ); } }
void TopWindow::processEvent( EvtDragDrop &rEvtDragDrop ) { // Get the control hit by the mouse int xPos = rEvtDragDrop.getXPos() - getLeft(); int yPos = rEvtDragDrop.getYPos() - getTop(); CtrlGeneric *pHitControl = findHitControl( xPos, yPos ); if( pHitControl && pHitControl->getType() == "tree" ) { // Send a dragDrop event EvtDragDrop evt( getIntf(), xPos, yPos, rEvtDragDrop.getFiles() ); pHitControl->handleEvent( evt ); } else { input_thread_t *pInput = getIntf()->p_sys->p_input; bool is_subtitle = false; list<string> files = rEvtDragDrop.getFiles(); if( files.size() == 1 && pInput != NULL ) { list<string>::const_iterator it = files.begin(); char* psz_file = make_path( it->c_str() ); if( psz_file ) { is_subtitle = !input_AddSubtitleOSD( pInput, psz_file, true, true ); free( psz_file ); } } if( !is_subtitle ) { list<string>::const_iterator it = files.begin(); for( bool first = true; it != files.end(); ++it, first = false ) { bool playOnDrop = m_playOnDrop && first; CmdAddItem( getIntf(), it->c_str(), playOnDrop ).execute(); } } } m_pDragControl = NULL; }
CtrlGeneric *TopWindow::findHitControl( int xPos, int yPos ) { if( m_pActiveLayout == NULL ) { return NULL; } // Get the controls in the active layout const list<LayeredControl> &ctrlList = m_pActiveLayout->getControlList(); list<LayeredControl>::const_reverse_iterator iter; // New control hit by the mouse CtrlGeneric *pNewHitControl = NULL; // Loop on the control list to find the uppest hit control for( iter = ctrlList.rbegin(); iter != ctrlList.rend(); iter++ ) { // Get the position of the control in the layout const Position *pos = (*iter).m_pControl->getPosition(); if( pos != NULL ) { // Compute the coordinates of the mouse relative to the control int xRel = xPos - pos->getLeft(); int yRel = yPos - pos->getTop(); CtrlGeneric *pCtrl = (*iter).m_pControl; // Control hit ? if( pCtrl->isVisible() && pCtrl->mouseOver( xRel, yRel ) ) { pNewHitControl = (*iter).m_pControl; break; } } else { msg_Dbg( getIntf(), "Control at NULL position" ); } } // If the hit control has just been entered, send it an enter event if( pNewHitControl && (pNewHitControl != m_pLastHitControl) ) { // Don't send the event if another control captured the mouse if( !m_pCapturingControl || (m_pCapturingControl == pNewHitControl ) ) { EvtEnter evt( getIntf() ); pNewHitControl->handleEvent( evt ); if( !m_pCapturingControl ) { // Show the tooltip m_rWindowManager.hideTooltip(); UString tipText = pNewHitControl->getTooltipText(); if( tipText.length() > 0 ) { // Set the tooltip text variable VarManager *pVarManager = VarManager::instance( getIntf() ); pVarManager->getTooltipText().set( tipText ); m_rWindowManager.showTooltip(); } } } } return pNewHitControl; }
void TopWindow::forwardEvent( EvtGeneric &rEvt, CtrlGeneric &rCtrl ) { // XXX: We should do some checks here rCtrl.handleEvent( rEvt ); }