X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fmain_interface.cpp;h=3589d9129a7e1f3febdee973b244d0fb14a3eee1;hb=8dd297088ecc14cfda5297da53125b6421a32b12;hp=42395b343d474f0c9cefd9e47b9879f45b84fdab;hpb=fbea59ebe7229dda308db83e10e5d56559b15585;p=vlc diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index 42395b343d..3589d9129a 100644 --- a/modules/gui/qt4/main_interface.cpp +++ b/modules/gui/qt4/main_interface.cpp @@ -1,7 +1,7 @@ /***************************************************************************** * main_interface.cpp : Main interface **************************************************************************** - * Copyright (C) 2006-2010 VideoLAN and AUTHORS + * Copyright (C) 2006-2011 VideoLAN and AUTHORS * $Id$ * * Authors: Clément Stenac @@ -68,6 +68,11 @@ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ); static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ); +static int IntfBossCB( vlc_object_t *p_this, const char *psz_variable, + vlc_value_t old_val, vlc_value_t new_val, void *param ); +static int IntfRaiseMainCB( vlc_object_t *p_this, const char *psz_variable, + vlc_value_t old_val, vlc_value_t new_val, + void *param ); MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) { @@ -87,6 +92,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) b_hideAfterCreation = false; // --qt-start-minimized playlistVisible = false; input_name = ""; + b_interfaceFullScreen= false; /* Ask for Privacy */ @@ -102,6 +108,9 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) setWindowRole( "vlc-main" ); setWindowIcon( QApplication::windowIcon() ); setWindowOpacity( var_InheritFloat( p_intf, "qt-opacity" ) ); +#ifdef Q_WS_MAC + setAttribute( Qt::WA_MacBrushedMetal ); +#endif /* Is video in embedded in the UI or not */ b_videoEmbedded = var_InheritBool( p_intf, "embedded-video" ); @@ -110,30 +119,32 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) b_autoresize = var_InheritBool( p_intf, "qt-video-autoresize" ); /* Are we in the enhanced always-video mode or not ? */ - i_visualmode = var_InheritInteger( p_intf, "qt-minimal-view" ); + b_minimalView = var_InheritBool( p_intf, "qt-minimal-view" ); /* Do we want anoying popups or not */ b_notificationEnabled = var_InheritBool( p_intf, "qt-notification" ); + /* */ + b_pauseOnMinimize = var_InheritBool( p_intf, "qt-pause-minimized" ); + /* Set the other interface settings */ settings = getSettings(); settings->beginGroup( "MainWindow" ); +#ifdef WIN32 + /* Volume keys */ + p_intf->p_sys->disable_volume_keys = var_InheritBool( p_intf, "qt-disable-volume-keys" ); +#endif + /* */ b_plDocked = getSettings()->value( "pl-dock-status", true ).toBool(); settings->endGroup( ); - /************** - * Status Bar * - **************/ - createStatusBar(); - /************************** * UI and Widgets design **************************/ setVLCWindowsTitle(); - createMainWidget( settings ); /************ * Menu Bar * @@ -142,10 +153,13 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) CONNECT( THEMIM->getIM(), voutListChanged( vout_thread_t **, int ), this, destroyPopupMenu() ); - /********************************* - * Create the Systray Management * - *********************************/ - initSystray(); + createMainWidget( settings ); + + /************** + * Status Bar * + **************/ + createStatusBar(); + setStatusBarVisibility( getSettings()->value( "MainWindow/status-bar-visible", false ).toBool() ); /******************** * Input Manager * @@ -158,9 +172,15 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) taskbar_wmsg = RegisterWindowMessage("TaskbarButtonCreated"); #endif - /************************************************************ - * Connect the input manager to the GUI elements it manages * - ************************************************************/ + /********************************* + * Create the Systray Management * + *********************************/ + initSystray(); + + /************************************************************* + * Connect the input manager to the GUI elements it manages * + * Beware initSystray did some connects on input manager too * + *************************************************************/ /** * Connects on nameChanged() * Those connects are different because options can impeach them to trigger. @@ -168,67 +188,53 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /* Main Interface statusbar */ CONNECT( THEMIM->getIM(), nameChanged( const QString& ), this, setName( const QString& ) ); - /* and systray */ -#ifndef HAVE_MAEMO - if( sysTray ) - { - CONNECT( THEMIM->getIM(), nameChanged( const QString& ), - this, updateSystrayTooltipName( const QString& ) ); - } -#endif /* and title of the Main Interface*/ if( var_InheritBool( p_intf, "qt-name-in-title" ) ) { CONNECT( THEMIM->getIM(), nameChanged( const QString& ), this, setVLCWindowsTitle( const QString& ) ); } - - /** - * CONNECTS on PLAY_STATUS - **/ - /* Status on the systray */ -#ifndef HAVE_MAEMO - if( sysTray ) - { - CONNECT( THEMIM->getIM(), statusChanged( int ), - this, updateSystrayTooltipStatus( int ) ); - } -#endif - /* END CONNECTS ON IM */ /* VideoWidget connects for asynchronous calls */ + b_videoFullScreen = false; connect( this, SIGNAL(askGetVideo(WId*,int*,int*,unsigned*,unsigned *)), this, SLOT(getVideoSlot(WId*,int*,int*,unsigned*,unsigned*)), Qt::BlockingQueuedConnection ); connect( this, SIGNAL(askReleaseVideo( void )), this, SLOT(releaseVideoSlot( void )), Qt::BlockingQueuedConnection ); + CONNECT( this, askVideoOnTop(bool), this, setVideoOnTop(bool)); if( videoWidget ) { if( b_autoresize ) { CONNECT( this, askVideoToResize( unsigned int, unsigned int ), - videoWidget, SetSizing( unsigned int, unsigned int ) ); + this, setVideoSize( unsigned int, unsigned int ) ); CONNECT( videoWidget, sizeChanged( int, int ), this, resizeStack( int, int ) ); } CONNECT( this, askVideoSetFullScreen( bool ), - videoWidget, SetFullScreen( bool ) ); - CONNECT( videoWidget, keyPressed( QKeyEvent * ), - this, handleKeyPress( QKeyEvent * ) ); + this, setVideoFullScreen( bool ) ); } CONNECT( THEDP, toolBarConfUpdated(), this, recreateToolbars() ); + CONNECT( this, askToQuit(), THEDP, quit() ); + + CONNECT( this, askBoss(), this, setBoss() ); + CONNECT( this, askRaise(), this, setRaise() ); + /** END of CONNECTS**/ /************ * Callbacks ************/ - var_AddCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); + var_AddCallback( p_intf->p_libvlc, "intf-toggle-fscontrol", IntfShowCB, p_intf ); + var_AddCallback( p_intf->p_libvlc, "intf-boss", IntfBossCB, p_intf ); + var_AddCallback( p_intf->p_libvlc, "intf-show", IntfRaiseMainCB, p_intf ); /* Register callback for the intf-popupmenu variable */ var_AddCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); @@ -240,18 +246,21 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /**** FINAL SIZING and placement of interface */ settings->beginGroup( "MainWindow" ); - QVLCTools::restoreWidgetPosition( settings, this, QSize(400, 100) ); + QVLCTools::restoreWidgetPosition( settings, this, QSize(600, 420) ); settings->endGroup(); + b_interfaceFullScreen = isFullScreen(); + /* Final sizing and showing */ setVisible( !b_hideAfterCreation ); - setMinimumWidth( __MAX( controls->sizeHint().width(), - menuBar()->sizeHint().width() ) + 30 ); + computeMinimumSize(); /* Switch to minimal view if needed, must be called after the show() */ - if( i_visualmode ) + if( b_minimalView ) toggleMinimalView( true ); + + b_hasPausedWhenMinimized = false; } MainInterface::~MainInterface() @@ -260,6 +269,9 @@ MainInterface::~MainInterface() if( stackCentralOldWidget == videoWidget ) showTab( bgWidget ); + if( videoWidget ) + releaseVideoSlot(); + #ifdef WIN32 if( himl ) ImageList_Destroy( himl ); @@ -283,15 +295,11 @@ MainInterface::~MainInterface() settings->setValue( "pl-dock-status", b_plDocked ); /* Save playlist state */ if( playlistWidget ) - { - settings->setValue( "playlist-visible", - isPlDocked() ? - playlistVisible : - playlistWidget->isVisible() /* FIXME */ ); - } + settings->setValue( "playlist-visible", playlistVisible ); settings->setValue( "adv-controls", getControlsVisibilityStatus() & CONTROLS_ADVANCED ); + settings->setValue( "status-bar-visible", b_statusbarVisible ); /* Save the stackCentralW sizes */ settings->setValue( "bgSize", stackWidgetsSizes[bgWidget] ); @@ -311,12 +319,23 @@ MainInterface::~MainInterface() delete statusBar(); /* Unregister callbacks */ - var_DelCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); + var_DelCallback( p_intf->p_libvlc, "intf-boss", IntfBossCB, p_intf ); + var_DelCallback( p_intf->p_libvlc, "intf-show", IntfRaiseMainCB, p_intf ); + var_DelCallback( p_intf->p_libvlc, "intf-toggle-fscontrol", IntfShowCB, p_intf ); var_DelCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); p_intf->p_sys->p_mi = NULL; } +void MainInterface::computeMinimumSize() +{ + int minWidth = 30; + if( menuBar()->isVisible() ) + minWidth += __MAX( controls->sizeHint().width(), menuBar()->sizeHint().width() ); + + setMinimumWidth( minWidth ); +} + /***************************** * Main UI handling * *****************************/ @@ -344,6 +363,20 @@ void MainInterface::recreateToolbars() settings->endGroup(); } +void MainInterface::reloadPrefs() +{ + b_notificationEnabled = var_InheritBool( p_intf, "qt-notification" ); + b_pauseOnMinimize = var_InheritBool( p_intf, "qt-pause-minimized" ); +#ifdef WIN32 + p_intf->p_sys->disable_volume_keys = var_InheritBool( p_intf, "qt-disable-volume-keys" ); +#endif + if( !var_InheritBool( p_intf, "qt-fs-controller" ) && fullscreenControls ) + { + delete fullscreenControls; + fullscreenControls = NULL; + } +} + void MainInterface::createMainWidget( QSettings *settings ) { /* Create the main Widget and the mainLayout */ @@ -359,6 +392,11 @@ void MainInterface::createMainWidget( QSettings *settings ) /* Bg Cone */ bgWidget = new BackgroundWidget( p_intf ); stackCentralW->addWidget( bgWidget ); + if ( !var_InheritBool( p_intf, "qt-bgcone" ) ) + bgWidget->setWithArt( false ); + else + if ( var_InheritBool( p_intf, "qt-bgcone-expands" ) ) + bgWidget->setExpandstoHeight( true ); /* And video Outputs */ if( b_videoEmbedded ) @@ -369,7 +407,7 @@ void MainInterface::createMainWidget( QSettings *settings ) mainLayout->insertWidget( 1, stackCentralW ); settings->beginGroup( "MainWindow" ); - stackWidgetsSizes[bgWidget] = settings->value( "bgSize", QSize( 400, 0 ) ).toSize(); + stackWidgetsSizes[bgWidget] = settings->value( "bgSize", QSize( 600, 0 ) ).toSize(); /* Resize even if no-auto-resize, because we are at creation */ resizeStack( stackWidgetsSizes[bgWidget].width(), stackWidgetsSizes[bgWidget].height() ); @@ -450,6 +488,8 @@ inline void MainInterface::createStatusBar() "QLabel:hover { background-color: rgba(255, 255, 255, 50%) }" ); speedLabel->setStyleSheet( "QLabel:hover { background-color: rgba(255, 255, 255, 50%) }" ); + /* pad both label and its tooltip */ + nameLabel->setStyleSheet( "padding-left: 5px; padding-right: 5px;" ); /* and adding those */ statusBarr->addWidget( nameLabel, 8 ); @@ -467,6 +507,14 @@ inline void MainInterface::createStatusBar() CONNECT( THEMIM->getIM(), seekRequested( float ), timeLabel, setDisplayPosition( float ) ); + + /* This shouldn't be necessary, but for somehow reason, the statusBarr + starts at height of 20px and when a text is shown it needs more space. + But, as the QMainWindow policy doesn't allow statusBar to change QMW's + geometry, we need to force a height. If you have a better idea, please + tell me -- jb + */ + statusBarr->setFixedHeight( statusBarr->sizeHint().height() + 2 ); } /********************************************************************** @@ -514,7 +562,7 @@ void MainInterface::destroyPopupMenu() QVLCMenu::PopupMenu( p_intf, false ); } -void MainInterface::popupMenu( const QPoint &p ) +void MainInterface::popupMenu( const QPoint & ) { QVLCMenu::PopupMenu( p_intf, true ); } @@ -523,7 +571,7 @@ void MainInterface::toggleFSC() { if( !fullscreenControls ) return; - IMEvent *eShow = new IMEvent( FullscreenControlToggle_Type, 0 ); + IMEvent *eShow = new IMEvent( FullscreenControlToggle_Type ); QApplication::postEvent( fullscreenControls, eShow ); } @@ -531,21 +579,6 @@ void MainInterface::toggleFSC() * Video Handling ****************************************************************************/ -/* This event is used to deal with the fullscreen and always on top - issue conflict (bug in wx) */ -class SetVideoOnTopQtEvent : public QEvent -{ -public: - SetVideoOnTopQtEvent( bool _onTop ) : - QEvent( (QEvent::Type)SetVideoOnTopEvent_Type ), onTop( _onTop) - {} - - bool OnTop() const { return onTop; } - -private: - bool onTop; -}; - /** * NOTE: * You must not change the state of this object or other Qt4 UI objects, @@ -569,6 +602,10 @@ WId MainInterface::getVideo( int *pi_x, int *pi_y, void MainInterface::getVideoSlot( WId *p_id, int *pi_x, int *pi_y, unsigned *pi_width, unsigned *pi_height ) { + /* Hidden or minimized, activate */ + if( isHidden() || isMinimized() ) + toggleUpdateSystrayMenu(); + /* Request the videoWidget */ WId ret = videoWidget->request( pi_x, pi_y, pi_width, pi_height, !b_autoresize ); @@ -593,7 +630,13 @@ void MainInterface::releaseVideo( void ) /* Function that is CONNECTED to the previous emit */ void MainInterface::releaseVideoSlot( void ) { + /* This function is called when the embedded video window is destroyed, + * or in the rare case that the embedded window is still here but the + * Qt4 interface exits. */ + assert( videoWidget ); videoWidget->release(); + setVideoOnTop( false ); + setVideoFullScreen( false ); if( stackCentralW->currentWidget() == videoWidget ) restoreStackOldWidget(); @@ -602,6 +645,64 @@ void MainInterface::releaseVideoSlot( void ) stackCentralOldWidget = bgWidget; } +void MainInterface::setVideoSize( unsigned int w, unsigned int h ) +{ + if( !isFullScreen() && !isMaximized() ) + videoWidget->SetSizing( w, h ); +} + +void MainInterface::setVideoFullScreen( bool fs ) +{ + b_videoFullScreen = fs; + if( fs ) + { + int numscreen = var_InheritInteger( p_intf, "qt-fullscreen-screennumber" ); + /* if user hasn't defined screennumber, or screennumber that is bigger + * than current number of screens, take screennumber where current interface + * is + */ + if( numscreen == -1 || numscreen > QApplication::desktop()->numScreens() ) + numscreen = QApplication::desktop()->screenNumber( p_intf->p_sys->p_mi ); + + QRect screenres = QApplication::desktop()->screenGeometry( numscreen ); + + /* To be sure window is on proper-screen in xinerama */ + if( !screenres.contains( pos() ) ) + { + msg_Dbg( p_intf, "Moving video to correct screen"); + move( QPoint( screenres.x(), screenres.y() ) ); + } + setMinimalView( true ); + setInterfaceFullScreen( true ); + } + else + { + /* TODO do we want to restore screen and position ? (when + * qt-fullscreen-screennumber is forced) */ + setMinimalView( b_minimalView ); + setInterfaceFullScreen( b_interfaceFullScreen ); + } + videoWidget->sync(); +} + +/* Slot to change the video always-on-top flag. + * Emit askVideoOnTop() to invoke this from other thread. */ +void MainInterface::setVideoOnTop( bool on_top ) +{ + Qt::WindowFlags oldflags = windowFlags(), newflags; + + if( on_top ) + newflags = oldflags | Qt::WindowStaysOnTopHint; + else + newflags = oldflags & ~Qt::WindowStaysOnTopHint; + if( newflags != oldflags && !b_videoFullScreen ) + + { + setWindowFlags( newflags ); + show(); /* necessary to apply window flags */ + } +} + /* Asynchronous call from WindowControl function */ int MainInterface::controlVideo( int i_query, va_list args ) { @@ -611,8 +712,7 @@ int MainInterface::controlVideo( int i_query, va_list args ) { unsigned int i_width = va_arg( args, unsigned int ); unsigned int i_height = va_arg( args, unsigned int ); - if( isFullScreen() || isMaximized() ) - showNormal(); + emit askVideoToResize( i_width, i_height ); return VLC_SUCCESS; } @@ -620,12 +720,14 @@ int MainInterface::controlVideo( int i_query, va_list args ) { unsigned i_arg = va_arg( args, unsigned ); unsigned on_top = i_arg & VOUT_WINDOW_STATE_ABOVE; - QApplication::postEvent( this, new SetVideoOnTopQtEvent( on_top ) ); + + emit askVideoOnTop( on_top != 0 ); return VLC_SUCCESS; } case VOUT_WINDOW_SET_FULLSCREEN: { bool b_fs = va_arg( args, int ); + emit askVideoSetFullScreen( b_fs ); return VLC_SUCCESS; } @@ -648,10 +750,13 @@ void MainInterface::createPlaylist() if( b_plDocked ) { stackCentralW->addWidget( playlistWidget ); - stackWidgetsSizes[playlistWidget] = settings->value( "playlistSize", QSize( 500, 250 ) ).toSize(); + stackWidgetsSizes[playlistWidget] = settings->value( "playlistSize", QSize( 600, 300 ) ).toSize(); } else { +#ifdef WIN32 + playlistWidget->setParent( NULL ); +#endif playlistWidget->setWindowFlags( Qt::Window ); /* This will restore the geometry but will not work for position, @@ -683,6 +788,9 @@ void MainInterface::togglePlaylist() } else { +#ifdef WIN32 + playlistWidget->setParent( NULL ); +#endif playlistWidget->setWindowFlags( Qt::Window ); playlistVisible = !playlistVisible; playlistWidget->setVisible( playlistVisible ); @@ -699,6 +807,9 @@ void MainInterface::dockPlaylist( bool p_docked ) if( !p_docked ) { stackCentralW->removeWidget( playlistWidget ); +#ifdef WIN32 + playlistWidget->setParent( NULL ); +#endif playlistWidget->setWindowFlags( Qt::Window ); QVLCTools::restoreWidgetPosition( p_intf, "Playlist", playlistWidget, QSize( 600, 300 ) ); @@ -717,11 +828,25 @@ void MainInterface::dockPlaylist( bool p_docked ) } /* - If b_switch is false, then we are normalView + * setMinimalView is the private function used by + * the SLOT toggleMinimalView and setVideoFullScreen */ -void MainInterface::toggleMinimalView( bool b_switch ) +void MainInterface::setMinimalView( bool b_minimal ) { - if( i_visualmode == 0 && b_autoresize ) /* Normal mode */ + menuBar()->setVisible( !b_minimal ); + controls->setVisible( !b_minimal ); + statusBar()->setVisible( !b_minimal && b_statusbarVisible ); + inputC->setVisible( !b_minimal ); +} + +/* + * This public SLOT is used for moving to minimal View Mode + * + * If b_minimal is false, then we are normalView + */ +void MainInterface::toggleMinimalView( bool b_minimal ) +{ + if( !b_minimalView && b_autoresize ) /* Normal mode */ { if( stackCentralW->currentWidget() == bgWidget ) { @@ -731,13 +856,14 @@ void MainInterface::toggleMinimalView( bool b_switch ) } } } + b_minimalView = b_minimal; + if( !b_videoFullScreen ) + { + setMinimalView( b_minimalView ); + computeMinimumSize(); + } - menuBar()->setVisible( !b_switch ); - controls->setVisible( !b_switch ); - statusBar()->setVisible( !b_switch ); - inputC->setVisible( !b_switch ); - - emit minimalViewToggled( b_switch ); + emit minimalViewToggled( b_minimalView ); } /* toggling advanced controls buttons */ @@ -755,6 +881,13 @@ int MainInterface::getControlsVisibilityStatus() + CONTROLS_ADVANCED * controls->b_advancedVisible ); } +void MainInterface::setStatusBarVisibility( bool b_visible ) +{ + statusBar()->setVisible( b_visible ); + b_statusbarVisible = b_visible; + if( controls ) controls->setGripVisible( !b_statusbarVisible ); +} + #if 0 void MainInterface::visual() { @@ -784,8 +917,8 @@ void MainInterface::setName( const QString& name ) input_name = name; /* store it for the QSystray use */ /* Display it in the status bar, but also as a Tooltip in case it doesn't fit in the label */ - nameLabel->setText( " " + name + " " ); - nameLabel->setToolTip( " " + name +" " ); + nameLabel->setText( name ); + nameLabel->setToolTip( name ); } /** @@ -835,8 +968,8 @@ void MainInterface::showBuffering( float f_cache ) void MainInterface::createSystray() { QIcon iconVLC; - if( QDate::currentDate().dayOfYear() >= 354 ) - iconVLC = QIcon( ":/logo/vlc128-christmas.png" ); + if( QDate::currentDate().dayOfYear() >= QT_XMAS_JOKE_DAY && var_InheritBool( p_intf, "qt-icon-change" ) ) + iconVLC = QIcon( ":/logo/vlc128-xmas.png" ); else iconVLC = QIcon( ":/logo/vlc128.png" ); sysTray = new QSystemTrayIcon( iconVLC, this ); @@ -849,7 +982,14 @@ void MainInterface::createSystray() sysTray->show(); CONNECT( sysTray, activated( QSystemTrayIcon::ActivationReason ), - this, handleSystrayClick( QSystemTrayIcon::ActivationReason ) ); + this, handleSystrayClick( QSystemTrayIcon::ActivationReason ) ); + + /* Connects on nameChanged() */ + CONNECT( THEMIM->getIM(), nameChanged( const QString& ), + this, updateSystrayTooltipName( const QString& ) ); + /* Connect PLAY_STATUS on the systray */ + CONNECT( THEMIM->getIM(), playingStatusChanged( int ), + this, updateSystrayTooltipStatus( int ) ); } /** @@ -897,9 +1037,30 @@ void MainInterface::toggleUpdateSystrayMenu() hide(); #endif } + if( sysTray ) + QVLCMenu::updateSystrayMenu( this, p_intf ); +} + +/* First Item of the systray menu */ +void MainInterface::showUpdateSystrayMenu() +{ + if( isHidden() ) + show(); + if( isMinimized() ) + showNormal(); + activateWindow(); + QVLCMenu::updateSystrayMenu( this, p_intf ); } +/* First Item of the systray menu */ +void MainInterface::hideUpdateSystrayMenu() +{ + hide(); + QVLCMenu::updateSystrayMenu( this, p_intf ); +} + +/* Click on systray Icon */ void MainInterface::handleSystrayClick( QSystemTrayIcon::ActivationReason reason ) { @@ -907,7 +1068,11 @@ void MainInterface::handleSystrayClick( { case QSystemTrayIcon::Trigger: case QSystemTrayIcon::DoubleClick: +#ifdef Q_WS_MAC + QVLCMenu::updateSystrayMenu( this, p_intf ); +#else toggleUpdateSystrayMenu(); +#endif break; case QSystemTrayIcon::MiddleClick: sysTray->showMessage( qtr( "VLC media player" ), @@ -964,6 +1129,38 @@ void MainInterface::updateSystrayTooltipStatus( int i_status ) } #endif +void MainInterface::changeEvent(QEvent *event) +{ + if( event->type() == QEvent::WindowStateChange ) + { + QWindowStateChangeEvent *windowStateChangeEvent = static_cast(event); + Qt::WindowStates newState = windowState(); + Qt::WindowStates oldState = windowStateChangeEvent->oldState(); + + if( newState & Qt::WindowMinimized ) + { + b_hasPausedWhenMinimized = false; + + if( THEMIM->getIM()->playingStatus() == PLAYING_S && + THEMIM->getIM()->hasVideo() && !THEMIM->getIM()->hasVisualisation() && + b_pauseOnMinimize ) + { + b_hasPausedWhenMinimized = true; + THEMIM->pause(); + } + } + else if( oldState & Qt::WindowMinimized && !( newState & Qt::WindowMinimized ) ) + { + if( b_hasPausedWhenMinimized ) + { + THEMIM->play(); + } + } + } + + QWidget::changeEvent(event); +} + /************************************************************************ * D&D Events ************************************************************************/ @@ -974,14 +1171,15 @@ void MainInterface::dropEvent(QDropEvent *event) void MainInterface::dropEventPlay( QDropEvent *event, bool b_play ) { - event->setDropAction( Qt::CopyAction ); - if( !event->possibleActions() & Qt::CopyAction ) + if( event->possibleActions() & Qt::CopyAction ) + event->setDropAction( Qt::CopyAction ); + else return; const QMimeData *mimeData = event->mimeData(); /* D&D of a subtitles file, add it on the fly */ - if( mimeData->urls().size() == 1 && THEMIM->getIM()->hasInput() ) + if( mimeData->urls().count() == 1 && THEMIM->getIM()->hasInput() ) { if( !input_AddSubtitle( THEMIM->getInput(), qtu( toNativeSeparators( mimeData->urls()[0].toLocalFile() ) ), @@ -995,18 +1193,28 @@ void MainInterface::dropEventPlay( QDropEvent *event, bool b_play ) bool first = b_play; foreach( const QUrl &url, mimeData->urls() ) { - QString s = toNativeSeparators( url.toLocalFile() ); - - if( s.length() > 0 ) { - char* psz_uri = make_URI( qtu(s) ); - playlist_Add( THEPL, psz_uri, NULL, + if( url.isValid() ) + { + QString mrl = toURI( url.toEncoded().constData() ); + playlist_Add( THEPL, qtu(mrl), NULL, PLAYLIST_APPEND | (first ? PLAYLIST_GO: PLAYLIST_PREPARSE), PLAYLIST_END, true, pl_Unlocked ); - free( psz_uri ); first = false; - RecentsMRL::getInstance( p_intf )->addRecent( s ); + RecentsMRL::getInstance( p_intf )->addRecent( url.toString() ); } } + + /* Browsers give content as text if you dnd the addressbar, + so check if mimedata has valid url in text and use it + if we didn't get any normal Urls()*/ + if( !mimeData->hasUrls() && mimeData->hasText() && + QUrl(mimeData->text()).isValid() ) + { + QString mrl = toURI( mimeData->text() ); + playlist_Add( THEPL, qtu(mrl), NULL, + PLAYLIST_APPEND | (first ? PLAYLIST_GO: PLAYLIST_PREPARSE), + PLAYLIST_END, true, pl_Unlocked ); + } event->accept(); } void MainInterface::dragEnterEvent(QDragEnterEvent *event) @@ -1025,19 +1233,6 @@ void MainInterface::dragLeaveEvent(QDragLeaveEvent *event) /************************************************************************ * Events stuff ************************************************************************/ -void MainInterface::customEvent( QEvent *event ) -{ - if ( event->type() == (int)SetVideoOnTopEvent_Type ) - { - SetVideoOnTopQtEvent* p_event = (SetVideoOnTopQtEvent*)event; - if( p_event->OnTop() ) - setWindowFlags( windowFlags() | Qt::WindowStaysOnTopHint ); - else - setWindowFlags( windowFlags() & ~Qt::WindowStaysOnTopHint ); - show(); /* necessary to apply window flags */ - } -} - void MainInterface::keyPressEvent( QKeyEvent *e ) { handleKeyPress( e ); @@ -1045,10 +1240,9 @@ void MainInterface::keyPressEvent( QKeyEvent *e ) void MainInterface::handleKeyPress( QKeyEvent *e ) { - if( ( e->modifiers() & Qt::ControlModifier ) && ( e->key() == Qt::Key_H ) - && !menuBar()->isVisible() ) + if( ( e->modifiers() & Qt::ControlModifier ) && ( e->key() == Qt::Key_H ) ) { - toggleMinimalView( false ); + toggleMinimalView( !b_minimalView ); e->accept(); } @@ -1071,25 +1265,56 @@ void MainInterface::wheelEvent( QWheelEvent *e ) void MainInterface::closeEvent( QCloseEvent *e ) { +// hide(); + emit askToQuit(); /* ask THEDP to quit, so we have a unique method */ + /* Accept session quit. Otherwise we break the desktop mamager. */ e->accept(); - hide(); - THEDP->quit(); } -void MainInterface::toggleFullScreen() +void MainInterface::setInterfaceFullScreen( bool fs ) +{ + if( fs ) + setWindowState( windowState() | Qt::WindowFullScreen ); + else + setWindowState( windowState() & ~Qt::WindowFullScreen ); +} +void MainInterface::toggleInterfaceFullScreen() { - if( isFullScreen() ) + b_interfaceFullScreen = !b_interfaceFullScreen; + if( !b_videoFullScreen ) + setInterfaceFullScreen( b_interfaceFullScreen ); + emit fullscreenInterfaceToggled( b_interfaceFullScreen ); +} + +void MainInterface::emitBoss() +{ + emit askBoss(); +} +void MainInterface::setBoss() +{ + THEMIM->pause(); +#ifndef HAVE_MAEMO + if( sysTray ) { - showNormal(); - emit fullscreenInterfaceToggled( false ); + hide(); } else +#endif { - showFullScreen(); - emit fullscreenInterfaceToggled( true ); + showMinimized(); } } +void MainInterface::emitRaise() +{ + emit askRaise(); +} +void MainInterface::setRaise() +{ + activateWindow(); + raise(); +} + /***************************************************************************** * PopupMenuCB: callback triggered by the intf-popupmenu playlist variable. * We don't show the menu directly here because we don't want the @@ -1098,6 +1323,8 @@ void MainInterface::toggleFullScreen() static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ) { + VLC_UNUSED( p_this ); VLC_UNUSED( psz_variable ); VLC_UNUSED( old_val ); + intf_thread_t *p_intf = (intf_thread_t *)param; if( p_intf->pf_show_dialog ) @@ -1110,14 +1337,47 @@ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, } /***************************************************************************** - * IntfShowCB: callback triggered by the intf-show libvlc variable. + * IntfShowCB: callback triggered by the intf-toggle-fscontrol libvlc variable. *****************************************************************************/ static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ) { + VLC_UNUSED( p_this ); VLC_UNUSED( psz_variable ); VLC_UNUSED( old_val ); + VLC_UNUSED( new_val ); + intf_thread_t *p_intf = (intf_thread_t *)param; p_intf->p_sys->p_mi->toggleFSC(); /* Show event */ return VLC_SUCCESS; } + +/***************************************************************************** + * IntfRaiseMainCB: callback triggered by the intf-show-main libvlc variable. + *****************************************************************************/ +static int IntfRaiseMainCB( vlc_object_t *p_this, const char *psz_variable, + vlc_value_t old_val, vlc_value_t new_val, void *param ) +{ + VLC_UNUSED( p_this ); VLC_UNUSED( psz_variable ); VLC_UNUSED( old_val ); + VLC_UNUSED( new_val ); + + intf_thread_t *p_intf = (intf_thread_t *)param; + p_intf->p_sys->p_mi->emitRaise(); + + return VLC_SUCCESS; +} + +/***************************************************************************** + * IntfBossCB: callback triggered by the intf-boss libvlc variable. + *****************************************************************************/ +static int IntfBossCB( vlc_object_t *p_this, const char *psz_variable, + vlc_value_t old_val, vlc_value_t new_val, void *param ) +{ + VLC_UNUSED( p_this ); VLC_UNUSED( psz_variable ); VLC_UNUSED( old_val ); + VLC_UNUSED( new_val ); + + intf_thread_t *p_intf = (intf_thread_t *)param; + p_intf->p_sys->p_mi->emitBoss(); + + return VLC_SUCCESS; +}