void TopWindow::onControlRelease( const CtrlGeneric &rCtrl ) { // Release the capturing control if( m_pCapturingControl == &rCtrl ) { m_pCapturingControl = NULL; } else { msg_Dbg( getIntf(), "Control had not captured the mouse" ); } // Send an enter event to the control under the mouse, if it doesn't // have received it yet if( m_pLastHitControl && m_pLastHitControl != &rCtrl ) { EvtEnter evt( getIntf() ); m_pLastHitControl->handleEvent( evt ); // Show the tooltip m_rWindowManager.hideTooltip(); UString tipText = m_pLastHitControl->getTooltipText(); if( tipText.length() > 0 ) { // Set the tooltip text variable VarManager *pVarManager = VarManager::instance( getIntf() ); pVarManager->getTooltipText().set( tipText ); m_rWindowManager.showTooltip(); } } }
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 VarText::set( const UString &rText ) { // Avoid an infinite loop if( rText == m_text ) { return; } m_text = rText; if( m_substVars ) { // Stop observing other variables delObservers(); VlcProc *pVlcProc = VlcProc::instance( getIntf() ); VarManager *pVarManager = VarManager::instance( getIntf() ); // Observe needed variables if( m_text.find( "$H" ) != UString::npos ) { pVarManager->getHelpText().addObserver( this ); } if( m_text.find( "$T" ) != UString::npos || m_text.find( "$t" ) != UString::npos || m_text.find( "$L" ) != UString::npos || m_text.find( "$l" ) != UString::npos || m_text.find( "$D" ) != UString::npos || m_text.find( "$d" ) != UString::npos ) { pVlcProc->getTimeVar().addObserver( this ); } if( m_text.find( "$V" ) != UString::npos ) { pVlcProc->getVolumeVar().addObserver( this ); } if( m_text.find( "$N" ) != UString::npos ) { pVlcProc->getStreamNameVar().addObserver( this ); } if( m_text.find( "$F" ) != UString::npos ) { pVlcProc->getStreamURIVar().addObserver( this ); } if( m_text.find( "$B" ) != UString::npos ) { pVlcProc->getStreamBitRateVar().addObserver( this ); } if( m_text.find( "$S" ) != UString::npos ) { pVlcProc->getStreamSampleRateVar().addObserver( this ); } if( m_text.find( "$R" ) != UString::npos ) { pVlcProc->getSpeedVar().addObserver( this ); } } notify(); }
void TopWindow::onTooltipChange( const CtrlGeneric &rCtrl ) { // Check that the control is the active one if( m_pLastHitControl && m_pLastHitControl == &rCtrl ) { // Set the tooltip text variable VarManager *pVarManager = VarManager::instance( getIntf() ); pVarManager->getTooltipText().set( rCtrl.getTooltipText() ); } }
WindowManager::WindowManager( intf_thread_t *pIntf ): SkinObject( pIntf ), m_magnet( 0 ), m_alpha( 255 ), m_moveAlpha( 255 ), m_opacityEnabled( false ), m_opacity( 255 ), m_direction( kNone ), m_maximizeRect(0, 0, 50, 50), m_pTooltip( NULL ), m_pPopup( NULL ) { // Create and register a variable for the "on top" status VarManager *pVarManager = VarManager::instance( getIntf() ); m_cVarOnTop = VariablePtr( new VarBoolImpl( getIntf() ) ); pVarManager->registerVar( m_cVarOnTop, "vlc.isOnTop" ); // transparency switched on or off by user m_opacityEnabled = var_InheritBool( getIntf(), "skins2-transparency" ); // opacity overridden by user m_opacity = 255 * var_InheritFloat( getIntf(), "qt-opacity" ); }
void IniFile::parseFile() { VarManager *pVarManager = VarManager::instance( getIntf() ); // Open the file std::fstream fs( m_path.c_str(), std::fstream::in ); if( fs.is_open() ) { std::string section; std::string line; while( !fs.eof() ) { // Read the next line fs >> line; switch( line[0] ) { // "[section]" line ? case '[': section = line.substr( 1, line.size() - 2); break; // Comment case ';': case '#': break; // Variable declaration default: size_t eqPos = line.find( '=' ); std::string var = line.substr( 0, eqPos ); std::string val = line.substr( eqPos + 1, line.size() - eqPos - 1); std::string name = m_name + "." + section + "." + var; // Convert to lower case because of some buggy winamp2 skins for( size_t i = 0; i < name.size(); i++ ) { name[i] = tolower( (unsigned char)name[i] ); } // Register the value in the var manager pVarManager->registerConst( name, val ); } } fs.close(); }
void TopWindow::onTooltipChange( const CtrlGeneric &rCtrl ) { // Check that the control is the active one if( m_pLastHitControl && m_pLastHitControl == &rCtrl ) { if( rCtrl.getTooltipText().size() ) { // Set the tooltip text variable VarManager *pVarManager = VarManager::instance( getIntf() ); pVarManager->getTooltipText().set( rCtrl.getTooltipText() ); m_rWindowManager.showTooltip(); } else { // Nothing to display, so hide the tooltip m_rWindowManager.hideTooltip(); } } }
void VarText::delObservers() { // Stop observing other variables VlcProc *pVlcProc = getIntf()->p_sys->p_vlcProc; VarManager *pVarManager = getIntf()->p_sys->p_varManager; if( pVlcProc ) { pVlcProc->getTimeVar().delObserver( this ); pVlcProc->getVolumeVar().delObserver( this ); pVlcProc->getSpeedVar().delObserver( this ); pVlcProc->getStreamNameVar().delObserver( this ); pVlcProc->getStreamURIVar().delObserver( this ); pVlcProc->getStreamBitRateVar().delObserver( this ); pVlcProc->getStreamSampleRateVar().delObserver( this ); } if( pVarManager ) pVarManager->getHelpText().delObserver( this ); }
VlcProc::VlcProc( intf_thread_t *pIntf ): SkinObject( pIntf ), m_varEqBands( pIntf ), m_pVout( NULL ), m_pAout( NULL ), m_bEqualizer_started( false ) { // Create and register VLC variables VarManager *pVarManager = VarManager::instance( getIntf() ); #define REGISTER_VAR( var, type, name ) \ var = VariablePtr( new type( getIntf() ) ); \ pVarManager->registerVar( var, name ); REGISTER_VAR( m_cVarRandom, VarBoolImpl, "playlist.isRandom" ) REGISTER_VAR( m_cVarLoop, VarBoolImpl, "playlist.isLoop" ) REGISTER_VAR( m_cVarRepeat, VarBoolImpl, "playlist.isRepeat" ) REGISTER_VAR( m_cPlaytree, Playtree, "playtree" ) pVarManager->registerVar( getPlaytreeVar().getPositionVarPtr(), "playtree.slider" ); pVarManager->registerVar( m_cVarRandom, "playtree.isRandom" ); pVarManager->registerVar( m_cVarLoop, "playtree.isLoop" ); REGISTER_VAR( m_cVarPlaying, VarBoolImpl, "vlc.isPlaying" ) REGISTER_VAR( m_cVarStopped, VarBoolImpl, "vlc.isStopped" ) REGISTER_VAR( m_cVarPaused, VarBoolImpl, "vlc.isPaused" ) /* Input variables */ pVarManager->registerVar( m_cVarRepeat, "playtree.isRepeat" ); REGISTER_VAR( m_cVarTime, StreamTime, "time" ) REGISTER_VAR( m_cVarSeekable, VarBoolImpl, "vlc.isSeekable" ) REGISTER_VAR( m_cVarDvdActive, VarBoolImpl, "dvd.isActive" ) REGISTER_VAR( m_cVarRecordable, VarBoolImpl, "vlc.canRecord" ) REGISTER_VAR( m_cVarRecording, VarBoolImpl, "vlc.isRecording" ) /* Vout variables */ REGISTER_VAR( m_cVarFullscreen, VarBoolImpl, "vlc.isFullscreen" ) REGISTER_VAR( m_cVarHasVout, VarBoolImpl, "vlc.hasVout" ) /* Aout variables */ REGISTER_VAR( m_cVarHasAudio, VarBoolImpl, "vlc.hasAudio" ) REGISTER_VAR( m_cVarVolume, Volume, "volume" ) REGISTER_VAR( m_cVarMute, VarBoolImpl, "vlc.isMute" ) REGISTER_VAR( m_cVarEqualizer, VarBoolImpl, "equalizer.isEnabled" ) REGISTER_VAR( m_cVarEqPreamp, EqualizerPreamp, "equalizer.preamp" ) #undef REGISTER_VAR m_cVarSpeed = VariablePtr( new VarText( getIntf(), false ) ); pVarManager->registerVar( m_cVarSpeed, "speed" ); SET_TEXT( m_cVarSpeed, UString( getIntf(), "1") ); m_cVarStreamName = VariablePtr( new VarText( getIntf(), false ) ); pVarManager->registerVar( m_cVarStreamName, "streamName" ); m_cVarStreamURI = VariablePtr( new VarText( getIntf(), false ) ); pVarManager->registerVar( m_cVarStreamURI, "streamURI" ); m_cVarStreamBitRate = VariablePtr( new VarText( getIntf(), false ) ); pVarManager->registerVar( m_cVarStreamBitRate, "bitrate" ); m_cVarStreamSampleRate = VariablePtr( new VarText( getIntf(), false ) ); pVarManager->registerVar( m_cVarStreamSampleRate, "samplerate" ); m_cVarStreamArt = VariablePtr( new VarString( getIntf() ) ); pVarManager->registerVar( m_cVarStreamArt, "streamArt" ); // Register the equalizer bands for( int i = 0; i < EqualizerBands::kNbBands; i++) { stringstream ss; ss << "equalizer.band(" << i << ")"; pVarManager->registerVar( m_varEqBands.getBand( i ), ss.str() ); } // XXX WARNING XXX // The object variable callbacks are called from other VLC threads, // so they must put commands in the queue and NOT do anything else // (X11 calls are not reentrant) #define ADD_CALLBACK( p_object, var ) \ var_AddCallback( p_object, var, onGenericCallback, this ); ADD_CALLBACK( pIntf->p_sys->p_playlist, "volume" ) ADD_CALLBACK( pIntf->p_libvlc, "intf-toggle-fscontrol" ) ADD_CALLBACK( pIntf->p_sys->p_playlist, "item-current" ) ADD_CALLBACK( pIntf->p_sys->p_playlist, "random" ) ADD_CALLBACK( pIntf->p_sys->p_playlist, "loop" ) ADD_CALLBACK( pIntf->p_sys->p_playlist, "repeat" ) #undef ADD_CALLBACK // Called when a playlist item is added var_AddCallback( pIntf->p_sys->p_playlist, "playlist-item-append", onItemAppend, this ); // Called when a playlist item is deleted // TODO: properly handle item-deleted var_AddCallback( pIntf->p_sys->p_playlist, "playlist-item-deleted", onItemDelete, this ); // Called when the current input changes var_AddCallback( pIntf->p_sys->p_playlist, "input-current", onInputNew, this ); // Called when a playlist item changed var_AddCallback( pIntf->p_sys->p_playlist, "item-change", onItemChange, this ); // Called when we have an interaction dialog to display var_Create( pIntf, "interaction", VLC_VAR_ADDRESS ); var_AddCallback( pIntf, "interaction", onInteraction, this ); // initialize variables refering to liblvc and playlist objects init_variables(); }
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; }
const UString VarText::get() const { if( !m_substVars ) { // Do not substitute "$X" variables return m_text; } uint32_t pos; VlcProc *pVlcProc = VlcProc::instance( getIntf() ); // Fill a temporary UString object, and replace the escape characters // ($H for help, $T for current time, $L for time left, $D for duration, // $V for volume) UString temp( m_text ); // $H is processed first, in case the help string contains other variables // to replace. And it is replaced only once, in case one of these other // variables is $H... if( (pos = temp.find( "$H" )) != UString::npos ) { VarManager *pVarManager = VarManager::instance( getIntf() ); temp.replace( pos, 2, pVarManager->getHelpText().get() ); } while( (pos = temp.find( "$T" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getTimeVar().getAsStringCurrTime().c_str() ); } while( (pos = temp.find( "$t" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getTimeVar().getAsStringCurrTime(true).c_str() ); } while( (pos = temp.find( "$L" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getTimeVar().getAsStringTimeLeft().c_str() ); } while( (pos = temp.find( "$l" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getTimeVar().getAsStringTimeLeft(true).c_str() ); } while( (pos = temp.find( "$D" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getTimeVar().getAsStringDuration().c_str() ); } while( (pos = temp.find( "$d" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getTimeVar().getAsStringDuration(true).c_str() ); } while( (pos = temp.find( "$V" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getVolumeVar().getAsStringPercent().c_str() ); } while( (pos = temp.find( "$N" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getStreamNameVar().get() ); } while( (pos = temp.find( "$F" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getStreamURIVar().get() ); } while( (pos = temp.find( "$B" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getStreamBitRateVar().get() ); } while( (pos = temp.find( "$S" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getStreamSampleRateVar().get() ); } while( (pos = temp.find( "$R" )) != UString::npos ) { temp.replace( pos, 2, pVlcProc->getSpeedVar().get() ); } return temp; }