[vlc-commits] qt: Make main_interface_win32 a subclass of main_interface

Hugo Beauzée-Luyssen git at videolan.org
Thu Dec 29 16:04:32 CET 2016


vlc | branch: master | Hugo Beauzée-Luyssen <hugo at beauzee.fr> | Thu Dec 29 14:30:29 2016 +0100| [2c8fd86a3d146dde54ef9769aa405cd24ac07e9e] | committer: Hugo Beauzée-Luyssen

qt: Make main_interface_win32 a subclass of main_interface

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2c8fd86a3d146dde54ef9769aa405cd24ac07e9e
---

 modules/gui/qt/Makefile.am              |  6 ++-
 modules/gui/qt/main_interface.cpp       | 71 +++-------------------------
 modules/gui/qt/main_interface.hpp       | 29 ++----------
 modules/gui/qt/main_interface_win32.cpp | 83 +++++++++++++++++++++++++++++----
 modules/gui/qt/main_interface_win32.hpp | 62 ++++++++++++++++++++++++
 modules/gui/qt/qt.cpp                   | 10 +++-
 6 files changed, 161 insertions(+), 100 deletions(-)

diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am
index bf3d98b..7e5f5ae 100644
--- a/modules/gui/qt/Makefile.am
+++ b/modules/gui/qt/Makefile.am
@@ -120,7 +120,7 @@ libqt_plugin_la_SOURCES = \
 	util/singleton.hpp \
 	styles/seekstyle.cpp styles/seekstyle.hpp
 if HAVE_WIN32
-libqt_plugin_la_SOURCES += main_interface_win32.cpp
+libqt_plugin_la_SOURCES += main_interface_win32.cpp main_interface_win32.hpp
 endif
 
 # Meta-object compilation
@@ -207,6 +207,10 @@ nodist_libqt_plugin_la_SOURCES = \
 	util/buttons/BrowseButton.moc.cpp \
 	styles/seekstyle.moc.cpp
 
+if HAVE_WIN32
+nodist_libqt_plugin_la_SOURCES += main_interface_win32.moc.cpp
+endif
+
 nodist_libqt_plugin_la_SOURCES += \
 	ui/equalizer.h \
 	ui/video_effects.h \
diff --git a/modules/gui/qt/main_interface.cpp b/modules/gui/qt/main_interface.cpp
index 2c91e7a..894da7a 100644
--- a/modules/gui/qt/main_interface.cpp
+++ b/modules/gui/qt/main_interface.cpp
@@ -65,12 +65,6 @@
 #include <vlc_keys.h>                       /* Wheel event */
 #include <vlc_vout_display.h>               /* vout_thread_t and VOUT_ events */
 
-
-#if defined(_WIN32) && HAS_QT5
-#include <QWindow>
-#include <qpa/qplatformnativeinterface.h>
-#endif
-
 // #define DEBUG_INTF
 
 /* Callback prototypes */
@@ -143,11 +137,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     /* Set the other interface settings */
     settings = getSettings();
 
-#ifdef _WIN32
-    /* Volume keys */
-    p_intf->p_sys->disable_volume_keys = var_InheritBool( p_intf, "qt-disable-volume-keys" );
-#endif
-
     /* */
     b_plDocked = getSettings()->value( "MainWindow/pl-dock-status", true ).toBool();
 
@@ -172,14 +161,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     createStatusBar();
     setStatusBarVisibility( getSettings()->value( "MainWindow/status-bar-visible", false ).toBool() );
 
-#ifdef _WIN32
-    himl = NULL;
-    p_taskbl = NULL;
-    taskbar_wmsg = RegisterWindowMessage(TEXT("TaskbarButtonCreated"));
-    if (taskbar_wmsg == 0)
-        msg_Warn( p_intf, "Failed to register TaskbarButtonCreated message" );
-#endif
-
     /*********************************
      * Create the Systray Management *
      *********************************/
@@ -278,14 +259,6 @@ MainInterface::~MainInterface()
     if( videoWidget )
         releaseVideoSlot();
 
-#ifdef _WIN32
-    if( himl )
-        ImageList_Destroy( himl );
-    if(p_taskbl)
-        p_taskbl->Release();
-    CoUninitialize();
-#endif
-
     /* Be sure to kill the actionsManager... Only used in the MI and control */
     ActionsManager::killInstance();
 
@@ -362,9 +335,6 @@ void MainInterface::reloadPrefs()
 {
     i_notificationSetting = var_InheritInteger( p_intf, "qt-notification" );
     b_pauseOnMinimize = var_InheritBool( p_intf, "qt-pause-minimized" );
-#ifdef _WIN32
-    p_intf->p_sys->disable_volume_keys = var_InheritBool( p_intf, "qt-disable-volume-keys" );
-#endif
     if( !var_InheritBool( p_intf, "qt-fs-controller" ) && fullscreenControls )
     {
         delete fullscreenControls;
@@ -864,9 +834,6 @@ void MainInterface::setVideoFullScreen( bool fs )
          * qt-fullscreen-screennumber is forced) */
         setMinimalView( b_minimalView );
         setInterfaceFullScreen( b_interfaceFullScreen );
-#ifdef _WIN32
-        changeThumbbarButtons( THEMIM->getIM()->playingStatus() );
-#endif
     }
     videoWidget->sync();
 }
@@ -1257,6 +1224,11 @@ void MainInterface::createSystray()
              this, updateSystrayTooltipStatus( int ) );
 }
 
+void MainInterface::toggleUpdateSystrayMenuWhenVisible()
+{
+    hide();
+}
+
 /**
  * Updates the Systray Icon's menu and toggle the main interface
  */
@@ -1277,38 +1249,7 @@ void MainInterface::toggleUpdateSystrayMenu()
     else
     {
         /* Visible (possibly under other windows) */
-#ifdef _WIN32
-        /* check if any visible window is above vlc in the z-order,
-         * but ignore the ones always on top
-         * and the ones which can't be activated */
-        HWND winId;
-#if HAS_QT5
-        QWindow *window = windowHandle();
-        winId = static_cast<HWND>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow("handle", window));
-#else
-        winId = internalWinId();
-#endif
-
-        WINDOWINFO wi;
-        HWND hwnd;
-        wi.cbSize = sizeof( WINDOWINFO );
-        for( hwnd = GetNextWindow( winId, GW_HWNDPREV );
-                hwnd && ( !IsWindowVisible( hwnd ) ||
-                    ( GetWindowInfo( hwnd, &wi ) &&
-                      (wi.dwExStyle&WS_EX_NOACTIVATE) ) );
-                hwnd = GetNextWindow( hwnd, GW_HWNDPREV ) );
-            if( !hwnd || !GetWindowInfo( hwnd, &wi ) ||
-                (wi.dwExStyle&WS_EX_TOPMOST) )
-            {
-                hide();
-            }
-            else
-            {
-                activateWindow();
-            }
-#else
-        hide();
-#endif // _WIN32
+        toggleUpdateSystrayMenuWhenVisible();
     }
     if( sysTray )
         VLCMenuBar::updateSystrayMenu( this, p_intf );
diff --git a/modules/gui/qt/main_interface.hpp b/modules/gui/qt/main_interface.hpp
index a69eac7..02c0fd9 100644
--- a/modules/gui/qt/main_interface.hpp
+++ b/modules/gui/qt/main_interface.hpp
@@ -92,12 +92,6 @@ public:
 protected:
     void dropEventPlay( QDropEvent* event, bool b_play ) { dropEventPlay(event, b_play, true); }
     void dropEventPlay( QDropEvent *, bool, bool );
-#ifdef _WIN32
-#if HAS_QT5
-    virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result);
-#endif
-    virtual bool winEvent( MSG *, long * );
-#endif
     void changeEvent( QEvent * ) Q_DECL_OVERRIDE;
     void dropEvent( QDropEvent *) Q_DECL_OVERRIDE;
     void dragEnterEvent( QDragEnterEvent * ) Q_DECL_OVERRIDE;
@@ -107,8 +101,9 @@ protected:
     void keyPressEvent( QKeyEvent *) Q_DECL_OVERRIDE;
     void wheelEvent( QWheelEvent * ) Q_DECL_OVERRIDE;
     bool eventFilter(QObject *, QEvent *) Q_DECL_OVERRIDE;
+    virtual void toggleUpdateSystrayMenuWhenVisible();
 
-private:
+protected:
     /* Main Widgets Creation */
     void createMainWidget( QSettings* );
     void createStatusBar();
@@ -184,14 +179,6 @@ private:
     bool                 b_hasPausedWhenMinimized;
     bool                 b_statusbarVisible;
 
-#ifdef _WIN32
-    HWND WinId( QWidget *);
-    HIMAGELIST himl;
-    ITaskbarList3 *p_taskbl;
-    UINT taskbar_wmsg;
-    void createTaskBarButtons();
-#endif
-
     static const Qt::Key kc[10]; /* easter eggs */
     int i_kc_offset;
 
@@ -209,12 +196,6 @@ public slots:
     void setStatusBarVisibility(bool b_visible);
     void setPlaylistVisibility(bool b_visible);
 
-#ifdef _WIN32
-    void changeThumbbarButtons( int );
-    void playlistItemAppended( int itemId, int parentId );
-    void playlistItemRemoved( int itemId );
-#endif
-
     /* Manage the Video Functions from the vout threads */
     void getVideoSlot( WId *p_id, struct vout_window_t *,
                        unsigned *pi_width, unsigned *pi_height, bool );
@@ -223,10 +204,10 @@ public slots:
     void emitBoss();
     void emitRaise();
 
-    void reloadPrefs();
+    virtual void reloadPrefs();
     void toolBarConfUpdated();
 
-private slots:
+protected slots:
     void debug();
     void recreateToolbars();
     void setName( const QString& );
@@ -259,7 +240,7 @@ private slots:
 
     void setVideoSize( unsigned int, unsigned int );
     void videoSizeChanged( int, int );
-    void setVideoFullScreen( bool );
+    virtual void setVideoFullScreen( bool );
     void setHideMouse( bool );
     void setVideoOnTop( bool );
     void setBoss();
diff --git a/modules/gui/qt/main_interface_win32.cpp b/modules/gui/qt/main_interface_win32.cpp
index 7eef3cc..8aacbc5 100644
--- a/modules/gui/qt/main_interface_win32.cpp
+++ b/modules/gui/qt/main_interface_win32.cpp
@@ -5,6 +5,7 @@
  * $Id$
  *
  * Authors: Jean-Baptiste Kempf <jb at videolan.org>
+ *          Hugo Beauzée-Luyssen <hugo at beauzee.fr>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,8 +22,11 @@
  * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
 
-#include "main_interface.hpp"
+#include "main_interface_win32.hpp"
 
 #include "input_manager.hpp"
 #include "actions_manager.hpp"
@@ -38,7 +42,6 @@
 # include <qpa/qplatformnativeinterface.h>
 #endif
 
-
 #define WM_APPCOMMAND 0x0319
 
 #define APPCOMMAND_VOLUME_MUTE            8
@@ -80,7 +83,28 @@
 #define GET_FLAGS_LPARAM(lParam)      (LOWORD(lParam))
 #define GET_KEYSTATE_LPARAM(lParam)   GET_FLAGS_LPARAM(lParam)
 
-HWND MainInterface::WinId( QWidget *w )
+MainInterfaceWin32::MainInterfaceWin32( intf_thread_t *_p_intf )
+    : MainInterface( _p_intf )
+    , himl( NULL )
+    , p_taskbl( NULL )
+{
+    /* Volume keys */
+    _p_intf->p_sys->disable_volume_keys = var_InheritBool( _p_intf, "qt-disable-volume-keys" );
+    taskbar_wmsg = RegisterWindowMessage(TEXT("TaskbarButtonCreated"));
+    if (taskbar_wmsg == 0)
+        msg_Warn( p_intf, "Failed to register TaskbarButtonCreated message" );
+}
+
+MainInterfaceWin32::~MainInterfaceWin32()
+{
+    if( himl )
+        ImageList_Destroy( himl );
+    if(p_taskbl)
+        p_taskbl->Release();
+    CoUninitialize();
+}
+
+HWND MainInterfaceWin32::WinId( QWidget *w )
 {
 #if HAS_QT5
     if( w && w->windowHandle() )
@@ -109,7 +133,7 @@ enum HBitmapFormat
 };
 #endif
 
-void MainInterface::createTaskBarButtons()
+void MainInterfaceWin32::createTaskBarButtons()
 {
     /*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
@@ -203,13 +227,13 @@ void MainInterface::createTaskBarButtons()
 }
 
 #if HAS_QT5
-bool MainInterface::nativeEvent(const QByteArray &, void *message, long *result)
+bool MainInterfaceWin32::nativeEvent(const QByteArray &, void *message, long *result)
 {
     return winEvent( static_cast<MSG*>( message ), result );
 }
 #endif
 
-bool MainInterface::winEvent ( MSG * msg, long * result )
+bool MainInterfaceWin32::winEvent ( MSG * msg, long * result )
 {
     if (msg->message == taskbar_wmsg)
     {
@@ -307,17 +331,58 @@ bool MainInterface::winEvent ( MSG * msg, long * result )
     return false;
 }
 
-void MainInterface::playlistItemAppended( int, int )
+void MainInterfaceWin32::setVideoFullScreen( bool fs )
+{
+    MainInterface::setVideoFullScreen( fs );
+    if( !fs )
+        changeThumbbarButtons( THEMIM->getIM()->playingStatus() );
+}
+
+void MainInterfaceWin32::toggleUpdateSystrayMenuWhenVisible()
+{
+    /* check if any visible window is above vlc in the z-order,
+     * but ignore the ones always on top
+     * and the ones which can't be activated */
+    HWND winId;
+#if HAS_QT5
+    QWindow *window = windowHandle();
+    winId = static_cast<HWND>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow("handle", window));
+#else
+    winId = internalWinId();
+#endif
+
+    WINDOWINFO wi;
+    HWND hwnd;
+    wi.cbSize = sizeof( WINDOWINFO );
+    for( hwnd = GetNextWindow( winId, GW_HWNDPREV );
+            hwnd && ( !IsWindowVisible( hwnd ) || ( GetWindowInfo( hwnd, &wi ) &&
+                                                    ( wi.dwExStyle&WS_EX_NOACTIVATE ) ) );
+            hwnd = GetNextWindow( hwnd, GW_HWNDPREV ) )
+    {
+    }
+    if( !hwnd || !GetWindowInfo( hwnd, &wi ) || (wi.dwExStyle&WS_EX_TOPMOST) )
+        hide();
+    else
+        activateWindow();
+}
+
+void MainInterfaceWin32::reloadPrefs()
+{
+    p_intf->p_sys->disable_volume_keys = var_InheritBool( p_intf, "qt-disable-volume-keys" );
+    MainInterface::reloadPrefs();
+}
+
+void MainInterfaceWin32::playlistItemAppended( int, int )
 {
     changeThumbbarButtons( THEMIM->getIM()->playingStatus() );
 }
 
-void MainInterface::playlistItemRemoved( int )
+void MainInterfaceWin32::playlistItemRemoved( int )
 {
     changeThumbbarButtons( THEMIM->getIM()->playingStatus() );
 }
 
-void MainInterface::changeThumbbarButtons( int i_status )
+void MainInterfaceWin32::changeThumbbarButtons( int i_status )
 {
     if( p_taskbl == NULL )
         return;
diff --git a/modules/gui/qt/main_interface_win32.hpp b/modules/gui/qt/main_interface_win32.hpp
new file mode 100644
index 0000000..676ddd9
--- /dev/null
+++ b/modules/gui/qt/main_interface_win32.hpp
@@ -0,0 +1,62 @@
+/*****************************************************************************
+ * main_interface_win32.cpp : Main interface
+ ****************************************************************************
+ * Copyright (C) 2006-2010 VideoLAN and AUTHORS
+ * $Id$
+ *
+ * Authors: Jean-Baptiste Kempf <jb at videolan.org>
+ *          Hugo Beauzée-Luyssen <hugo at beauzee.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * 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.
+ *****************************************************************************/
+
+#ifndef MAIN_INTERFACE_WIN32_HPP
+#define MAIN_INTERFACE_WIN32_HPP
+
+#include "main_interface.hpp"
+
+class MainInterfaceWin32 : public MainInterface
+{
+    Q_OBJECT
+
+public:
+    MainInterfaceWin32( intf_thread_t *p_intf );
+    virtual ~MainInterfaceWin32();
+
+private:
+#if HAS_QT5
+    virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE;
+#endif
+    virtual bool winEvent( MSG *, long * );
+    virtual void toggleUpdateSystrayMenuWhenVisible() Q_DECL_OVERRIDE;
+
+private:
+    HWND WinId( QWidget *);
+    void createTaskBarButtons();
+
+private:
+    HIMAGELIST himl;
+    ITaskbarList3 *p_taskbl;
+    UINT taskbar_wmsg;
+
+private slots:
+    void changeThumbbarButtons( int );
+    void playlistItemAppended( int itemId, int parentId );
+    void playlistItemRemoved( int itemId );
+    virtual void reloadPrefs() Q_DECL_OVERRIDE;
+    virtual void setVideoFullScreen( bool fs ) Q_DECL_OVERRIDE;
+};
+
+#endif // MAIN_INTERFACE_WIN32_HPP
diff --git a/modules/gui/qt/qt.cpp b/modules/gui/qt/qt.cpp
index 17c90e7..6015b2a 100644
--- a/modules/gui/qt/qt.cpp
+++ b/modules/gui/qt/qt.cpp
@@ -36,7 +36,11 @@
 
 #include "input_manager.hpp"    /* THEMIM destruction */
 #include "dialogs_provider.hpp" /* THEDP creation */
-#include "main_interface.hpp"   /* MainInterface creation */
+#ifdef _WIN32
+# include "main_interface_win32.hpp"
+#else
+# include "main_interface.hpp"   /* MainInterface creation */
+#endif
 #include "extensions_manager.hpp" /* Extensions manager */
 #include "managers/addons_manager.hpp" /* Addons manager */
 #include "dialogs/help.hpp"     /* Launch Update */
@@ -574,7 +578,11 @@ static void *ThreadPlatform( void *obj, char *platform_name )
 
     if( !p_sys->b_isDialogProvider )
     {
+#ifdef _WIN32
+        p_mi = new MainInterfaceWin32( p_intf );
+#else
         p_mi = new MainInterface( p_intf );
+#endif
         p_sys->p_mi = p_mi;
 
         /* Check window type from the Qt platform back-end */



More information about the vlc-commits mailing list