1 /*****************************************************************************
2 * main_interface.cpp : Main interface
3 ****************************************************************************
4 * Copyright (C) 2006-2010 VideoLAN and AUTHORS
7 * Authors: Clément Stenac <zorglub@videolan.org>
8 * Jean-Baptiste Kempf <jb@videolan.org>
9 * Ilkka Ollakka <ileoo@videolan.org>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
24 *****************************************************************************/
32 #include "main_interface.hpp"
33 #include "input_manager.hpp" // Creation
34 #include "actions_manager.hpp" // killInstance
35 #include "extensions_manager.hpp" // killInstance
37 #include "util/customwidgets.hpp" // qtEventToVLCKey
38 #include "util/qt_dirs.hpp" // toNativeSeparators
40 #include "components/interface_widgets.hpp" // bgWidget, videoWidget
41 #include "components/controller.hpp" // controllers
42 #include "components/playlist/playlist.hpp" // plWidget
43 #include "dialogs/firstrun.hpp" // First Run
45 #include "menus.hpp" // Menu creation
46 #include "recents.hpp" // RecentItems when DnD
48 #include <QCloseEvent>
59 #include <QStackedWidget>
61 #include <vlc_keys.h> /* Wheel event */
62 #include <vlc_vout_display.h> /* vout_thread_t and VOUT_ events */
66 /* Callback prototypes */
67 static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable,
68 vlc_value_t old_val, vlc_value_t new_val, void *param );
69 static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable,
70 vlc_value_t old_val, vlc_value_t new_val, void *param );
72 MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
74 /* Variables initialisation */
77 playlistWidget = NULL;
78 videoRoleWidget = NULL;
82 fullscreenControls = NULL;
87 b_hideAfterCreation = false; // --qt-start-minimized
88 playlistVisible = false;
93 FirstRun::CheckAndRun( this, p_intf );
96 * Configuration and settings
97 * Pre-building of interface
100 setFocusPolicy( Qt::StrongFocus );
101 setAcceptDrops( true );
102 setWindowRole( "vlc-main" );
103 setWindowIcon( QApplication::windowIcon() );
104 setWindowOpacity( var_InheritFloat( p_intf, "qt-opacity" ) );
106 /* Is video in embedded in the UI or not */
107 b_videoEmbedded = var_InheritBool( p_intf, "embedded-video" );
109 /* Does the interface resize to video size or the opposite */
110 b_keep_size = !var_InheritBool( p_intf, "qt-video-autoresize" );
112 /* Are we in the enhanced always-video mode or not ? */
113 i_visualmode = var_InheritInteger( p_intf, "qt-minimal-view" );
115 /* Do we want anoying popups or not */
116 b_notificationEnabled = var_InheritBool( p_intf, "qt-notification" );
118 /* Set the other interface settings */
119 settings = getSettings();
120 settings->beginGroup( "MainWindow" );
123 b_plDocked = getSettings()->value( "pl-dock-status", true ).toBool();
127 * Retrieve saved sizes for main window
128 * mainBasedSize = based window size for normal mode
129 * (no video, no background)
130 * mainVideoSize = window size with video (all modes)
132 mainBasedSize = settings->value( "mainBasedSize", QSize( 350, 120 ) ).toSize();
133 mainVideoSize = settings->value( "mainVideoSize", QSize( 400, 300 ) ).toSize();
141 /**************************
142 * UI and Widgets design
143 **************************/
144 setVLCWindowsTitle();
145 createMainWidget( settings );
150 QVLCMenu::createMenuBar( this, p_intf );
151 CONNECT( THEMIM->getIM(), voutListChanged( vout_thread_t **, int ),
152 this, destroyPopupMenu() );
154 minWidthHolder = new QWidget;
155 minWidthHolder->setMinimumWidth(
156 __MAX( menuBar()->sizeHint().width() + 30, 400 ) );
157 mainLayout->addWidget( minWidthHolder );
159 /*********************************
160 * Create the Systray Management *
161 *********************************/
164 /********************
166 ********************/
167 MainInputManager::getInstance( p_intf );
172 taskbar_wmsg = RegisterWindowMessage("TaskbarButtonCreated");
175 /************************************************************
176 * Connect the input manager to the GUI elements it manages *
177 ************************************************************/
179 * Connects on nameChanged()
180 * Those connects are different because options can impeach them to trigger.
182 /* Main Interface statusbar */
183 CONNECT( THEMIM->getIM(), nameChanged( const QString& ),
184 this, setName( const QString& ) );
189 CONNECT( THEMIM->getIM(), nameChanged( const QString& ),
190 this, updateSystrayTooltipName( const QString& ) );
193 /* and title of the Main Interface*/
194 if( var_InheritBool( p_intf, "qt-name-in-title" ) )
196 CONNECT( THEMIM->getIM(), nameChanged( const QString& ),
197 this, setVLCWindowsTitle( const QString& ) );
201 * CONNECTS on PLAY_STATUS
203 /* Status on the systray */
207 CONNECT( THEMIM->getIM(), statusChanged( int ),
208 this, updateSystrayTooltipStatus( int ) );
212 /* END CONNECTS ON IM */
214 /* VideoWidget connects for asynchronous calls */
215 connect( this, SIGNAL(askGetVideo(WId*,int*,int*,unsigned*,unsigned *)),
216 this, SLOT(getVideoSlot(WId*,int*,int*,unsigned*,unsigned*)),
217 Qt::BlockingQueuedConnection );
218 connect( this, SIGNAL(askReleaseVideo( void )),
219 this, SLOT(releaseVideoSlot( void )),
220 Qt::BlockingQueuedConnection );
224 CONNECT( this, askVideoToResize( unsigned int, unsigned int ),
225 videoWidget, SetSizing( unsigned int, unsigned int ) );
226 CONNECT( videoWidget, sizeChanged( int, int ),
227 this, resizeStack( int, int ) );
228 CONNECT( this, askVideoSetFullScreen( bool ),
229 videoWidget, SetFullScreen( bool ) );
230 CONNECT( videoWidget, keyPressed( QKeyEvent * ),
231 this, handleKeyPress( QKeyEvent * ) );
234 CONNECT( THEDP, toolBarConfUpdated(), this, recreateToolbars() );
236 /** END of CONNECTS**/
242 var_AddCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf );
244 /* Register callback for the intf-popupmenu variable */
245 var_AddCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf );
247 /**** FINAL SIZING and placement of interface */
248 settings->beginGroup( "MainWindow" );
249 QVLCTools::restoreWidgetPosition( settings, this, QSize(400, 100) );
251 /* resize to previously saved main window size if appicable */
256 resize( mainVideoSize );
258 resize( mainBasedSize );
262 int i_plVis = settings->value( "playlist-visible", 0 ).toInt();
264 settings->endGroup();
266 if( i_plVis ) togglePlaylist();
268 /* Final sizing and showing */
269 setVisible( !b_hideAfterCreation );
271 /* Switch to minimal view if needed, must be called after the show() */
273 toggleMinimalView( true );
278 MainInterface::~MainInterface()
280 /* Unsure we hide the videoWidget before destroying it */
281 //showTab( PLAYLIST_TAB );
283 /* Save playlist state */
287 QVLCTools::saveWidgetPosition( p_intf, "Playlist", playlistWidget );
289 delete playlistWidget;
294 ImageList_Destroy( himl );
296 p_taskbl->vt->Release(p_taskbl);
300 /* Be sure to kill the actionsManager... Only used in the MI and control */
301 ActionsManager::killInstance();
304 ExtensionsManager::killInstance();
306 /* Delete the FSC controller */
307 delete fullscreenControls;
310 settings->beginGroup( "MainWindow" );
311 settings->setValue( "pl-dock-status", b_plDocked );
312 settings->setValue( "playlist-visible", (int)playlistVisible );
313 settings->setValue( "adv-controls",
314 getControlsVisibilityStatus() & CONTROLS_ADVANCED );
316 settings->setValue( "mainBasedSize", mainBasedSize );
317 settings->setValue( "mainVideoSize", mainVideoSize );
319 settings->setValue( "backgroundSize", bgWidget->size() );
322 QVLCTools::saveWidgetPosition(settings, this);
323 settings->endGroup();
327 /* Unregister callbacks */
328 var_DelCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf );
329 var_DelCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf );
331 p_intf->p_sys->p_mi = NULL;
334 /*****************************
336 *****************************/
337 void MainInterface::recreateToolbars()
339 // FIXME: do the same for the FSC
340 settings->beginGroup( "MainWindow" );
344 controls = new ControlsWidget( p_intf, false, this ); /* FIXME */
345 CONNECT( controls, advancedControlsToggled( bool ),
346 this, adaptGeometry() );
347 CONNECT( controls, sizeChanged(),
348 this, adaptGeometry() );
350 inputC = new InputControlsWidget( p_intf, this );
352 mainLayout->insertWidget( 2, inputC );
353 mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3,
355 settings->endGroup();
358 void MainInterface::createMainWidget( QSettings *settings )
360 /* Create the main Widget and the mainLayout */
361 QWidget *main = new QWidget;
362 setCentralWidget( main );
363 mainLayout = new QVBoxLayout( main );
364 main->setContentsMargins( 0, 0, 0, 0 );
365 mainLayout->setSpacing( 0 ); mainLayout->setMargin( 0 );
368 stackCentralW = new QVLCStackedWidget( main );
371 bgWidget = new BackgroundWidget( p_intf );
372 stackCentralW->addWidget( bgWidget );
373 videoRoleWidget = bgWidget;
375 /* And video Outputs */
376 if( b_videoEmbedded )
378 videoWidget = new VideoWidget( p_intf );
379 stackCentralW->addWidget( videoWidget );
381 mainLayout->insertWidget( 1, stackCentralW );
383 /* Create the CONTROLS Widget */
384 controls = new ControlsWidget( p_intf,
385 settings->value( "adv-controls", false ).toBool(), this );
387 CONNECT( controls, advancedControlsToggled( bool ),
388 this, adaptGeometry() );
389 CONNECT( controls, sizeChanged(),
390 this, adaptGeometry() );
391 inputC = new InputControlsWidget( p_intf, this );
393 mainLayout->insertWidget( 2, inputC );
394 mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3,
397 /* Visualisation, disabled for now, they SUCK */
399 visualSelector = new VisualSelector( p_intf );
400 mainLayout->insertWidget( 0, visualSelector );
401 visualSelector->hide();
404 getSettings()->endGroup();
406 /* Enable the popup menu in the MI */
407 main->setContextMenuPolicy( Qt::CustomContextMenu );
408 CONNECT( main, customContextMenuRequested( const QPoint& ),
409 this, popupMenu( const QPoint& ) );
411 if ( depth() > 8 ) /* 8bit depth has too many issues with opacity */
412 /* Create the FULLSCREEN CONTROLS Widget */
413 if( var_InheritBool( p_intf, "qt-fs-controller" ) )
415 fullscreenControls = new FullscreenControllerWidget( p_intf, this );
416 CONNECT( fullscreenControls, keyPressed( QKeyEvent * ),
417 this, handleKeyPress( QKeyEvent * ) );
421 inline void MainInterface::initSystray()
424 bool b_systrayAvailable = QSystemTrayIcon::isSystemTrayAvailable();
425 bool b_systrayWanted = var_InheritBool( p_intf, "qt-system-tray" );
427 if( var_InheritBool( p_intf, "qt-start-minimized") )
429 if( b_systrayAvailable )
431 b_systrayWanted = true;
432 b_hideAfterCreation = true;
435 msg_Err( p_intf, "cannot start minimized without system tray bar" );
438 if( b_systrayAvailable && b_systrayWanted )
443 inline void MainInterface::createStatusBar()
448 /* Widgets Creation*/
449 QStatusBar *statusBarr = statusBar();
451 TimeLabel *timeLabel = new TimeLabel( p_intf );
452 nameLabel = new QLabel( this );
453 nameLabel->setTextInteractionFlags( Qt::TextSelectableByMouse
454 | Qt::TextSelectableByKeyboard );
455 SpeedLabel *speedLabel = new SpeedLabel( p_intf, this );
457 /* Styling those labels */
458 timeLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel );
459 speedLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel );
460 nameLabel->setFrameStyle( QFrame::Sunken | QFrame::StyledPanel);
462 /* and adding those */
463 statusBarr->addWidget( nameLabel, 8 );
464 statusBarr->addPermanentWidget( speedLabel, 0 );
465 statusBarr->addPermanentWidget( timeLabel, 0 );
467 /* timeLabel behaviour:
468 - double clicking opens the goto time dialog
469 - right-clicking and clicking just toggle between remaining and
471 CONNECT( timeLabel, timeLabelDoubleClicked(), THEDP, gotoTimeDialog() );
473 CONNECT( THEMIM->getIM(), encryptionChanged( bool ),
474 this, showCryptedLabel( bool ) );
476 CONNECT( THEMIM->getIM(), seekRequested( float ),
477 timeLabel, setDisplayPosition( float ) );
480 /**********************************************************************
481 * Handling of sizing of the components
482 **********************************************************************/
484 /* This function is called:
485 - Advanced buttons toggled
486 - Toolbar geom changed
488 void MainInterface::adaptGeometry()
490 //resize( sizeHint() );
497 void MainInterface::debug()
500 msg_Dbg( p_intf, "size: %i - %i", size().height(), size().width() );
501 msg_Dbg( p_intf, "sizeHint: %i - %i", sizeHint().height(), sizeHint().width() );
502 msg_Dbg( p_intf, "minimumsize: %i - %i", minimumSize().height(), minimumSize().width() );
504 msg_Dbg( p_intf, "Stack size: %i - %i", stackCentralW->size().height(), stackCentralW->size().width() );
505 msg_Dbg( p_intf, "Stack sizeHint: %i - %i", stackCentralW->sizeHint().height(), stackCentralW->sizeHint().width() );
506 msg_Dbg( p_intf, "Central size: %i - %i", centralWidget()->size().height(), centralWidget()->size().width() );
510 inline void MainInterface::showTab( StackTab tab )
512 if( tab == PLAYLIST_TAB && !b_plDocked ) return;
517 case PLAYLIST_TAB: widget = playlistWidget; break;
518 case VIDEO_TAB: widget = videoRoleWidget; break;
519 case CURRENT_TAB: widget = stackCentralW->currentWidget(); break;
522 stackCentralW->setCurrentWidget( widget );
524 // Go into compact mode if needed (stackCentralW hidden)
525 if( widget == bgWidget && !b_keep_size && controls->isVisible() && !isFullScreen() )
530 /* TODO Alternatively, for compact mode the best thing would be to setSizeConstraint
531 on layout, but sadly, we can only constrain the whole size, while we should
532 constrain height only */
533 /*if( widget == bgWidget && !b_keep_size && controls->isVisible() && !isFullScreen() )
535 stackCentralW->hide();
536 layout()->setSizeConstraint( QLayout::SetFixedSize );
540 layout()->setSizeConstraint( QLayout::SetDefaultConstraint );
541 setMaximumSize( QWIDGETSIZE_MAX, QWIDGETSIZE_MAX );
542 stackCentralW->show();
546 void MainInterface::destroyPopupMenu()
548 QVLCMenu::PopupMenu( p_intf, false );
551 void MainInterface::popupMenu( const QPoint &p )
553 QVLCMenu::PopupMenu( p_intf, true );
556 void MainInterface::toggleFSC()
558 if( !fullscreenControls ) return;
560 IMEvent *eShow = new IMEvent( FullscreenControlToggle_Type, 0 );
561 QApplication::postEvent( fullscreenControls, eShow );
564 /****************************************************************************
566 ****************************************************************************/
568 /* This event is used to deal with the fullscreen and always on top
569 issue conflict (bug in wx) */
570 class SetVideoOnTopQtEvent : public QEvent
573 SetVideoOnTopQtEvent( bool _onTop ) :
574 QEvent( (QEvent::Type)SetVideoOnTopEvent_Type ), onTop( _onTop)
577 bool OnTop() const { return onTop; }
585 * You must not change the state of this object or other Qt4 UI objects,
586 * from the video output thread - only from the Qt4 UI main loop thread.
587 * All window provider queries must be handled through signals or events.
588 * That's why we have all those emit statements...
590 WId MainInterface::getVideo( int *pi_x, int *pi_y,
591 unsigned int *pi_width, unsigned int *pi_height )
596 /* This is a blocking call signal. Results are returned through pointers.
597 * Beware of deadlocks! */
599 emit askGetVideo( &id, pi_x, pi_y, pi_width, pi_height );
603 void MainInterface::getVideoSlot( WId *p_id, int *pi_x, int *pi_y,
604 unsigned *pi_width, unsigned *pi_height )
606 /* Request the videoWidget */
607 WId ret = videoWidget->request( pi_x, pi_y,
608 pi_width, pi_height, b_keep_size );
610 if( ret ) /* The videoWidget is available */
612 /* ask videoWidget to show */
613 videoWidget->SetSizing( *pi_width, *pi_height );
615 videoRoleWidget = videoWidget;
616 /* Consider the video active now */
617 showTab( VIDEO_TAB );
621 /* Asynchronous call from the WindowClose function */
622 void MainInterface::releaseVideo( void )
624 emit askReleaseVideo();
627 /* Function that is CONNECTED to the previous emit */
628 void MainInterface::releaseVideoSlot( void )
630 videoRoleWidget = bgWidget;
632 showTab( b_plDocked && playlistVisible ? PLAYLIST_TAB : VIDEO_TAB );
634 videoWidget->release();
637 /* Asynchronous call from WindowControl function */
638 int MainInterface::controlVideo( int i_query, va_list args )
642 case VOUT_WINDOW_SET_SIZE:
644 unsigned int i_width = va_arg( args, unsigned int );
645 unsigned int i_height = va_arg( args, unsigned int );
646 emit askVideoToResize( i_width, i_height );
649 case VOUT_WINDOW_SET_STATE:
651 unsigned i_arg = va_arg( args, unsigned );
652 unsigned on_top = i_arg & VOUT_WINDOW_STATE_ABOVE;
653 QApplication::postEvent( this, new SetVideoOnTopQtEvent( on_top ) );
656 case VOUT_WINDOW_SET_FULLSCREEN:
658 bool b_fs = va_arg( args, int );
659 emit askVideoSetFullScreen( b_fs );
663 msg_Warn( p_intf, "unsupported control query" );
668 /*****************************************************************************
669 * Playlist, Visualisation and Menus handling
670 *****************************************************************************/
672 * Toggle the playlist widget or dialog
674 void MainInterface::createPlaylist()
676 playlistWidget = new PlaylistWidget( p_intf, this );
680 playlistWidget->setWindowFlags( Qt::Window );
682 /* This will restore the geometry but will not work for position,
683 because of parenting */
684 QVLCTools::restoreWidgetPosition( p_intf, "Playlist",
685 playlistWidget, QSize( 600, 300 ) );
689 stackCentralW->addWidget( playlistWidget );
693 void MainInterface::togglePlaylist()
695 if( !playlistWidget )
700 showTab( stackCentralW->currentWidget() != playlistWidget ?
701 PLAYLIST_TAB : VIDEO_TAB );
702 playlistVisible = ( stackCentralW->currentWidget() == playlistWidget );
706 playlistWidget->setWindowFlags( Qt::Window );
707 playlistVisible = !playlistVisible;
708 playlistWidget->setVisible( playlistVisible );
713 void MainInterface::dockPlaylist( bool p_docked )
715 if( b_plDocked == p_docked ) return;
716 b_plDocked = p_docked;
718 if( !playlistWidget ) return; /* Playlist wasn't created yet */
721 showTab( VIDEO_TAB );
722 stackCentralW->removeWidget( playlistWidget );
723 playlistWidget->setWindowFlags( Qt::Window );
724 QVLCTools::restoreWidgetPosition( p_intf, "Playlist",
725 playlistWidget, QSize( 600, 300 ) );
726 playlistWidget->show();
730 playlistWidget->setWindowFlags( Qt::Widget ); // Probably a Qt bug here
731 // It would be logical that QStackWidget::addWidget reset the flags...
732 stackCentralW->addWidget( playlistWidget );
733 showTab( PLAYLIST_TAB );
735 playlistVisible = true;
739 If b_switch is false, then we are normalView
741 void MainInterface::toggleMinimalView( bool b_switch )
743 menuBar()->setVisible( !b_switch );
744 controls->setVisible( !b_switch );
745 statusBar()->setVisible( !b_switch );
746 inputC->setVisible( !b_switch );
747 minWidthHolder->setVisible( !b_switch );
749 // Go to compact mode and back if needed
752 emit minimalViewToggled( b_switch );
755 /* toggling advanced controls buttons */
756 void MainInterface::toggleAdvancedButtons()
758 controls->toggleAdvanced();
759 // if( fullscreenControls ) fullscreenControls->toggleAdvanced();
762 /* Get the visibility status of the controls (hidden or not, advanced or not) */
763 int MainInterface::getControlsVisibilityStatus()
765 return( (controls->isVisible() ? CONTROLS_VISIBLE : CONTROLS_HIDDEN )
766 + CONTROLS_ADVANCED * controls->b_advancedVisible );
770 void MainInterface::visual()
772 if( !VISIBLE( visualSelector) )
774 visualSelector->show();
775 if( !THEMIM->getIM()->hasVideo() )
777 /* Show the background widget */
779 visualSelectorEnabled = true;
783 /* Stop any currently running visualization */
784 visualSelector->hide();
785 visualSelectorEnabled = false;
790 /************************************************************************
792 ************************************************************************/
793 void MainInterface::setName( const QString& name )
795 input_name = name; /* store it for the QSystray use */
796 /* Display it in the status bar, but also as a Tooltip in case it doesn't
798 nameLabel->setText( " " + name + " " );
799 nameLabel->setToolTip( " " + name +" " );
803 * Give the decorations of the Main Window a correct Name.
804 * If nothing is given, set it to VLC...
806 void MainInterface::setVLCWindowsTitle( const QString& aTitle )
808 if( aTitle.isEmpty() )
810 setWindowTitle( qtr( "VLC media player" ) );
814 setWindowTitle( aTitle + " - " + qtr( "VLC media player" ) );
818 void MainInterface::showCryptedLabel( bool b_show )
820 if( cryptedLabel == NULL )
822 cryptedLabel = new QLabel;
823 // The lock icon is not the right one for DRM protection/scrambled.
824 //cryptedLabel->setPixmap( QPixmap( ":/lock" ) );
825 cryptedLabel->setText( "DRM" );
826 statusBar()->addWidget( cryptedLabel );
829 cryptedLabel->setVisible( b_show );
832 void MainInterface::showBuffering( float f_cache )
834 QString amount = QString("Buffering: %1%").arg( (int)(100*f_cache) );
835 statusBar()->showMessage( amount, 1000 );
838 /*****************************************************************************
839 * Systray Icon and Systray Menu
840 *****************************************************************************/
843 * Create a SystemTray icon and a menu that would go with it.
844 * Connects to a click handler on the icon.
846 void MainInterface::createSystray()
849 if( QDate::currentDate().dayOfYear() >= 354 )
850 iconVLC = QIcon( ":/logo/vlc128-christmas.png" );
852 iconVLC = QIcon( ":/logo/vlc128.png" );
853 sysTray = new QSystemTrayIcon( iconVLC, this );
854 sysTray->setToolTip( qtr( "VLC media player" ));
856 systrayMenu = new QMenu( qtr( "VLC media player" ), this );
857 systrayMenu->setIcon( iconVLC );
859 QVLCMenu::updateSystrayMenu( this, p_intf, true );
862 CONNECT( sysTray, activated( QSystemTrayIcon::ActivationReason ),
863 this, handleSystrayClick( QSystemTrayIcon::ActivationReason ) );
867 * Updates the Systray Icon's menu and toggle the main interface
869 void MainInterface::toggleUpdateSystrayMenu()
871 /* If hidden, show it */
877 else if( isMinimized() )
885 /* Visible (possibly under other windows) */
887 /* check if any visible window is above vlc in the z-order,
888 * but ignore the ones always on top
889 * and the ones which can't be activated */
892 wi.cbSize = sizeof( WINDOWINFO );
893 for( hwnd = GetNextWindow( internalWinId(), GW_HWNDPREV );
894 hwnd && ( !IsWindowVisible( hwnd ) ||
895 ( GetWindowInfo( hwnd, &wi ) &&
896 (wi.dwExStyle&WS_EX_NOACTIVATE) ) );
897 hwnd = GetNextWindow( hwnd, GW_HWNDPREV ) );
898 if( !hwnd || !GetWindowInfo( hwnd, &wi ) ||
899 (wi.dwExStyle&WS_EX_TOPMOST) )
911 QVLCMenu::updateSystrayMenu( this, p_intf );
914 void MainInterface::handleSystrayClick(
915 QSystemTrayIcon::ActivationReason reason )
919 case QSystemTrayIcon::Trigger:
920 case QSystemTrayIcon::DoubleClick:
921 toggleUpdateSystrayMenu();
923 case QSystemTrayIcon::MiddleClick:
924 sysTray->showMessage( qtr( "VLC media player" ),
925 qtr( "Control menu for the player" ),
926 QSystemTrayIcon::Information, 3000 );
934 * Updates the name of the systray Icon tooltip.
935 * Doesn't check if the systray exists, check before you call it.
937 void MainInterface::updateSystrayTooltipName( const QString& name )
941 sysTray->setToolTip( qtr( "VLC media player" ) );
945 sysTray->setToolTip( name );
946 if( b_notificationEnabled && ( isHidden() || isMinimized() ) )
948 sysTray->showMessage( qtr( "VLC media player" ), name,
949 QSystemTrayIcon::NoIcon, 3000 );
953 QVLCMenu::updateSystrayMenu( this, p_intf );
957 * Updates the status of the systray Icon tooltip.
958 * Doesn't check if the systray exists, check before you call it.
960 void MainInterface::updateSystrayTooltipStatus( int i_status )
967 sysTray->setToolTip( qtr( "VLC media player" ) );
972 sysTray->setToolTip( input_name );
977 sysTray->setToolTip( input_name + " - "
982 QVLCMenu::updateSystrayMenu( this, p_intf );
986 /************************************************************************
988 ************************************************************************/
989 void MainInterface::dropEvent(QDropEvent *event)
991 dropEventPlay( event, true );
994 void MainInterface::dropEventPlay( QDropEvent *event, bool b_play )
996 event->setDropAction( Qt::CopyAction );
997 if( !event->possibleActions() & Qt::CopyAction )
1000 const QMimeData *mimeData = event->mimeData();
1002 /* D&D of a subtitles file, add it on the fly */
1003 if( mimeData->urls().size() == 1 && THEMIM->getIM()->hasInput() )
1005 if( !input_AddSubtitle( THEMIM->getInput(),
1006 qtu( toNativeSeparators( mimeData->urls()[0].toLocalFile() ) ),
1014 bool first = b_play;
1015 foreach( const QUrl &url, mimeData->urls() )
1017 QString s = toNativeSeparators( url.toLocalFile() );
1019 if( s.length() > 0 ) {
1020 char* psz_uri = make_URI( qtu(s) );
1021 playlist_Add( THEPL, psz_uri, NULL,
1022 PLAYLIST_APPEND | (first ? PLAYLIST_GO: PLAYLIST_PREPARSE),
1023 PLAYLIST_END, true, pl_Unlocked );
1026 RecentsMRL::getInstance( p_intf )->addRecent( s );
1031 void MainInterface::dragEnterEvent(QDragEnterEvent *event)
1033 event->acceptProposedAction();
1035 void MainInterface::dragMoveEvent(QDragMoveEvent *event)
1037 event->acceptProposedAction();
1039 void MainInterface::dragLeaveEvent(QDragLeaveEvent *event)
1044 /************************************************************************
1046 ************************************************************************/
1047 void MainInterface::customEvent( QEvent *event )
1050 if( event->type() == PLDockEvent_Type )
1052 PlaylistDialog::killInstance();
1053 playlistEmbeddedFlag = true;
1055 QVLCMenu::createMenuBar(this, p_intf, true, visualSelectorEnabled);
1060 if ( event->type() == (int)SetVideoOnTopEvent_Type )
1062 SetVideoOnTopQtEvent* p_event = (SetVideoOnTopQtEvent*)event;
1063 if( p_event->OnTop() )
1064 setWindowFlags( windowFlags() | Qt::WindowStaysOnTopHint );
1066 setWindowFlags( windowFlags() & ~Qt::WindowStaysOnTopHint );
1067 show(); /* necessary to apply window flags */
1071 void MainInterface::keyPressEvent( QKeyEvent *e )
1073 handleKeyPress( e );
1076 void MainInterface::handleKeyPress( QKeyEvent *e )
1078 if( ( e->modifiers() & Qt::ControlModifier ) && ( e->key() == Qt::Key_H )
1079 && !menuBar()->isVisible() )
1081 toggleMinimalView( false );
1085 int i_vlck = qtEventToVLCKey( e );
1088 var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlck );
1095 void MainInterface::resizeEvent( QResizeEvent * event )
1102 mainVideoSize = size();
1106 if( VISIBLE( bgWidget) ||
1107 ( videoIsActive && videoWidget->isVisible() )
1109 mainVideoSize = size();
1111 mainBasedSize = size();
1115 QVLCMW::resizeEvent( event );
1116 msg_Dbg( p_intf, "Resize Event, height: %i", size().height() );
1120 void MainInterface::wheelEvent( QWheelEvent *e )
1122 int i_vlckey = qtWheelEventToVLCKey( e );
1123 var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlckey );
1127 void MainInterface::closeEvent( QCloseEvent *e )
1134 void MainInterface::toggleFullScreen()
1136 if( isFullScreen() )
1139 emit fullscreenInterfaceToggled( false );
1144 emit fullscreenInterfaceToggled( true );
1149 /*****************************************************************************
1150 * PopupMenuCB: callback triggered by the intf-popupmenu playlist variable.
1151 * We don't show the menu directly here because we don't want the
1152 * caller to block for a too long time.
1153 *****************************************************************************/
1154 static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable,
1155 vlc_value_t old_val, vlc_value_t new_val, void *param )
1157 intf_thread_t *p_intf = (intf_thread_t *)param;
1159 if( p_intf->pf_show_dialog )
1161 p_intf->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU,
1162 new_val.b_bool, NULL );
1168 /*****************************************************************************
1169 * IntfShowCB: callback triggered by the intf-show libvlc variable.
1170 *****************************************************************************/
1171 static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable,
1172 vlc_value_t old_val, vlc_value_t new_val, void *param )
1174 intf_thread_t *p_intf = (intf_thread_t *)param;
1175 p_intf->p_sys->p_mi->toggleFSC();