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, QVLCStackedWidget
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 stackCentralOldWidget
= 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 /*********************************
155 * Create the Systray Management *
156 *********************************/
159 /********************
161 ********************/
162 MainInputManager::getInstance( p_intf
);
167 taskbar_wmsg
= RegisterWindowMessage("TaskbarButtonCreated");
170 /************************************************************
171 * Connect the input manager to the GUI elements it manages *
172 ************************************************************/
174 * Connects on nameChanged()
175 * Those connects are different because options can impeach them to trigger.
177 /* Main Interface statusbar */
178 CONNECT( THEMIM
->getIM(), nameChanged( const QString
& ),
179 this, setName( const QString
& ) );
184 CONNECT( THEMIM
->getIM(), nameChanged( const QString
& ),
185 this, updateSystrayTooltipName( const QString
& ) );
188 /* and title of the Main Interface*/
189 if( var_InheritBool( p_intf
, "qt-name-in-title" ) )
191 CONNECT( THEMIM
->getIM(), nameChanged( const QString
& ),
192 this, setVLCWindowsTitle( const QString
& ) );
196 * CONNECTS on PLAY_STATUS
198 /* Status on the systray */
202 CONNECT( THEMIM
->getIM(), statusChanged( int ),
203 this, updateSystrayTooltipStatus( int ) );
207 /* END CONNECTS ON IM */
209 /* VideoWidget connects for asynchronous calls */
210 connect( this, SIGNAL(askGetVideo(WId
*,int*,int*,unsigned*,unsigned *)),
211 this, SLOT(getVideoSlot(WId
*,int*,int*,unsigned*,unsigned*)),
212 Qt::BlockingQueuedConnection
);
213 connect( this, SIGNAL(askReleaseVideo( void )),
214 this, SLOT(releaseVideoSlot( void )),
215 Qt::BlockingQueuedConnection
);
219 CONNECT( this, askVideoToResize( unsigned int, unsigned int ),
220 videoWidget
, SetSizing( unsigned int, unsigned int ) );
221 CONNECT( videoWidget
, sizeChanged( int, int ),
222 this, resizeStack( int, int ) );
223 CONNECT( this, askVideoSetFullScreen( bool ),
224 videoWidget
, SetFullScreen( bool ) );
225 CONNECT( videoWidget
, keyPressed( QKeyEvent
* ),
226 this, handleKeyPress( QKeyEvent
* ) );
229 CONNECT( THEDP
, toolBarConfUpdated(), this, recreateToolbars() );
231 /** END of CONNECTS**/
237 var_AddCallback( p_intf
->p_libvlc
, "intf-show", IntfShowCB
, p_intf
);
239 /* Register callback for the intf-popupmenu variable */
240 var_AddCallback( p_intf
->p_libvlc
, "intf-popupmenu", PopupMenuCB
, p_intf
);
242 /**** FINAL SIZING and placement of interface */
243 settings
->beginGroup( "MainWindow" );
244 QVLCTools::restoreWidgetPosition( settings
, this, QSize(400, 100) );
246 /* resize to previously saved main window size if appicable */
251 resize( mainVideoSize
);
253 resize( mainBasedSize
);
257 int i_plVis
= settings
->value( "playlist-visible", 0 ).toInt();
259 settings
->endGroup();
261 if( i_plVis
) togglePlaylist();
263 /* Final sizing and showing */
264 setVisible( !b_hideAfterCreation
);
266 setMinimumWidth( __MAX( controls
->sizeHint().width(),
267 menuBar()->sizeHint().width() ) + 30 );
269 /* Switch to minimal view if needed, must be called after the show() */
271 toggleMinimalView( true );
274 MainInterface::~MainInterface()
276 /* Unsure we hide the videoWidget before destroying it */
277 if( stackCentralOldWidget
== playlistWidget
)
280 /* Save playlist state */
284 QVLCTools::saveWidgetPosition( p_intf
, "Playlist", playlistWidget
);
286 delete playlistWidget
;
291 ImageList_Destroy( himl
);
293 p_taskbl
->vt
->Release(p_taskbl
);
297 /* Be sure to kill the actionsManager... Only used in the MI and control */
298 ActionsManager::killInstance();
301 ExtensionsManager::killInstance();
303 /* Delete the FSC controller */
304 delete fullscreenControls
;
307 settings
->beginGroup( "MainWindow" );
308 settings
->setValue( "pl-dock-status", b_plDocked
);
309 settings
->setValue( "playlist-visible", (int)playlistVisible
);
310 settings
->setValue( "adv-controls",
311 getControlsVisibilityStatus() & CONTROLS_ADVANCED
);
313 settings
->setValue( "mainBasedSize", mainBasedSize
);
314 settings
->setValue( "mainVideoSize", mainVideoSize
);
316 settings
->setValue( "backgroundSize", bgWidget
->size() );
319 QVLCTools::saveWidgetPosition(settings
, this);
320 settings
->endGroup();
324 /* Unregister callbacks */
325 var_DelCallback( p_intf
->p_libvlc
, "intf-show", IntfShowCB
, p_intf
);
326 var_DelCallback( p_intf
->p_libvlc
, "intf-popupmenu", PopupMenuCB
, p_intf
);
328 p_intf
->p_sys
->p_mi
= NULL
;
331 /*****************************
333 *****************************/
334 void MainInterface::recreateToolbars()
336 // FIXME: do the same for the FSC
337 settings
->beginGroup( "MainWindow" );
341 controls
= new ControlsWidget( p_intf
, false, this ); /* FIXME */
342 CONNECT( controls
, advancedControlsToggled( bool ),
343 this, adaptGeometry() );
344 CONNECT( controls
, sizeChanged(),
345 this, adaptGeometry() );
347 inputC
= new InputControlsWidget( p_intf
, this );
349 mainLayout
->insertWidget( 2, inputC
);
350 mainLayout
->insertWidget( settings
->value( "ToolbarPos", 0 ).toInt() ? 0: 3,
352 settings
->endGroup();
355 void MainInterface::createMainWidget( QSettings
*settings
)
357 /* Create the main Widget and the mainLayout */
358 QWidget
*main
= new QWidget
;
359 setCentralWidget( main
);
360 mainLayout
= new QVBoxLayout( main
);
361 main
->setContentsMargins( 0, 0, 0, 0 );
362 mainLayout
->setSpacing( 0 ); mainLayout
->setMargin( 0 );
365 stackCentralW
= new QVLCStackedWidget( main
);
368 bgWidget
= new BackgroundWidget( p_intf
);
369 stackCentralW
->addWidget( bgWidget
);
371 /* And video Outputs */
372 if( b_videoEmbedded
)
374 videoWidget
= new VideoWidget( p_intf
);
375 stackCentralW
->addWidget( videoWidget
);
377 mainLayout
->insertWidget( 1, stackCentralW
);
379 /* Create the CONTROLS Widget */
380 controls
= new ControlsWidget( p_intf
,
381 settings
->value( "adv-controls", false ).toBool(), this );
382 CONNECT( controls
, advancedControlsToggled( bool ),
383 this, adaptGeometry() );
384 CONNECT( controls
, sizeChanged(),
385 this, adaptGeometry() );
386 inputC
= new InputControlsWidget( p_intf
, this );
388 mainLayout
->insertWidget( 2, inputC
);
389 mainLayout
->insertWidget( settings
->value( "ToolbarPos", 0 ).toInt() ? 0: 3,
392 /* Visualisation, disabled for now, they SUCK */
394 visualSelector
= new VisualSelector( p_intf
);
395 mainLayout
->insertWidget( 0, visualSelector
);
396 visualSelector
->hide();
399 getSettings()->endGroup();
401 /* Enable the popup menu in the MI */
402 main
->setContextMenuPolicy( Qt::CustomContextMenu
);
403 CONNECT( main
, customContextMenuRequested( const QPoint
& ),
404 this, popupMenu( const QPoint
& ) );
406 if ( depth() > 8 ) /* 8bit depth has too many issues with opacity */
407 /* Create the FULLSCREEN CONTROLS Widget */
408 if( var_InheritBool( p_intf
, "qt-fs-controller" ) )
410 fullscreenControls
= new FullscreenControllerWidget( p_intf
, this );
411 CONNECT( fullscreenControls
, keyPressed( QKeyEvent
* ),
412 this, handleKeyPress( QKeyEvent
* ) );
416 inline void MainInterface::initSystray()
419 bool b_systrayAvailable
= QSystemTrayIcon::isSystemTrayAvailable();
420 bool b_systrayWanted
= var_InheritBool( p_intf
, "qt-system-tray" );
422 if( var_InheritBool( p_intf
, "qt-start-minimized") )
424 if( b_systrayAvailable
)
426 b_systrayWanted
= true;
427 b_hideAfterCreation
= true;
430 msg_Err( p_intf
, "cannot start minimized without system tray bar" );
433 if( b_systrayAvailable
&& b_systrayWanted
)
438 inline void MainInterface::createStatusBar()
443 /* Widgets Creation*/
444 QStatusBar
*statusBarr
= statusBar();
446 TimeLabel
*timeLabel
= new TimeLabel( p_intf
);
447 nameLabel
= new QLabel( this );
448 nameLabel
->setTextInteractionFlags( Qt::TextSelectableByMouse
449 | Qt::TextSelectableByKeyboard
);
450 SpeedLabel
*speedLabel
= new SpeedLabel( p_intf
, this );
452 /* Styling those labels */
453 timeLabel
->setFrameStyle( QFrame::Sunken
| QFrame::Panel
);
454 speedLabel
->setFrameStyle( QFrame::Sunken
| QFrame::Panel
);
455 nameLabel
->setFrameStyle( QFrame::Sunken
| QFrame::StyledPanel
);
457 /* and adding those */
458 statusBarr
->addWidget( nameLabel
, 8 );
459 statusBarr
->addPermanentWidget( speedLabel
, 0 );
460 statusBarr
->addPermanentWidget( timeLabel
, 0 );
462 /* timeLabel behaviour:
463 - double clicking opens the goto time dialog
464 - right-clicking and clicking just toggle between remaining and
466 CONNECT( timeLabel
, timeLabelDoubleClicked(), THEDP
, gotoTimeDialog() );
468 CONNECT( THEMIM
->getIM(), encryptionChanged( bool ),
469 this, showCryptedLabel( bool ) );
471 CONNECT( THEMIM
->getIM(), seekRequested( float ),
472 timeLabel
, setDisplayPosition( float ) );
475 /**********************************************************************
476 * Handling of sizing of the components
477 **********************************************************************/
479 /* This function is called:
480 - Advanced buttons toggled
481 - Toolbar geom changed
483 void MainInterface::adaptGeometry()
485 resize( sizeHint() );
492 void MainInterface::debug()
495 msg_Dbg( p_intf
, "size: %i - %i", size().height(), size().width() );
496 msg_Dbg( p_intf
, "sizeHint: %i - %i", sizeHint().height(), sizeHint().width() );
497 msg_Dbg( p_intf
, "minimumsize: %i - %i", minimumSize().height(), minimumSize().width() );
499 msg_Dbg( p_intf
, "Stack size: %i - %i", stackCentralW
->size().height(), stackCentralW
->size().width() );
500 msg_Dbg( p_intf
, "Stack sizeHint: %i - %i", stackCentralW
->sizeHint().height(), stackCentralW
->sizeHint().width() );
501 msg_Dbg( p_intf
, "Central size: %i - %i", centralWidget()->size().height(), centralWidget()->size().width() );
505 inline void MainInterface::showVideo() { showTab( videoWidget
); }
506 inline void MainInterface::showBg() { showTab( bgWidget
); }
508 inline void MainInterface::showTab( QWidget
*widget
)
511 msg_Warn( p_intf
, "Old stackCentralOldWidget %i", stackCentralW
->indexOf( stackCentralOldWidget
) );
513 stackCentralOldWidget
= stackCentralW
->currentWidget();
514 stackCentralW
->setCurrentWidget( widget
);
517 msg_Warn( p_intf
, "State change %i", stackCentralW
->currentIndex() );
518 msg_Warn( p_intf
, "New stackCentralOldWidget %i", stackCentralW
->indexOf( stackCentralOldWidget
) );
522 inline void MainInterface::restoreStackOldWidget()
525 msg_Warn( p_intf
, "New stackCentralOldWidget %i", stackCentralW
->indexOf( stackCentralOldWidget
) );
527 QWidget
*wTemp
= stackCentralW
->currentWidget();
529 stackCentralW
->setCurrentWidget( stackCentralOldWidget
);
531 stackCentralOldWidget
= wTemp
;
533 msg_Warn( p_intf
, "Debug %i %i",stackCentralW
->indexOf( wTemp
), stackCentralW
->indexOf( stackCentralW
->currentWidget() ) );
537 void MainInterface::destroyPopupMenu()
539 QVLCMenu::PopupMenu( p_intf
, false );
542 void MainInterface::popupMenu( const QPoint
&p
)
544 QVLCMenu::PopupMenu( p_intf
, true );
547 void MainInterface::toggleFSC()
549 if( !fullscreenControls
) return;
551 IMEvent
*eShow
= new IMEvent( FullscreenControlToggle_Type
, 0 );
552 QApplication::postEvent( fullscreenControls
, eShow
);
555 /****************************************************************************
557 ****************************************************************************/
559 /* This event is used to deal with the fullscreen and always on top
560 issue conflict (bug in wx) */
561 class SetVideoOnTopQtEvent
: public QEvent
564 SetVideoOnTopQtEvent( bool _onTop
) :
565 QEvent( (QEvent::Type
)SetVideoOnTopEvent_Type
), onTop( _onTop
)
568 bool OnTop() const { return onTop
; }
576 * You must not change the state of this object or other Qt4 UI objects,
577 * from the video output thread - only from the Qt4 UI main loop thread.
578 * All window provider queries must be handled through signals or events.
579 * That's why we have all those emit statements...
581 WId
MainInterface::getVideo( int *pi_x
, int *pi_y
,
582 unsigned int *pi_width
, unsigned int *pi_height
)
587 /* This is a blocking call signal. Results are returned through pointers.
588 * Beware of deadlocks! */
590 emit
askGetVideo( &id
, pi_x
, pi_y
, pi_width
, pi_height
);
594 void MainInterface::getVideoSlot( WId
*p_id
, int *pi_x
, int *pi_y
,
595 unsigned *pi_width
, unsigned *pi_height
)
597 /* Request the videoWidget */
598 WId ret
= videoWidget
->request( pi_x
, pi_y
,
599 pi_width
, pi_height
, b_keep_size
);
601 if( ret
) /* The videoWidget is available */
603 /* ask videoWidget to show */
604 videoWidget
->SetSizing( *pi_width
, *pi_height
);
606 /* Consider the video active now */
611 /* Asynchronous call from the WindowClose function */
612 void MainInterface::releaseVideo( void )
614 emit
askReleaseVideo();
617 /* Function that is CONNECTED to the previous emit */
618 void MainInterface::releaseVideoSlot( void )
620 videoWidget
->release();
622 restoreStackOldWidget();
624 /* We don't want to have a blank video to popup */
625 stackCentralOldWidget
= bgWidget
;
628 /* Asynchronous call from WindowControl function */
629 int MainInterface::controlVideo( int i_query
, va_list args
)
633 case VOUT_WINDOW_SET_SIZE
:
635 unsigned int i_width
= va_arg( args
, unsigned int );
636 unsigned int i_height
= va_arg( args
, unsigned int );
637 emit
askVideoToResize( i_width
, i_height
);
640 case VOUT_WINDOW_SET_STATE
:
642 unsigned i_arg
= va_arg( args
, unsigned );
643 unsigned on_top
= i_arg
& VOUT_WINDOW_STATE_ABOVE
;
644 QApplication::postEvent( this, new SetVideoOnTopQtEvent( on_top
) );
647 case VOUT_WINDOW_SET_FULLSCREEN
:
649 bool b_fs
= va_arg( args
, int );
650 emit
askVideoSetFullScreen( b_fs
);
654 msg_Warn( p_intf
, "unsupported control query" );
659 /*****************************************************************************
660 * Playlist, Visualisation and Menus handling
661 *****************************************************************************/
663 * Toggle the playlist widget or dialog
665 void MainInterface::createPlaylist()
667 playlistWidget
= new PlaylistWidget( p_intf
, this );
671 playlistWidget
->setWindowFlags( Qt::Window
);
673 /* This will restore the geometry but will not work for position,
674 because of parenting */
675 QVLCTools::restoreWidgetPosition( p_intf
, "Playlist",
676 playlistWidget
, QSize( 600, 300 ) );
680 stackCentralW
->addWidget( playlistWidget
);
684 void MainInterface::togglePlaylist()
686 if( !playlistWidget
)
691 /* Playlist is not visible, show it */
692 if( stackCentralW
->currentWidget() != playlistWidget
)
694 showTab( playlistWidget
);
698 restoreStackOldWidget();
700 playlistVisible
= ( stackCentralW
->currentWidget() == playlistWidget
);
704 playlistWidget
->setWindowFlags( Qt::Window
);
705 playlistVisible
= !playlistVisible
;
706 playlistWidget
->setVisible( playlistVisible
);
711 void MainInterface::dockPlaylist( bool p_docked
)
713 if( b_plDocked
== p_docked
) return;
714 b_plDocked
= p_docked
;
716 if( !playlistWidget
) return; /* Playlist wasn't created yet */
719 stackCentralW
->removeWidget( playlistWidget
);
720 playlistWidget
->setWindowFlags( Qt::Window
);
721 QVLCTools::restoreWidgetPosition( p_intf
, "Playlist",
722 playlistWidget
, QSize( 600, 300 ) );
723 playlistWidget
->show();
724 restoreStackOldWidget();
728 playlistWidget
->setWindowFlags( Qt::Widget
); // Probably a Qt bug here
729 // It would be logical that QStackWidget::addWidget reset the flags...
730 stackCentralW
->addWidget( playlistWidget
);
731 stackCentralW
->setCurrentWidget( playlistWidget
);
736 If b_switch is false, then we are normalView
738 void MainInterface::toggleMinimalView( bool b_switch
)
740 if( i_visualmode
== 0 )
741 { /* NORMAL MODE then */
742 if( !videoWidget
|| stackCentralW
->currentWidget() != videoWidget
)
748 /* If video is visible, then toggle the status of bgWidget */
750 //bgWasVisible = !bgWasVisible;
751 /* if( stackCentralOldState == BACK G_TAB )
752 stackCentralOldState = HID DEN_TAB;
754 stackCentralOldState = BACK G_TAB;
760 menuBar()->setVisible( !b_switch
);
761 controls
->setVisible( !b_switch
);
762 statusBar()->setVisible( !b_switch
);
763 inputC
->setVisible( !b_switch
);
765 emit
minimalViewToggled( b_switch
);
768 /* toggling advanced controls buttons */
769 void MainInterface::toggleAdvancedButtons()
771 controls
->toggleAdvanced();
772 // if( fullscreenControls ) fullscreenControls->toggleAdvanced();
775 /* Get the visibility status of the controls (hidden or not, advanced or not) */
776 int MainInterface::getControlsVisibilityStatus()
778 return( (controls
->isVisible() ? CONTROLS_VISIBLE
: CONTROLS_HIDDEN
)
779 + CONTROLS_ADVANCED
* controls
->b_advancedVisible
);
783 void MainInterface::visual()
785 if( !VISIBLE( visualSelector
) )
787 visualSelector
->show();
788 if( !THEMIM
->getIM()->hasVideo() )
790 /* Show the background widget */
792 visualSelectorEnabled
= true;
796 /* Stop any currently running visualization */
797 visualSelector
->hide();
798 visualSelectorEnabled
= false;
803 /************************************************************************
805 ************************************************************************/
806 void MainInterface::setName( const QString
& name
)
808 input_name
= name
; /* store it for the QSystray use */
809 /* Display it in the status bar, but also as a Tooltip in case it doesn't
811 nameLabel
->setText( " " + name
+ " " );
812 nameLabel
->setToolTip( " " + name
+" " );
816 * Give the decorations of the Main Window a correct Name.
817 * If nothing is given, set it to VLC...
819 void MainInterface::setVLCWindowsTitle( const QString
& aTitle
)
821 if( aTitle
.isEmpty() )
823 setWindowTitle( qtr( "VLC media player" ) );
827 setWindowTitle( aTitle
+ " - " + qtr( "VLC media player" ) );
831 void MainInterface::showCryptedLabel( bool b_show
)
833 if( cryptedLabel
== NULL
)
835 cryptedLabel
= new QLabel
;
836 // The lock icon is not the right one for DRM protection/scrambled.
837 //cryptedLabel->setPixmap( QPixmap( ":/lock" ) );
838 cryptedLabel
->setText( "DRM" );
839 statusBar()->addWidget( cryptedLabel
);
842 cryptedLabel
->setVisible( b_show
);
845 void MainInterface::showBuffering( float f_cache
)
847 QString amount
= QString("Buffering: %1%").arg( (int)(100*f_cache
) );
848 statusBar()->showMessage( amount
, 1000 );
851 /*****************************************************************************
852 * Systray Icon and Systray Menu
853 *****************************************************************************/
856 * Create a SystemTray icon and a menu that would go with it.
857 * Connects to a click handler on the icon.
859 void MainInterface::createSystray()
862 if( QDate::currentDate().dayOfYear() >= 354 )
863 iconVLC
= QIcon( ":/logo/vlc128-christmas.png" );
865 iconVLC
= QIcon( ":/logo/vlc128.png" );
866 sysTray
= new QSystemTrayIcon( iconVLC
, this );
867 sysTray
->setToolTip( qtr( "VLC media player" ));
869 systrayMenu
= new QMenu( qtr( "VLC media player" ), this );
870 systrayMenu
->setIcon( iconVLC
);
872 QVLCMenu::updateSystrayMenu( this, p_intf
, true );
875 CONNECT( sysTray
, activated( QSystemTrayIcon::ActivationReason
),
876 this, handleSystrayClick( QSystemTrayIcon::ActivationReason
) );
880 * Updates the Systray Icon's menu and toggle the main interface
882 void MainInterface::toggleUpdateSystrayMenu()
884 /* If hidden, show it */
890 else if( isMinimized() )
898 /* Visible (possibly under other windows) */
900 /* check if any visible window is above vlc in the z-order,
901 * but ignore the ones always on top
902 * and the ones which can't be activated */
905 wi
.cbSize
= sizeof( WINDOWINFO
);
906 for( hwnd
= GetNextWindow( internalWinId(), GW_HWNDPREV
);
907 hwnd
&& ( !IsWindowVisible( hwnd
) ||
908 ( GetWindowInfo( hwnd
, &wi
) &&
909 (wi
.dwExStyle
&WS_EX_NOACTIVATE
) ) );
910 hwnd
= GetNextWindow( hwnd
, GW_HWNDPREV
) );
911 if( !hwnd
|| !GetWindowInfo( hwnd
, &wi
) ||
912 (wi
.dwExStyle
&WS_EX_TOPMOST
) )
924 QVLCMenu::updateSystrayMenu( this, p_intf
);
927 void MainInterface::handleSystrayClick(
928 QSystemTrayIcon::ActivationReason reason
)
932 case QSystemTrayIcon::Trigger
:
933 case QSystemTrayIcon::DoubleClick
:
934 toggleUpdateSystrayMenu();
936 case QSystemTrayIcon::MiddleClick
:
937 sysTray
->showMessage( qtr( "VLC media player" ),
938 qtr( "Control menu for the player" ),
939 QSystemTrayIcon::Information
, 3000 );
947 * Updates the name of the systray Icon tooltip.
948 * Doesn't check if the systray exists, check before you call it.
950 void MainInterface::updateSystrayTooltipName( const QString
& name
)
954 sysTray
->setToolTip( qtr( "VLC media player" ) );
958 sysTray
->setToolTip( name
);
959 if( b_notificationEnabled
&& ( isHidden() || isMinimized() ) )
961 sysTray
->showMessage( qtr( "VLC media player" ), name
,
962 QSystemTrayIcon::NoIcon
, 3000 );
966 QVLCMenu::updateSystrayMenu( this, p_intf
);
970 * Updates the status of the systray Icon tooltip.
971 * Doesn't check if the systray exists, check before you call it.
973 void MainInterface::updateSystrayTooltipStatus( int i_status
)
980 sysTray
->setToolTip( qtr( "VLC media player" ) );
985 sysTray
->setToolTip( input_name
);
990 sysTray
->setToolTip( input_name
+ " - "
995 QVLCMenu::updateSystrayMenu( this, p_intf
);
999 /************************************************************************
1001 ************************************************************************/
1002 void MainInterface::dropEvent(QDropEvent
*event
)
1004 dropEventPlay( event
, true );
1007 void MainInterface::dropEventPlay( QDropEvent
*event
, bool b_play
)
1009 event
->setDropAction( Qt::CopyAction
);
1010 if( !event
->possibleActions() & Qt::CopyAction
)
1013 const QMimeData
*mimeData
= event
->mimeData();
1015 /* D&D of a subtitles file, add it on the fly */
1016 if( mimeData
->urls().size() == 1 && THEMIM
->getIM()->hasInput() )
1018 if( !input_AddSubtitle( THEMIM
->getInput(),
1019 qtu( toNativeSeparators( mimeData
->urls()[0].toLocalFile() ) ),
1027 bool first
= b_play
;
1028 foreach( const QUrl
&url
, mimeData
->urls() )
1030 QString s
= toNativeSeparators( url
.toLocalFile() );
1032 if( s
.length() > 0 ) {
1033 char* psz_uri
= make_URI( qtu(s
) );
1034 playlist_Add( THEPL
, psz_uri
, NULL
,
1035 PLAYLIST_APPEND
| (first
? PLAYLIST_GO
: PLAYLIST_PREPARSE
),
1036 PLAYLIST_END
, true, pl_Unlocked
);
1039 RecentsMRL::getInstance( p_intf
)->addRecent( s
);
1044 void MainInterface::dragEnterEvent(QDragEnterEvent
*event
)
1046 event
->acceptProposedAction();
1048 void MainInterface::dragMoveEvent(QDragMoveEvent
*event
)
1050 event
->acceptProposedAction();
1052 void MainInterface::dragLeaveEvent(QDragLeaveEvent
*event
)
1057 /************************************************************************
1059 ************************************************************************/
1060 void MainInterface::customEvent( QEvent
*event
)
1063 if( event
->type() == PLDockEvent_Type
)
1065 PlaylistDialog::killInstance();
1066 playlistEmbeddedFlag
= true;
1068 QVLCMenu::createMenuBar(this, p_intf
, true, visualSelectorEnabled
);
1073 if ( event
->type() == (int)SetVideoOnTopEvent_Type
)
1075 SetVideoOnTopQtEvent
* p_event
= (SetVideoOnTopQtEvent
*)event
;
1076 if( p_event
->OnTop() )
1077 setWindowFlags( windowFlags() | Qt::WindowStaysOnTopHint
);
1079 setWindowFlags( windowFlags() & ~Qt::WindowStaysOnTopHint
);
1080 show(); /* necessary to apply window flags */
1084 void MainInterface::keyPressEvent( QKeyEvent
*e
)
1086 handleKeyPress( e
);
1089 void MainInterface::handleKeyPress( QKeyEvent
*e
)
1091 if( ( e
->modifiers() & Qt::ControlModifier
) && ( e
->key() == Qt::Key_H
)
1092 && !menuBar()->isVisible() )
1094 toggleMinimalView( false );
1098 int i_vlck
= qtEventToVLCKey( e
);
1101 var_SetInteger( p_intf
->p_libvlc
, "key-pressed", i_vlck
);
1108 void MainInterface::resizeEvent( QResizeEvent
* event
)
1115 mainVideoSize
= size();
1119 if( VISIBLE( bgWidget
) ||
1120 ( videoIsActive
&& videoWidget
->isVisible() )
1122 mainVideoSize
= size();
1124 mainBasedSize
= size();
1128 QVLCMW::resizeEvent( event
);
1129 msg_Dbg( p_intf
, "Resize Event, height: %i", size().height() );
1133 void MainInterface::wheelEvent( QWheelEvent
*e
)
1135 int i_vlckey
= qtWheelEventToVLCKey( e
);
1136 var_SetInteger( p_intf
->p_libvlc
, "key-pressed", i_vlckey
);
1140 void MainInterface::closeEvent( QCloseEvent
*e
)
1147 void MainInterface::toggleFullScreen()
1149 if( isFullScreen() )
1152 emit
fullscreenInterfaceToggled( false );
1157 emit
fullscreenInterfaceToggled( true );
1161 /*****************************************************************************
1162 * PopupMenuCB: callback triggered by the intf-popupmenu playlist variable.
1163 * We don't show the menu directly here because we don't want the
1164 * caller to block for a too long time.
1165 *****************************************************************************/
1166 static int PopupMenuCB( vlc_object_t
*p_this
, const char *psz_variable
,
1167 vlc_value_t old_val
, vlc_value_t new_val
, void *param
)
1169 intf_thread_t
*p_intf
= (intf_thread_t
*)param
;
1171 if( p_intf
->pf_show_dialog
)
1173 p_intf
->pf_show_dialog( p_intf
, INTF_DIALOG_POPUPMENU
,
1174 new_val
.b_bool
, NULL
);
1180 /*****************************************************************************
1181 * IntfShowCB: callback triggered by the intf-show libvlc variable.
1182 *****************************************************************************/
1183 static int IntfShowCB( vlc_object_t
*p_this
, const char *psz_variable
,
1184 vlc_value_t old_val
, vlc_value_t new_val
, void *param
)
1186 intf_thread_t
*p_intf
= (intf_thread_t
*)param
;
1187 p_intf
->p_sys
->p_mi
->toggleFSC();