]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/main_interface.cpp
Qt4: fix a minor (but annoying) UI glitch on restart
[vlc] / modules / gui / qt4 / main_interface.cpp
index 862fbe2b1c9942d95d7ed94221801260a0479620..17810d90963031d0e7e49a929697a052bf04b00f 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * main_interface.cpp : Main interface
  ****************************************************************************
- * Copyright (C) 2006-2009 the VideoLAN team
+ * Copyright (C) 2006-2010 VideoLAN and AUTHORS
  * $Id$
  *
  * Authors: ClĂ©ment Stenac <zorglub@videolan.org>
@@ -19,8 +19,8 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 #ifdef HAVE_CONFIG_H
 #include "qt4.hpp"
 
 #include "main_interface.hpp"
-#include "input_manager.hpp"
-#include "actions_manager.hpp"
+#include "input_manager.hpp"                    // Creation
+#include "actions_manager.hpp"                  // killInstance
+#include "extensions_manager.hpp"               // killInstance
 
-#include "util/customwidgets.hpp"
-#include "util/qt_dirs.hpp"
+#include "util/customwidgets.hpp"               // qtEventToVLCKey, QVLCStackedWidget
+#include "util/qt_dirs.hpp"                     // toNativeSeparators
 
-#include "components/interface_widgets.hpp"
-#include "components/controller.hpp"
-#include "components/playlist/playlist.hpp"
-#include "dialogs/external.hpp"
-#include "dialogs/firstrun.hpp"
+#include "components/interface_widgets.hpp"     // bgWidget, videoWidget
+#include "components/controller.hpp"            // controllers
+#include "components/playlist/playlist.hpp"     // plWidget
+#include "dialogs/firstrun.hpp"                 // First Run
 
-#include "menus.hpp"
-#include "recents.hpp"
+#include "menus.hpp"                            // Menu creation
+#include "recents.hpp"                          // RecentItems when DnD
 
 #include <QCloseEvent>
 #include <QKeyEvent>
 #include <QMenuBar>
 #include <QStatusBar>
 #include <QLabel>
-#include <QGroupBox>
-#include <QPushButton>
 #include <QStackedWidget>
 
-#ifdef WIN32
- #include <vlc_windows_interfaces.h>
- #include <QBitmap>
-#endif
-
-#include <assert.h>
-
-#include <vlc_keys.h> /* Wheel event */
-#include <vlc_vout_window.h>
-#include <vlc_vout_display.h>
+#include <vlc_keys.h>                       /* Wheel event */
+#include <vlc_vout_display.h>               /* vout_thread_t and VOUT_ events */
 
 // #define DEBUG_INTF
+
 /* Callback prototypes */
 static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable,
                         vlc_value_t old_val, vlc_value_t new_val, void *param );
@@ -81,10 +72,10 @@ static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable,
 MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
 {
     /* Variables initialisation */
-    // need_components_update = false;
     bgWidget             = NULL;
     videoWidget          = NULL;
     playlistWidget       = NULL;
+    stackCentralOldWidget= NULL;
 #ifndef HAVE_MAEMO
     sysTray              = NULL;
 #endif
@@ -93,11 +84,10 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     controls             = NULL;
     inputC               = NULL;
 
-    b_hideAfterCreation  = false;
-    playlistVisible      = false; // FIXME remove
+    b_hideAfterCreation  = false; // --qt-start-minimized
+    playlistVisible      = false;
     input_name           = "";
 
-    i_bg_height          = 0;
 
     /* Ask for Privacy */
     FirstRun::CheckAndRun( this, p_intf );
@@ -111,33 +101,31 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     setAcceptDrops( true );
     setWindowRole( "vlc-main" );
     setWindowIcon( QApplication::windowIcon() );
-    setWindowOpacity( config_GetFloat( p_intf, "qt-opacity" ) );
+    setWindowOpacity( var_InheritFloat( p_intf, "qt-opacity" ) );
+#ifdef Q_WS_MAC
+    setAttribute( Qt::WA_MacBrushedMetal );
+#endif
 
-    /* Set The Video In emebedded Mode or not */
-    videoEmbeddedFlag = config_GetInt( p_intf, "embedded-video" );
+    /* Is video in embedded in the UI or not */
+    b_videoEmbedded = var_InheritBool( p_intf, "embedded-video" );
 
     /* Does the interface resize to video size or the opposite */
-    b_keep_size = !config_GetInt( p_intf, "qt-video-autoresize" );
+    b_autoresize = var_InheritBool( p_intf, "qt-video-autoresize" );
 
     /* Are we in the enhanced always-video mode or not ? */
-    i_visualmode = config_GetInt( p_intf, "qt-display-mode" );
+    b_minimalView = var_InheritBool( p_intf, "qt-minimal-view" );
 
     /* Do we want anoying popups or not */
-    notificationEnabled = (bool)config_GetInt( p_intf, "qt-notification" );
+    b_notificationEnabled = var_InheritBool( p_intf, "qt-notification" );
 
     /* Set the other interface settings */
     settings = getSettings();
     settings->beginGroup( "MainWindow" );
 
-    /**
-     * Retrieve saved sizes for main window
-     *   mainBasedSize = based window size for normal mode
-     *                  (no video, no background)
-     *   mainVideoSize = window size with video (all modes)
-     **/
-    mainBasedSize = settings->value( "mainBasedSize", QSize( 350, 120 ) ).toSize();
-    mainVideoSize = settings->value( "mainVideoSize", QSize( 400, 300 ) ).toSize();
+    /* */
+    b_plDocked = getSettings()->value( "pl-dock-status", true ).toBool();
 
+    settings->endGroup( );
 
     /**************
      * Status Bar *
@@ -148,7 +136,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
      *  UI and Widgets design
      **************************/
     setVLCWindowsTitle();
-    createMainWidget( settings );
 
     /************
      * Menu Bar *
@@ -157,6 +144,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     CONNECT( THEMIM->getIM(), voutListChanged( vout_thread_t **, int ),
              this, destroyPopupMenu() );
 
+    createMainWidget( settings );
     /*********************************
      * Create the Systray Management *
      *********************************/
@@ -168,6 +156,8 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     MainInputManager::getInstance( p_intf );
 
 #ifdef WIN32
+    himl = NULL;
+    p_taskbl = NULL;
     taskbar_wmsg = RegisterWindowMessage("TaskbarButtonCreated");
 #endif
 
@@ -190,7 +180,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     }
 #endif
     /* and title of the Main Interface*/
-    if( config_GetInt( p_intf, "qt-name-in-title" ) )
+    if( var_InheritBool( p_intf, "qt-name-in-title" ) )
     {
         CONNECT( THEMIM->getIM(), nameChanged( const QString& ),
                  this, setVLCWindowsTitle( const QString& ) );
@@ -210,102 +200,71 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
 
     /* END CONNECTS ON IM */
 
-    /************
-     * Callbacks
-     ************/
-    var_AddCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf );
-
-    /* Register callback for the intf-popupmenu variable */
-    var_AddCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf );
-
-
     /* VideoWidget connects for asynchronous calls */
+    b_videoFullScreen = false;
+    b_videoOnTop = 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 )
     {
-        CONNECT( this, askVideoToResize( unsigned int, unsigned int ),
-                 videoWidget, SetSizing( unsigned int, unsigned int ) );
+        if( b_autoresize )
+        {
+            CONNECT( this, askVideoToResize( 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( this, askUpdate(), this, doComponentsUpdate() );
     CONNECT( THEDP, toolBarConfUpdated(), this, recreateToolbars() );
 
-        /* Enable the popup menu in the MI */
-    setContextMenuPolicy( Qt::CustomContextMenu );
-    CONNECT( this, customContextMenuRequested( const QPoint& ),
-             this, popupMenu( const QPoint& ) );
-
     /** END of CONNECTS**/
 
 
-    /**** FINAL SIZING and placement of interface */
-    settings->beginGroup( "MainWindow" );
-    QVLCTools::restoreWidgetPosition( settings, this, QSize(380, 60) );
+    /************
+     * Callbacks
+     ************/
+    var_AddCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf );
 
-    /* resize to previously saved main window size if appicable */
-    if( b_keep_size )
-    {
-       if( i_visualmode == QT_ALWAYS_VIDEO_MODE ||
-           i_visualmode == QT_MINIMAL_MODE )
-       {
-           resize( mainVideoSize );
-       }
-       else
-       {
-           resize( mainBasedSize );
-       }
-    }
+    /* Register callback for the intf-popupmenu variable */
+    var_AddCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf );
 
-    msg_Dbg( p_intf, "%i", stackCentralOldState );
     /* Playlist */
-    if( settings->value( "playlist-visible", 0 ).toInt() )
-        togglePlaylist();
+    int i_plVis = settings->value( "MainWindow/playlist-visible", false ).toBool();
+
+    if( i_plVis ) togglePlaylist();
+
+    /**** FINAL SIZING and placement of interface */
+    settings->beginGroup( "MainWindow" );
+    QVLCTools::restoreWidgetPosition( settings, this, QSize(400, 100) );
     settings->endGroup();
 
+    b_interfaceFullScreen = isFullScreen();
+
     /* Final sizing and showing */
     setVisible( !b_hideAfterCreation );
-    //setMinimumSize( QSize( 0, 0 ) );
-    //    setMinimumWidth( __MAX( controls->sizeHint().width(),
-    //                          menuBar()->sizeHint().width() ) );
 
-    debug();
-    /* And switch to minimal view if needed
-       Must be called after the show() */
-    if( i_visualmode == QT_MINIMAL_MODE )
-        toggleMinimalView( true );
+    setMinimumWidth( __MAX( controls->sizeHint().width(),
+                            menuBar()->sizeHint().width() ) + 30 );
 
-    /* Update the geometry : It is useful if you switch between
-       qt-display-modes */
-    updateGeometry();
-    resize( sizeHint() );
+    /* Switch to minimal view if needed, must be called after the show() */
+    if( b_minimalView )
+        toggleMinimalView( true );
 }
 
 MainInterface::~MainInterface()
 {
-    msg_Dbg( p_intf, "Destroying the main interface" );
-
     /* Unsure we hide the videoWidget before destroying it */
-    if( stackCentralOldState == VIDEO_TAB )
-        showBg();
-
-    /* Save playlist state */
-    if( playlistWidget )
-    {
-        if( !isDocked() )
-            QVLCTools::saveWidgetPosition( p_intf, "Playlist", playlistWidget );
-
-        delete playlistWidget;
-    }
+    if( stackCentralOldWidget == videoWidget )
+        showTab( bgWidget );
 
 #ifdef WIN32
     if( himl )
@@ -315,29 +274,43 @@ MainInterface::~MainInterface()
     CoUninitialize();
 #endif
 
-    /* Be sure to kill the actionsManager... FIXME */
+    /* Be sure to kill the actionsManager... Only used in the MI and control */
     ActionsManager::killInstance();
 
+    /* Idem */
+    ExtensionsManager::killInstance();
+
     /* Delete the FSC controller */
     delete fullscreenControls;
 
     /* Save states */
     settings->beginGroup( "MainWindow" );
-    settings->setValue( "pl-dock-status", (int)i_pl_dock );
-    settings->setValue( "playlist-visible", (int)playlistVisible );
+
+    settings->setValue( "pl-dock-status", b_plDocked );
+    /* Save playlist state */
+    if( playlistWidget )
+        settings->setValue( "playlist-visible", playlistVisible );
+
     settings->setValue( "adv-controls",
                         getControlsVisibilityStatus() & CONTROLS_ADVANCED );
 
-    settings->setValue( "mainBasedSize", mainBasedSize );
-    settings->setValue( "mainVideoSize", mainVideoSize );
-
-    if( bgWidget )
-        settings->setValue( "backgroundSize", bgWidget->size() );
+    /* Save the stackCentralW sizes */
+    settings->setValue( "bgSize", stackWidgetsSizes[bgWidget] );
+    settings->setValue( "playlistSize", stackWidgetsSizes[playlistWidget] );
 
     /* Save this size */
     QVLCTools::saveWidgetPosition(settings, this);
+
     settings->endGroup();
 
+    /* Save undocked playlist size */
+    if( playlistWidget && !isPlDocked() )
+        QVLCTools::saveWidgetPosition( p_intf, "Playlist", playlistWidget );
+
+    delete playlistWidget;
+
+    delete statusBar();
+
     /* Unregister callbacks */
     var_DelCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf );
     var_DelCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf );
@@ -350,19 +323,22 @@ MainInterface::~MainInterface()
  *****************************/
 void MainInterface::recreateToolbars()
 {
-    //msg_Dbg( p_intf, "Recreating the toolbars" );
+    bool b_adv = getControlsVisibilityStatus() & CONTROLS_ADVANCED;
+
     settings->beginGroup( "MainWindow" );
     delete controls;
     delete inputC;
 
-    controls = new ControlsWidget( p_intf, false, this ); /* FIXME */
-    CONNECT( controls, advancedControlsToggled( bool ),
-             this, doComponentsUpdate() );
-    CONNECT( controls, sizeChanged(),
-             this, doComponentsUpdate() );
-
+    controls = new ControlsWidget( p_intf, b_adv, this );
     inputC = new InputControlsWidget( p_intf, this );
 
+    if( fullscreenControls )
+    {
+        delete fullscreenControls;
+        fullscreenControls = new FullscreenControllerWidget( p_intf, this );
+        CONNECT( fullscreenControls, keyPressed( QKeyEvent * ),
+                 this, handleKeyPress( QKeyEvent * ) );
+    }
     mainLayout->insertWidget( 2, inputC );
     mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3,
                               controls );
@@ -375,89 +351,69 @@ void MainInterface::createMainWidget( QSettings *settings )
     QWidget *main = new QWidget;
     setCentralWidget( main );
     mainLayout = new QVBoxLayout( main );
-
-    /* Margins, spacing */
     main->setContentsMargins( 0, 0, 0, 0 );
     mainLayout->setSpacing( 0 ); mainLayout->setMargin( 0 );
 
     /* */
-    stackCentralW = new QStackedWidget( main );
+    stackCentralW = new QVLCStackedWidget( main );
 
     /* Bg Cone */
     bgWidget = new BackgroundWidget( p_intf );
-    bgWidget->resize(
-            settings->value( "backgroundSize", QSize( 300, 200 ) ).toSize() );
-    bgWidget->updateGeometry();
-    stackCentralW->insertWidget( BACKG_TAB, bgWidget );
-
+    stackCentralW->addWidget( bgWidget );
 
     /* And video Outputs */
-    if( videoEmbeddedFlag )
+    if( b_videoEmbedded )
     {
         videoWidget = new VideoWidget( p_intf );
-        stackCentralW->insertWidget( VIDEO_TAB, videoWidget );
+        stackCentralW->addWidget( videoWidget );
     }
-    mainLayout->insertWidget( 1, stackCentralW, 100 );
+    mainLayout->insertWidget( 1, stackCentralW );
 
+    settings->beginGroup( "MainWindow" );
+    stackWidgetsSizes[bgWidget] = settings->value( "bgSize", QSize( 400, 0 ) ).toSize();
+    /* Resize even if no-auto-resize, because we are at creation */
+    resizeStack( stackWidgetsSizes[bgWidget].width(), stackWidgetsSizes[bgWidget].height() );
 
     /* Create the CONTROLS Widget */
     controls = new ControlsWidget( p_intf,
                    settings->value( "adv-controls", false ).toBool(), this );
-    CONNECT( controls, advancedControlsToggled( bool ),
-             this, doComponentsUpdate() );
-    CONNECT( controls, sizeChanged(),
-             this, doComponentsUpdate() );
     inputC = new InputControlsWidget( p_intf, this );
 
-    if( i_visualmode != QT_ALWAYS_VIDEO_MODE &&
-        i_visualmode != QT_MINIMAL_MODE )
-    {
-        hideStackWidget();
-        stackCentralOldState = HIDDEN_TAB;
-    }
-    else
-    {
-        showTab( BACKG_TAB );
-        stackCentralOldState = BACKG_TAB;
-    }
-
-
-    //mainLayout->setRowStretch( 1, 10 );
     mainLayout->insertWidget( 2, inputC );
     mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3,
                               controls );
 
-    /* Visualisation */
-    /* Disabled for now, they SUCK */
+    /* Visualisation, disabled for now, they SUCK */
     #if 0
     visualSelector = new VisualSelector( p_intf );
     mainLayout->insertWidget( 0, visualSelector );
     visualSelector->hide();
     #endif
 
-    /* Finish the sizing */
-    main->updateGeometry();
+    settings->endGroup();
 
-    getSettings()->endGroup();
-#ifdef WIN32
-    if ( depth() > 8 )
-#endif
-    /* Create the FULLSCREEN CONTROLS Widget */
-    if( config_GetInt( p_intf, "qt-fs-controller" ) )
-    {
-        fullscreenControls = new FullscreenControllerWidget( p_intf, this );
-        CONNECT( fullscreenControls, keyPressed( QKeyEvent * ),
-                 this, handleKeyPress( QKeyEvent * ) );
-    }
+    /* Enable the popup menu in the MI */
+    main->setContextMenuPolicy( Qt::CustomContextMenu );
+    CONNECT( main, customContextMenuRequested( const QPoint& ),
+             this, popupMenu( const QPoint& ) );
+
+    if ( depth() > 8 ) /* 8bit depth has too many issues with opacity */
+        /* Create the FULLSCREEN CONTROLS Widget */
+        if( var_InheritBool( p_intf, "qt-fs-controller" ) )
+        {
+            fullscreenControls = new FullscreenControllerWidget( p_intf, this );
+            CONNECT( fullscreenControls, keyPressed( QKeyEvent * ),
+                     this, handleKeyPress( QKeyEvent * ) );
+        }
 }
 
 inline void MainInterface::initSystray()
 {
 #ifndef HAVE_MAEMO
     bool b_systrayAvailable = QSystemTrayIcon::isSystemTrayAvailable();
-    bool b_systrayWanted = config_GetInt( p_intf, "qt-system-tray" );
+    bool b_systrayWanted = var_InheritBool( p_intf, "qt-system-tray" );
 
-    if( config_GetInt( p_intf, "qt-start-minimized") > 0 )
+    if( var_InheritBool( p_intf, "qt-start-minimized") )
     {
         if( b_systrayAvailable )
         {
@@ -485,12 +441,16 @@ inline void MainInterface::createStatusBar()
     nameLabel = new QLabel( this );
     nameLabel->setTextInteractionFlags( Qt::TextSelectableByMouse
                                       | Qt::TextSelectableByKeyboard );
-    SpeedLabel *speedLabel = new SpeedLabel( p_intf, "1.00x", this );
+    SpeedLabel *speedLabel = new SpeedLabel( p_intf, this );
 
     /* Styling those labels */
     timeLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel );
     speedLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel );
     nameLabel->setFrameStyle( QFrame::Sunken | QFrame::StyledPanel);
+    timeLabel->setStyleSheet(
+            "QLabel:hover { background-color: rgba(255, 255, 255, 50%) }" );
+    speedLabel->setStyleSheet(
+            "QLabel:hover { background-color: rgba(255, 255, 255, 50%) }" );
 
     /* and adding those */
     statusBarr->addWidget( nameLabel, 8 );
@@ -505,354 +465,67 @@ inline void MainInterface::createStatusBar()
 
     CONNECT( THEMIM->getIM(), encryptionChanged( bool ),
              this, showCryptedLabel( bool ) );
-}
-
-#ifdef WIN32
-void MainInterface::createTaskBarButtons()
-{
-    taskbar_wmsg = WM_NULL;
-    /*Here is the code for the taskbar thumb buttons
-    FIXME:We need pretty buttons in 16x16 px that are handled correctly by masks in Qt
-    FIXME:the play button's picture doesn't changed to pause when clicked
-    */
-    OSVERSIONINFO winVer;
-    winVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-    if( GetVersionEx(&winVer) && winVer.dwMajorVersion > 5 )
-    {
-        if(himl = ImageList_Create( 15, //cx
-                                    18, //cy
-                                    ILC_COLOR,//flags
-                                    4,//initial nb of images
-                                    0//nb of images that can be added
-                                    ))
-        {
-            QPixmap img   = QPixmap(":/toolbar/previous_b");
-            QPixmap img2  = QPixmap(":/toolbar/pause_b");
-            QPixmap img3  = QPixmap(":/toolbar/play_b");
-            QPixmap img4  = QPixmap(":/toolbar/next_b");
-            QBitmap mask  = img.createMaskFromColor(Qt::transparent);
-            QBitmap mask2 = img2.createMaskFromColor(Qt::transparent);
-            QBitmap mask3 = img3.createMaskFromColor(Qt::transparent);
-            QBitmap mask4 = img4.createMaskFromColor(Qt::transparent);
-
-            if(-1 == ImageList_Add(himl, img.toWinHBITMAP(QPixmap::PremultipliedAlpha),mask.toWinHBITMAP()))
-                msg_Err( p_intf, "ImageList_Add failed" );
-            if(-1 == ImageList_Add(himl, img2.toWinHBITMAP(QPixmap::PremultipliedAlpha),mask2.toWinHBITMAP()))
-                msg_Err( p_intf, "ImageList_Add failed" );
-            if(-1 == ImageList_Add(himl, img3.toWinHBITMAP(QPixmap::PremultipliedAlpha),mask3.toWinHBITMAP()))
-                msg_Err( p_intf, "ImageList_Add failed" );
-            if(-1 == ImageList_Add(himl, img4.toWinHBITMAP(QPixmap::PremultipliedAlpha),mask4.toWinHBITMAP()))
-                msg_Err( p_intf, "ImageList_Add failed" );
-        }
-
-        CoInitialize( 0 );
-
-        if( S_OK == CoCreateInstance( &clsid_ITaskbarList,
-                    NULL, CLSCTX_INPROC_SERVER,
-                    &IID_ITaskbarList3,
-                    (void **)&p_taskbl) )
-        {
-            p_taskbl->vt->HrInit(p_taskbl);
-
-            // Define an array of two buttons. These buttons provide images through an
-            // image list and also provide tooltips.
-            DWORD dwMask = THB_BITMAP | THB_FLAGS;
-
-            THUMBBUTTON thbButtons[3];
-            thbButtons[0].dwMask = dwMask;
-            thbButtons[0].iId = 0;
-            thbButtons[0].iBitmap = 0;
-            thbButtons[0].dwFlags = THBF_HIDDEN;
-
-            thbButtons[1].dwMask = dwMask;
-            thbButtons[1].iId = 1;
-            thbButtons[1].iBitmap = 2;
-            thbButtons[1].dwFlags = THBF_HIDDEN;
-
-            thbButtons[2].dwMask = dwMask;
-            thbButtons[2].iId = 2;
-            thbButtons[2].iBitmap = 3;
-            thbButtons[2].dwFlags = THBF_HIDDEN;
-
-            HRESULT hr = p_taskbl->vt->ThumbBarSetImageList(p_taskbl, winId(), himl );
-            if(S_OK != hr)
-                msg_Err( p_intf, "ThumbBarSetImageList failed with error %08x", hr );
-            else
-            {
-                hr = p_taskbl->vt->ThumbBarAddButtons(p_taskbl, winId(), 3, thbButtons);
-                if(S_OK != hr)
-                    msg_Err( p_intf, "ThumbBarAddButtons failed with error %08x", hr );
-            }
-            CONNECT( THEMIM->getIM(), statusChanged( int ), this, changeThumbbarButtons( int ) );
-            CONNECT( this, playPauseSignal(), THEMIM, togglePlayPause() );
-            CONNECT( this, prevSignal(), THEMIM, prev() );
-            CONNECT( this, nextSignal(), THEMIM, next() );
-            CONNECT( this, play(),  THEMIM, play() );
-            CONNECT( this, pause(),  THEMIM, pause() );
-            CONNECT( this, mute(),  ActionsManager::getInstance( p_intf ), toggleMuteAudio() );
-            CONNECT( this, volumeUp(),  ActionsManager::getInstance( p_intf ), AudioUp() );
-            CONNECT( this, volumeDown(),  ActionsManager::getInstance( p_intf ), AudioDown() );
-        }
-    }
-    else
-    {
-        himl = NULL;
-        p_taskbl = NULL;
-    }
-}
 
-bool MainInterface::winEvent ( MSG * msg, long * result )
-{
-    if (msg->message == taskbar_wmsg)
-    {
-        //We received the taskbarbuttoncreated, now we can really create th buttons
-        createTaskBarButtons();
-    }
+    CONNECT( THEMIM->getIM(), seekRequested( float ),
+             timeLabel, setDisplayPosition( float ) );
 
-    short cmd;
-    switch( msg->message )
-    {
-        case WM_COMMAND:
-            if (HIWORD(msg->wParam) == THBN_CLICKED)
-            {
-                switch(LOWORD(msg->wParam))
-                {
-                    case 0:
-                        emit prevSignal();
-                        break;
-                    case 1:
-                        emit playPauseSignal();
-                        break;
-                    case 2:
-                        emit nextSignal();
-                        break;
-                }
-            }
-            break;
-        case WM_APPCOMMAND:
-            cmd = GET_APPCOMMAND_LPARAM(msg->lParam);
-            switch(cmd)
-            {
-                case APPCOMMAND_MEDIA_PLAY_PAUSE:
-                    emit playPauseSignal();
-                    break;
-                case APPCOMMAND_MEDIA_PLAY:
-                    emit play();
-                    break;
-                case APPCOMMAND_MEDIA_PAUSE:
-                    emit pause();
-                    break;
-                case APPCOMMAND_MEDIA_PREVIOUSTRACK:
-                    emit prevSignal();
-                    break;
-                case APPCOMMAND_MEDIA_NEXTTRACK:
-                    emit nextSignal();
-                    break;
-                case APPCOMMAND_MEDIA_STOP:
-                    emit stop();
-                    break;
-                case APPCOMMAND_VOLUME_DOWN:
-                    emit volumeDown();
-                    break;
-                case APPCOMMAND_VOLUME_UP:
-                    emit volumeUp();
-                    break;
-                case APPCOMMAND_VOLUME_MUTE:
-                    emit mute();
-                    break;
-                default:
-                     msg_Dbg( p_intf, "unknown APPCOMMAND = %d", cmd);
-                     break;
-            }
-            break;
-    }
-    return false;
+    /* 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 );
 }
-#endif
 
 /**********************************************************************
  * Handling of sizing of the components
  **********************************************************************/
 
-/* This function is probably wrong, but we don't have many many choices...
-   Since we can't know from the playlist Widget if we are inside a dock or not,
-   because the playlist Widget can be called by THEDP, as a separate windows for
-   the skins.
-   Maybe the other solution is to redefine the sizeHint() of the playlist and
-   ask _parent->isFloating()...
-   If you think this would be better, please FIXME it...
-*/
-
-QSize MainInterface::sizeHint() const
-{
-#if 0
-    if( b_keep_size )
-    {
-        if( i_visualmode == QT_ALWAYS_VIDEO_MODE ||
-            i_visualmode == QT_MINIMAL_MODE )
-        {
-                return mainVideoSize;
-        }
-        else
-        {
-            if( VISIBLE( bgWidget) ||
-                ( videoIsActive && videoWidget->isVisible() )
-              )
-                return mainVideoSize;
-            else
-                return mainBasedSize;
-        }
-    }
-#endif
-
-    int nwidth  = __MAX( controls->sizeHint().width(),
-                         menuBar()->sizeHint().width() );
-
-    int nheight = controls->isVisible() ?
-                  controls->size().height()
-                  + inputC->size().height()
-                  + menuBar()->size().height()
-                  + statusBar()->size().height()
-                  : 0 ;
-
-    if( stackCentralW->isVisible() )
-        nheight += stackCentralW->height();
-        nwidth  = __MAX( nwidth, stackCentralW->width() );
-
-/*    if( VISIBLE( bgWidget ) )
-    {
-        msg_Warn( p_intf, "Hello here" );
-        if( i_bg_height )
-            nheight += i_bg_height;
-        else
-            nheight += bgWidget->size().height();
-        nwidth  = __MAX( nwidth, bgWidget->size().width() );
-    }
-    else if( videoIsActive && videoWidget->isVisible() )
-    {
-        msg_Warn( p_intf, "Hello there" );
-        nheight += videoWidget->sizeHint().height();
-        nwidth  = __MAX( nwidth, videoWidget->sizeHint().width() );
-    }*/
-#if 0
-    if( !dockPL->isFloating() && dockPL->isVisible() && dockPL->widget()  )
-    {
-        nheight += dockPL->size().height();
-        nwidth = __MAX( nwidth, dockPL->size().width() );
-        msg_Warn( p_intf, "3 %i %i", nheight, nwidth );
-    }
-#endif
-    return QSize( nwidth, nheight );
-}
-
-
-/* Video widget cannot do this synchronously as it runs in another thread */
-/* Well, could it, actually ? Probably dangerous ... */
-
-/* This function is called:
-   - toggling of minimal View
-   - through askUpdate() by Vout thread request video and resize video (zoom)
-   - Advanced buttons toggled
- */
-void MainInterface::doComponentsUpdate()
-{
-    if( isFullScreen() || isMaximized() ) return;
-
-//    msg_Warn( p_intf, "Updating the geometry" );
-    /* Here we resize to sizeHint() and not adjustsize because we want
-       the videoWidget to be exactly the correctSize */
-
-#ifndef NDEBUG
-    debug();
-#endif
-    /* This is WRONG, but I believe there is a Qt bug here */
-    setMinimumSize( 0, 0 );
-    resize( sizeHint() );
-
-    //adjustSize() ; /* This is not needed, but might help in the future */
-}
-
 void MainInterface::debug()
 {
-#ifndef NDEBUG
-    msg_Dbg( p_intf, "Stack Size: %i - %i", stackCentralW->size().height(), size().width() );
-    if( videoEmbeddedFlag )
-        msg_Dbg( p_intf, "Stack Size: %i - %i",
-                 stackCentralW->widget( VIDEO_TAB )->size().height(),
-                 stackCentralW->widget( VIDEO_TAB )->size().width() );
-    else
-        msg_Dbg( p_intf, "no embedded video" );
-
+#ifdef DEBUG_INTF
     msg_Dbg( p_intf, "size: %i - %i", size().height(), size().width() );
     msg_Dbg( p_intf, "sizeHint: %i - %i", sizeHint().height(), sizeHint().width() );
-    //msg_Dbg( p_intf, "maximumsize: %i - %i", maximumSize().height(), maximumSize().width() );
-
-    msg_Dbg( p_intf, "Stack minimumsize: %i - %i", stackCentralW->minimumSize().height(), stackCentralW->minimumSize().width() );
-    msg_Dbg( p_intf, "Controls minimumsize: %i - %i", controls->minimumSize().height(), controls->minimumSize().width() );
-    msg_Dbg( p_intf, "Central minimumsize: %i - %i", centralWidget()->minimumSize().height(), centralWidget()->minimumSize().width() );
-    msg_Dbg( p_intf, "Menu minimumsize: %i - %i", menuBar()->minimumSize().height(), menuBar()->minimumSize().width() );
-    msg_Dbg( p_intf, "Input minimuSize: %i - %i", inputC->minimumSize().height(), inputC->minimumSize().width() );
-    msg_Dbg( p_intf, "Status minimumsize: %i - %i", statusBar()->minimumSize().height(), statusBar()->minimumSize().width() );
     msg_Dbg( p_intf, "minimumsize: %i - %i", minimumSize().height(), minimumSize().width() );
 
-    /*if( videoWidget && videoWidget->isVisible() )
-    {
-        msg_Dbg( p_intf, "size: %i - %i", size().height(), size().width() );
-        msg_Dbg( p_intf, "sizeHint: %i - %i", sizeHint().height(), sizeHint().width() );
-    }*/
+    msg_Dbg( p_intf, "Stack size: %i - %i", stackCentralW->size().height(), stackCentralW->size().width() );
+    msg_Dbg( p_intf, "Stack sizeHint: %i - %i", stackCentralW->sizeHint().height(), stackCentralW->sizeHint().width() );
+    msg_Dbg( p_intf, "Central size: %i - %i", centralWidget()->size().height(), centralWidget()->size().width() );
 #endif
 }
 
-inline void MainInterface::showTab( int i_tab )
+inline void MainInterface::showVideo() { showTab( videoWidget ); }
+inline void MainInterface::restoreStackOldWidget()
+            { showTab( stackCentralOldWidget ); }
+
+inline void MainInterface::showTab( QWidget *widget )
 {
 #ifdef DEBUG_INTF
-    msg_Err( p_intf, "showTab %i", i_tab );
-    msg_Warn( p_intf, "Old stackCentralOldState %i", stackCentralOldState );
-#endif
-    stackCentralOldState = stackCentralW->isVisible() ? stackCentralW->currentIndex()
-                                          : HIDDEN_TAB;
-#ifdef DEBUG_INTF
-    msg_Warn( p_intf, "State change %i %i",  stackCentralW->currentIndex(), i_tab );
+    msg_Warn( p_intf, "Old stackCentralOldWidget %i", stackCentralW->indexOf( stackCentralOldWidget ) );
 #endif
 
-    if( i_visualmode == QT_NORMAL_MODE )
-    {
-        stackCentralW->setVisible( i_tab != HIDDEN_TAB );
-        doComponentsUpdate(); // resize the player
-    }
-    else
-        if( i_tab == HIDDEN_TAB ) i_tab == BACKG_TAB;
+    stackCentralOldWidget = stackCentralW->currentWidget();
+    stackWidgetsSizes[stackCentralOldWidget] = stackCentralW->size();
 
-    stackCentralW->setCurrentIndex( i_tab );
+    stackCentralW->setCurrentWidget( widget );
+    if( b_autoresize )
+        resizeStack( stackWidgetsSizes[widget].width(), stackWidgetsSizes[widget].height() );
 
 #ifdef DEBUG_INTF
-    msg_Warn( p_intf, "New stackCentralOldState %i", stackCentralOldState );
+    msg_Warn( p_intf, "State change %i",  stackCentralW->currentIndex() );
+    msg_Warn( p_intf, "New stackCentralOldWidget %i", stackCentralW->indexOf( stackCentralOldWidget ) );
 #endif
 }
 
-inline void MainInterface::restoreStackOldWidget()
+void MainInterface::destroyPopupMenu()
 {
-#ifdef DEBUG_INTF
-    msg_Warn( p_intf, "Old stackCentralOldState %i", stackCentralOldState );
-#endif
-    int temp = stackCentralW->isVisible() ? stackCentralW->currentIndex()
-                                          : HIDDEN_TAB;
-    stackCentralW->setCurrentIndex( stackCentralOldState );
-    if( i_visualmode == QT_NORMAL_MODE )
-    {
-        stackCentralW->setVisible( stackCentralOldState != HIDDEN_TAB );
-        doComponentsUpdate(); // resize the player
-    }
-
-    stackCentralOldState = temp;
-#ifdef DEBUG_INTF
-    msg_Warn( p_intf, "Debug %i %i", temp, stackCentralW->currentIndex() );
-#endif
+    QVLCMenu::PopupMenu( p_intf, false );
 }
 
-void MainInterface::destroyPopupMenu()
+void MainInterface::popupMenu( const QPoint &p )
 {
-    QVLCMenu::PopupMenu( p_intf, false );
+    QVLCMenu::PopupMenu( p_intf, true );
 }
 
 void MainInterface::toggleFSC()
@@ -863,37 +536,13 @@ void MainInterface::toggleFSC()
    QApplication::postEvent( fullscreenControls, eShow );
 }
 
-void MainInterface::popupMenu( const QPoint &p )
-{
-    /* Ow, that's ugly: don't show the popup menu if cursor over
-     * the main menu bar or the status bar */
-    if( !childAt( p ) || ( ( childAt( p ) != menuBar() )
-                        && ( childAt( p )->parentWidget() != statusBar() ) ) )
-        QVLCMenu::PopupMenu( p_intf, true );
-}
-
 /****************************************************************************
  * 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 note change the state of this object or other Qt4 UI objects,
+ * You must not change the state of this object or other Qt4 UI objects,
  * from the video output thread - only from the Qt4 UI main loop thread.
  * All window provider queries must be handled through signals or events.
  * That's why we have all those emit statements...
@@ -916,66 +565,124 @@ void MainInterface::getVideoSlot( WId *p_id, int *pi_x, int *pi_y,
 {
     /* Request the videoWidget */
     WId ret = videoWidget->request( pi_x, pi_y,
-                                    pi_width, pi_height, b_keep_size );
+                                    pi_width, pi_height, !b_autoresize );
     *p_id = ret;
     if( ret ) /* The videoWidget is available */
     {
-        /* ask videoWidget to show */
-        videoWidget->SetSizing( *pi_width, *pi_height );
-
         /* Consider the video active now */
         showVideo();
 
-        stackCentralW->resize( *pi_width, *pi_height );
-
-        emit askUpdate();
+        /* Ask videoWidget to resize correctly, if we are in normal mode */
+        if( !isFullScreen() && !isMaximized() && b_autoresize )
+            videoWidget->SetSizing( *pi_width, *pi_height );
     }
 }
 
-
-
 /* Asynchronous call from the WindowClose function */
 void MainInterface::releaseVideo( void )
 {
-    emit askReleaseVideo( );
+    emit askReleaseVideo();
 }
 
 /* Function that is CONNECTED to the previous emit */
 void MainInterface::releaseVideoSlot( void )
 {
-    videoWidget->release( );
+    videoWidget->release();
+    setVideoOnTop( false );
+    setVideoFullScreen( false );
+
+    if( stackCentralW->currentWidget() == videoWidget )
+        restoreStackOldWidget();
+
+    /* We don't want to have a blank video to popup */
+    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 )
+{
+    b_videoOnTop = on_top;
 
-    restoreStackOldWidget();
+    Qt::WindowFlags oldflags = windowFlags(), newflags;
 
-    /* Try to resize, except when you are in Fullscreen mode */
-//    doComponentsUpdate();
+    if( b_videoOnTop )
+        newflags = oldflags | Qt::WindowStaysOnTopHint;
+    else
+        newflags = oldflags & ~Qt::WindowStaysOnTopHint;
+
+    if( newflags != oldflags )
+    {
+        setWindowFlags( newflags );
+        show(); /* necessary to apply window flags */
+    }
 }
 
 /* Asynchronous call from WindowControl function */
 int MainInterface::controlVideo( int i_query, va_list args )
 {
-    /* Debug to check if VOUT_WINDOW_SET_SIZE is called, because this is broken now */
-    msg_Warn( p_intf, "Control Video: %i", i_query );
     switch( i_query )
     {
     case VOUT_WINDOW_SET_SIZE:
     {
         unsigned int i_width  = va_arg( args, unsigned int );
         unsigned int i_height = va_arg( args, unsigned int );
+
         emit askVideoToResize( i_width, i_height );
-        emit askUpdate();
-        return VLC_EGENERIC;
+        return VLC_SUCCESS;
     }
     case VOUT_WINDOW_SET_STATE:
     {
         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;
     }
@@ -991,16 +698,20 @@ int MainInterface::controlVideo( int i_query, va_list args )
 /**
  * Toggle the playlist widget or dialog
  **/
-void MainInterface::createPlaylist( bool b_show )
+void MainInterface::createPlaylist()
 {
     playlistWidget = new PlaylistWidget( p_intf, this );
 
-    i_pl_dock = PL_BOTTOM;
-    /* i_pl_dock = (pl_dock_e)getSettings()
-      ->value( "pl-dock-status", PL_UNDOCKED ).toInt(); */
-
-    if( i_pl_dock == PL_UNDOCKED )
+    if( b_plDocked )
     {
+        stackCentralW->addWidget( playlistWidget );
+        stackWidgetsSizes[playlistWidget] = settings->value( "playlistSize", QSize( 500, 250 ) ).toSize();
+    }
+    else
+    {
+#ifdef WIN32
+        playlistWidget->setParent( NULL );
+#endif
         playlistWidget->setWindowFlags( Qt::Window );
 
         /* This will restore the geometry but will not work for position,
@@ -1008,100 +719,101 @@ void MainInterface::createPlaylist( bool b_show )
         QVLCTools::restoreWidgetPosition( p_intf, "Playlist",
                 playlistWidget, QSize( 600, 300 ) );
     }
-    else
-    {
-#ifdef DEBUG_INTF
-        msg_Warn( p_intf, "Here %i", stackCentralW->currentIndex() );
-#endif
-        stackCentralW->insertWidget( PLAYL_TAB, playlistWidget );
-#ifdef DEBUG_INTF
-        msg_Warn( p_intf, "Here %i", stackCentralW->currentIndex() );
-#endif
-    }
-
-    if( b_show )
-    {
-        playlistVisible = true;
-        stackCentralW->show();
-    }
 }
 
 void MainInterface::togglePlaylist()
 {
-#ifdef DEBUG_INTF
-    msg_Warn( p_intf, "Here toggling %i %i", stackCentralW->currentIndex(), stackCentralOldState );
-#endif
     if( !playlistWidget )
     {
-        createPlaylist( true );
+        createPlaylist();
     }
-#ifdef DEBUG_INTF
-    msg_Warn( p_intf, "Here toggling %i %i", stackCentralW->currentIndex(), stackCentralOldState );
 
-#endif
-    if( i_pl_dock != PL_UNDOCKED )
+    if( b_plDocked )
     {
-        /* Playlist not visible */
-        if( stackCentralW->currentIndex() != PLAYL_TAB )
+        /* Playlist is not visible, show it */
+        if( stackCentralW->currentWidget() != playlistWidget )
         {
-            showTab( PLAYL_TAB );
-            stackCentralW->show();
+            showTab( playlistWidget );
         }
-        else
+        else /* Hide it! */
         {
             restoreStackOldWidget();
         }
-        playlistVisible = ( stackCentralW->currentIndex() == PLAYL_TAB );
-        //doComponentsUpdate(); //resize( sizeHint() );
+        playlistVisible = ( stackCentralW->currentWidget() == playlistWidget );
     }
+    else
+    {
+#ifdef WIN32
+        playlistWidget->setParent( NULL );
+#endif
+        playlistWidget->setWindowFlags( Qt::Window );
+        playlistVisible = !playlistVisible;
+        playlistWidget->setVisible( playlistVisible );
+    }
+    debug();
 }
 
-/* Function called from the menu to undock the playlist */
-void MainInterface::undockPlaylist()
+void MainInterface::dockPlaylist( bool p_docked )
 {
-//    dockPL->setFloating( true );
-//    adjustSize();
+    if( b_plDocked == p_docked ) return;
+    b_plDocked = p_docked;
+
+    if( !playlistWidget ) return; /* Playlist wasn't created yet */
+    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 ) );
+        playlistWidget->show();
+        restoreStackOldWidget();
+    }
+    else
+    {
+        QVLCTools::saveWidgetPosition( p_intf, "Playlist", playlistWidget );
+        playlistWidget->setWindowFlags( Qt::Widget ); // Probably a Qt bug here
+        // It would be logical that QStackWidget::addWidget reset the flags...
+        stackCentralW->addWidget( playlistWidget );
+        showTab( playlistWidget );
+    }
+    playlistVisible = true;
 }
 
-void MainInterface::dockPlaylist( pl_dock_e i_pos )
+void MainInterface::setMinimalView( bool b_minimal )
 {
+    menuBar()->setVisible( !b_minimal );
+    controls->setVisible( !b_minimal );
+    statusBar()->setVisible( !b_minimal );
+    inputC->setVisible( !b_minimal );
 }
 
-void MainInterface::toggleMinimalView( bool b_switch )
+/*
+  If b_minimal is false, then we are normalView
+ */
+void MainInterface::toggleMinimalView( bool b_minimal )
 {
-    if( i_visualmode != QT_ALWAYS_VIDEO_MODE &&
-        i_visualmode != QT_MINIMAL_MODE )
-    { /* NORMAL MODE then */
-        stackCentralW->show();
-        if( !videoWidget || stackCentralW->currentIndex() != VIDEO_TAB )
-        {
-            showBg();
-        }
-        else
+    if( !b_minimalView && b_autoresize ) /* Normal mode */
+    {
+        if( stackCentralW->currentWidget() == bgWidget )
         {
-            /* If video is visible, then toggle the status of bgWidget */
-            //bgWasVisible = !bgWasVisible;
-            if( stackCentralOldState == BACKG_TAB )
-                stackCentralOldState = HIDDEN_TAB;
-            else
-                stackCentralOldState = BACKG_TAB;
+            if( stackCentralW->height() < 16 )
+            {
+                resizeStack( stackCentralW->width(), 100 );
+            }
         }
     }
+    b_minimalView = b_minimal;
+    if( !b_videoFullScreen )
+        setMinimalView( b_minimalView );
 
-    i_bg_height = stackCentralW->height();
-
-    menuBar()->setVisible( !b_switch );
-    controls->setVisible( !b_switch );
-    statusBar()->setVisible( !b_switch );
-    inputC->setVisible( !b_switch );
-
-    doComponentsUpdate();
-
-    emit minimalViewToggled( b_switch );
+    emit minimalViewToggled( b_minimalView );
 }
 
 /* toggling advanced controls buttons */
-void MainInterface::toggleAdvanced()
+void MainInterface::toggleAdvancedButtons()
 {
     controls->toggleAdvanced();
 //    if( fullscreenControls ) fullscreenControls->toggleAdvanced();
@@ -1110,6 +822,7 @@ void MainInterface::toggleAdvanced()
 /* Get the visibility status of the controls (hidden or not, advanced or not) */
 int MainInterface::getControlsVisibilityStatus()
 {
+    if( !controls ) return 0;
     return( (controls->isVisible() ? CONTROLS_VISIBLE : CONTROLS_HIDDEN )
                 + CONTROLS_ADVANCED * controls->b_advancedVisible );
 }
@@ -1132,7 +845,6 @@ void MainInterface::visual()
         visualSelector->hide();
         visualSelectorEnabled = false;
     }
-    doComponentsUpdate();
 }
 #endif
 
@@ -1178,6 +890,12 @@ void MainInterface::showCryptedLabel( bool b_show )
     cryptedLabel->setVisible( b_show );
 }
 
+void MainInterface::showBuffering( float f_cache )
+{
+    QString amount = QString("Buffering: %1%").arg( (int)(100*f_cache) );
+    statusBar()->showMessage( amount, 1000 );
+}
+
 /*****************************************************************************
  * Systray Icon and Systray Menu
  *****************************************************************************/
@@ -1261,7 +979,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" ),
@@ -1286,7 +1008,7 @@ void MainInterface::updateSystrayTooltipName( const QString& name )
     else
     {
         sysTray->setToolTip( name );
-        if( notificationEnabled && ( isHidden() || isMinimized() ) )
+        if( b_notificationEnabled && ( isHidden() || isMinimized() ) )
         {
             sysTray->showMessage( qtr( "VLC media player" ), name,
                     QSystemTrayIcon::NoIcon, 3000 );
@@ -1304,23 +1026,15 @@ void MainInterface::updateSystrayTooltipStatus( int i_status )
 {
     switch( i_status )
     {
-        case  0:
-        case  END_S:
-            {
-                sysTray->setToolTip( qtr( "VLC media player" ) );
-                break;
-            }
-        case PLAYING_S:
-            {
-                sysTray->setToolTip( input_name );
-                break;
-            }
-        case PAUSE_S:
-            {
-                sysTray->setToolTip( input_name + " - "
-                        + qtr( "Paused") );
-                break;
-            }
+    case PLAYING_S:
+        sysTray->setToolTip( input_name );
+        break;
+    case PAUSE_S:
+        sysTray->setToolTip( input_name + " - " + qtr( "Paused") );
+        break;
+    default:
+        sysTray->setToolTip( qtr( "VLC media player" ) );
+        break;
     }
     QVLCMenu::updateSystrayMenu( this, p_intf );
 }
@@ -1336,8 +1050,9 @@ 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();
@@ -1357,18 +1072,30 @@ 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) );
+        if( url.isValid() )
+        {
+            char* psz_uri = make_URI( qtu( url.toString() ), NULL );
             playlist_Add( THEPL, psz_uri, 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() )
+    {
+        char *psz_uri = make_URI( qtu( mimeData->text() ), NULL );
+        playlist_Add( THEPL, psz_uri, NULL,
+                      PLAYLIST_APPEND | (first ? PLAYLIST_GO: PLAYLIST_PREPARSE),
+                      PLAYLIST_END, true, pl_Unlocked );
+        free( psz_uri );
+    }
     event->accept();
 }
 void MainInterface::dragEnterEvent(QDragEnterEvent *event)
@@ -1387,30 +1114,6 @@ void MainInterface::dragLeaveEvent(QDragLeaveEvent *event)
 /************************************************************************
  * Events stuff
  ************************************************************************/
-void MainInterface::customEvent( QEvent *event )
-{
-#if 0
-    if( event->type() == PLDockEvent_Type )
-    {
-        PlaylistDialog::killInstance();
-        playlistEmbeddedFlag = true;
-        menuBar()->clear();
-        QVLCMenu::createMenuBar(this, p_intf, true, visualSelectorEnabled);
-        togglePlaylist();
-    }
-#endif
-    /*else */
-    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 );
@@ -1418,10 +1121,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();
     }
 
@@ -1435,31 +1137,6 @@ void MainInterface::handleKeyPress( QKeyEvent *e )
         e->ignore();
 }
 
-void MainInterface::resizeEvent( QResizeEvent * event )
-{
-#if 0
-    if( b_keep_size )
-    {
-        if( i_visualmode == QT_ALWAYS_VIDEO_MODE ||
-            i_visualmode == QT_MINIMAL_MODE )
-        {
-                mainVideoSize = size();
-        }
-        else
-        {
-            if( VISIBLE( bgWidget) ||
-                ( videoIsActive && videoWidget->isVisible() )
-              )
-                mainVideoSize = size();
-            else
-                mainBasedSize = size();
-        }
-    }
-#endif
-    QVLCMW::resizeEvent( event );
-    msg_Dbg( p_intf, "Resize Event, height: %i", size().height() );
-}
-
 void MainInterface::wheelEvent( QWheelEvent *e )
 {
     int i_vlckey = qtWheelEventToVLCKey( e );
@@ -1474,72 +1151,19 @@ void MainInterface::closeEvent( QCloseEvent *e )
     THEDP->quit();
 }
 
-void MainInterface::toggleFullScreen( void )
+void MainInterface::setInterfaceFullScreen( bool fs )
 {
-    if( isFullScreen() )
-    {
-        showNormal();
-        emit askUpdate(); // Needed if video was launched after the F11
-        emit fullscreenInterfaceToggled( false );
-    }
+    if( fs )
+        setWindowState( windowState() | Qt::WindowFullScreen );
     else
-    {
-        showFullScreen();
-        emit fullscreenInterfaceToggled( true );
-    }
-
+        setWindowState( windowState() & ~Qt::WindowFullScreen );
 }
-
-//moc doesn't know about #ifdef, so we have to build this method for every platform
-void MainInterface::changeThumbbarButtons( int i_status)
+void MainInterface::toggleInterfaceFullScreen()
 {
-#ifdef WIN32
-    // Define an array of three buttons. These buttons provide images through an
-    // image list and also provide tooltips.
-    DWORD dwMask = THB_BITMAP | THB_FLAGS;
-
-    THUMBBUTTON thbButtons[3];
-    //prev
-    thbButtons[0].dwMask = dwMask;
-    thbButtons[0].iId = 0;
-    thbButtons[0].iBitmap = 0;
-
-    //play/pause
-    thbButtons[1].dwMask = dwMask;
-    thbButtons[1].iId = 1;
-
-    //next
-    thbButtons[2].dwMask = dwMask;
-    thbButtons[2].iId = 2;
-    thbButtons[2].iBitmap = 3;
-
-    switch( i_status )
-    {
-        case PLAYING_S:
-            {
-                thbButtons[0].dwFlags = THBF_ENABLED;
-                thbButtons[1].dwFlags = THBF_ENABLED;
-                thbButtons[2].dwFlags = THBF_ENABLED;
-                thbButtons[1].iBitmap = 1;
-                break;
-            }
-        case PAUSE_S:
-            {
-                thbButtons[0].dwFlags = THBF_ENABLED;
-                thbButtons[1].dwFlags = THBF_ENABLED;
-                thbButtons[2].dwFlags = THBF_ENABLED;
-                thbButtons[1].iBitmap = 2;
-                break;
-            }
-        default:
-            return;
-    }
-    HRESULT hr =  p_taskbl->vt->ThumbBarUpdateButtons(p_taskbl, this->winId(), 3, thbButtons);
-    if(S_OK != hr)
-        msg_Err( p_intf, "ThumbBarUpdateButtons failed with error %08x", hr );
-#else
-    ;
-#endif
+    b_interfaceFullScreen = !b_interfaceFullScreen;
+    if( !b_videoFullScreen )
+        setInterfaceFullScreen( b_interfaceFullScreen );
+    emit fullscreenInterfaceToggled( b_interfaceFullScreen );
 }
 
 /*****************************************************************************