+/**
+ * On mouse go above FSC
+ */
+void FullscreenControllerWidget::enterEvent( QEvent *event )
+{
+ b_mouse_over = true;
+
+ p_hideTimer->stop();
+#if HAVE_TRANSPARENCY
+ p_slowHideTimer->stop();
+#endif
+}
+
+/**
+ * On mouse go out from FSC
+ */
+void FullscreenControllerWidget::leaveEvent( QEvent *event )
+{
+ planHideFSC();
+
+ b_mouse_over = false;
+}
+
+/**
+ * When you get pressed key, send it to video output
+ * FIXME: clearing focus by clearFocus() to not getting
+ * key press events didnt work
+ */
+void FullscreenControllerWidget::keyPressEvent( QKeyEvent *event )
+{
+ int i_vlck = qtEventToVLCKey( event );
+ if( i_vlck > 0 )
+ {
+ var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlck );
+ event->accept();
+ }
+ else
+ event->ignore();
+}
+
+/* */
+static int FullscreenControllerWidgetFullscreenChanged( vlc_object_t *vlc_object, const char *variable,
+ vlc_value_t old_val, vlc_value_t new_val,
+ void *data )
+{
+ vout_thread_t *p_vout = (vout_thread_t *) vlc_object;
+ FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *)data;
+
+ p_fs->fullscreenChanged( p_vout, new_val.b_bool, var_GetInteger( p_vout, "mouse-hide-timeout" ) );
+
+ return VLC_SUCCESS;
+}
+/* */
+static int FullscreenControllerWidgetMouseMoved( vlc_object_t *vlc_object, const char *variable,
+ vlc_value_t old_val, vlc_value_t new_val,
+ void *data )
+{
+ FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *)data;
+
+ /* Show event */
+ IMEvent *eShow = new IMEvent( FullscreenControlShow_Type, 0 );
+ QApplication::postEvent( p_fs, static_cast<QEvent *>(eShow) );
+
+ /* Plan hide event */
+ IMEvent *eHide = new IMEvent( FullscreenControlPlanHide_Type, 0 );
+ QApplication::postEvent( p_fs, static_cast<QEvent *>(eHide) );
+
+ return VLC_SUCCESS;
+}
+
+
+/**
+ * It is called when video start
+ */
+void FullscreenControllerWidget::attachVout( vout_thread_t *p_vout )
+{
+ assert( p_vout );
+
+ vlc_mutex_lock( &lock );
+ var_AddCallback( p_vout, "fullscreen", FullscreenControllerWidgetFullscreenChanged, this ); /* I miss a add and fire */
+ fullscreenChanged( p_vout, var_GetBool( p_vout, "fullscreen" ), var_GetInteger( p_vout, "mouse-hide-timeout" ) );
+ vlc_mutex_unlock( &lock );
+}
+/**
+ * It is called after turn off video.
+ */
+void FullscreenControllerWidget::detachVout( vout_thread_t *p_vout )
+{
+ assert( p_vout );
+
+ var_DelCallback( p_vout, "fullscreen", FullscreenControllerWidgetFullscreenChanged, this );
+ vlc_mutex_lock( &lock );
+ fullscreenChanged( p_vout, false, 0 );
+ vlc_mutex_unlock( &lock );
+}
+
+/**
+ * Register and unregister callback for mouse moving
+ */
+void FullscreenControllerWidget::fullscreenChanged( vout_thread_t *p_vout, bool b_fs, int i_timeout )
+{
+ vlc_mutex_lock( &lock );
+ if( b_fs && !b_fullscreen )
+ {
+ b_fullscreen = true;
+ i_hide_timeout = i_timeout;
+ var_AddCallback( p_vout, "mouse-moved", FullscreenControllerWidgetMouseMoved, this );
+ }
+ else if( !b_fs && b_fullscreen )
+ {
+ b_fullscreen = false;
+ i_hide_timeout = i_timeout;
+ var_DelCallback( p_vout, "mouse-moved", FullscreenControllerWidgetMouseMoved, this );
+
+ /* Force fs hidding */
+ IMEvent *eHide = new IMEvent( FullscreenControlHide_Type, 0 );
+ QApplication::postEvent( this, static_cast<QEvent *>(eHide) );
+ }
+ vlc_mutex_unlock( &lock );
+}
+
+/**********************************************************************
+ * Speed control widget
+ **********************************************************************/
+SpeedControlWidget::SpeedControlWidget( intf_thread_t *_p_i ) :
+ QFrame( NULL ), p_intf( _p_i )
+{
+ QSizePolicy sizePolicy( QSizePolicy::Maximum, QSizePolicy::Fixed );
+ sizePolicy.setHorizontalStretch( 0 );
+ sizePolicy.setVerticalStretch( 0 );
+
+ speedSlider = new QSlider;
+ speedSlider->setSizePolicy( sizePolicy );
+ speedSlider->setMaximumSize( QSize( 80, 200 ) );
+ speedSlider->setOrientation( Qt::Vertical );
+ speedSlider->setTickPosition( QSlider::TicksRight );
+
+ speedSlider->setRange( -24, 24 );
+ speedSlider->setSingleStep( 1 );
+ speedSlider->setPageStep( 1 );
+ speedSlider->setTickInterval( 12 );
+
+ CONNECT( speedSlider, valueChanged( int ), this, updateRate( int ) );
+
+ QToolButton *normalSpeedButton = new QToolButton( this );
+ normalSpeedButton->setMaximumSize( QSize( 26, 20 ) );
+ normalSpeedButton->setAutoRaise( true );
+ normalSpeedButton->setText( "1x" );
+ normalSpeedButton->setToolTip( qtr( "Revert to normal play speed" ) );
+
+ CONNECT( normalSpeedButton, clicked(), this, resetRate() );
+
+ QVBoxLayout *speedControlLayout = new QVBoxLayout;
+ speedControlLayout->setLayoutMargins( 4, 4, 4, 4, 4 );
+ speedControlLayout->setSpacing( 4 );
+ speedControlLayout->addWidget( speedSlider );
+ speedControlLayout->addWidget( normalSpeedButton );
+ setLayout( speedControlLayout );
+}
+
+SpeedControlWidget::~SpeedControlWidget()
+{}
+
+void SpeedControlWidget::setEnable( bool b_enable )
+{
+ speedSlider->setEnabled( b_enable );
+}
+
+void SpeedControlWidget::updateControls( int rate )
+{
+ if( speedSlider->isSliderDown() )
+ {
+ //We don't want to change anything if the user is using the slider
+ return;
+ }
+
+ double value = 12 * log( (double)INPUT_RATE_DEFAULT / rate ) / log( 2 );
+ int sliderValue = (int) ( ( value > 0 ) ? value + .5 : value - .5 );
+
+ if( sliderValue < speedSlider->minimum() )
+ {
+ sliderValue = speedSlider->minimum();
+ }
+ else if( sliderValue > speedSlider->maximum() )
+ {
+ sliderValue = speedSlider->maximum();
+ }
+
+ //Block signals to avoid feedback loop
+ speedSlider->blockSignals( true );
+ speedSlider->setValue( sliderValue );
+ speedSlider->blockSignals( false );
+}
+
+void SpeedControlWidget::updateRate( int sliderValue )
+{
+ double speed = pow( 2, (double)sliderValue / 12 );
+ int rate = INPUT_RATE_DEFAULT / speed;
+
+ THEMIM->getIM()->setRate(rate);
+}
+
+void SpeedControlWidget::resetRate()
+{
+ THEMIM->getIM()->setRate(INPUT_RATE_DEFAULT);
+}