[vlc-commits] [Git][videolan/vlc][master] 3 commits: qt: directly take required args in DCompositionAcrylicSurface

Jean-Baptiste Kempf (@jbk) gitlab at videolan.org
Sat Nov 27 16:51:05 UTC 2021



Jean-Baptiste Kempf pushed to branch master at VideoLAN / VLC


Commits:
44db1d71 by Prince Gupta at 2021-11-27T16:30:25+00:00
qt: directly take required args in DCompositionAcrylicSurface

- - - - -
710489dd by Prince Gupta at 2021-11-27T16:30:25+00:00
qt: add transition to acrylic

- - - - -
a0b22022 by Prince Gupta at 2021-11-27T16:30:25+00:00
qt/DCompositionAcrylic: increase blur

based on user feedback

- - - - -


10 changed files:

- modules/gui/qt/Makefile.am
- modules/gui/qt/maininterface/compositor_dcomp.cpp
- modules/gui/qt/maininterface/compositor_dcomp_acrylicsurface.cpp
- modules/gui/qt/maininterface/compositor_dcomp_acrylicsurface.hpp
- modules/gui/qt/maininterface/main_interface.cpp
- modules/gui/qt/maininterface/main_interface.hpp
- + modules/gui/qt/style/AcrylicController.qml
- modules/gui/qt/style/qmldir
- modules/gui/qt/vlc.qrc
- modules/gui/qt/widgets/qml/AcrylicBackground.qml


Changes:

=====================================
modules/gui/qt/Makefile.am
=====================================
@@ -836,6 +836,7 @@ libqt_plugin_la_QML = \
 	gui/qt/playlist/qml/PlaylistOverlayMenu.qml \
 	gui/qt/playlist/qml/PlaylistToolbar.qml \
 	gui/qt/playlist/qml/PlaylistDetachedWindow.qml \
+	gui/qt/style/AcrylicController.qml \
 	gui/qt/style/VLCColors.qml \
 	gui/qt/style/VLCIcons.qml \
 	gui/qt/style/VLCStyle.qml \


=====================================
modules/gui/qt/maininterface/compositor_dcomp.cpp
=====================================
@@ -279,7 +279,7 @@ bool CompositorDirectComposition::makeMainInterface(MainInterface* mainInterface
 
         auto resetAcrylicSurface = [this](QScreen * = nullptr)
         {
-            m_acrylicSurface.reset(new CompositorDCompositionAcrylicSurface(m_intf, m_d3d11Device.Get()));
+            m_acrylicSurface.reset(new CompositorDCompositionAcrylicSurface(m_intf, this, m_mainInterface, m_d3d11Device.Get()));
         };
 
         resetAcrylicSurface();


=====================================
modules/gui/qt/maininterface/compositor_dcomp_acrylicsurface.cpp
=====================================
@@ -78,25 +78,27 @@ bool isWinPreIron()
 namespace vlc
 {
 
-CompositorDCompositionAcrylicSurface::CompositorDCompositionAcrylicSurface(qt_intf_t *intf_t, ID3D11Device *device, QObject *parent)
+CompositorDCompositionAcrylicSurface::CompositorDCompositionAcrylicSurface(qt_intf_t *intf, CompositorDirectComposition *compositor, MainInterface *mainInterface, ID3D11Device *device, QObject *parent)
     : QObject(parent)
-    , m_intf {intf_t}
+    , m_intf {intf}
+    , m_compositor {compositor}
+    , m_mainInterface {mainInterface}
 {
     if (!init(device))
-    {
-        m_intf = nullptr;
         return;
-    }
-
-    if (auto w = window())
-        setActive(m_transparencyEnabled && w->isActive());
 
     qApp->installNativeEventFilter(this);
+
+    setActive(m_transparencyEnabled && m_mainInterface->acrylicActive());
+    connect(m_mainInterface, &MainInterface::acrylicActiveChanged, this, [this]()
+    {
+        setActive(m_transparencyEnabled && m_mainInterface->acrylicActive());
+    });
 }
 
 CompositorDCompositionAcrylicSurface::~CompositorDCompositionAcrylicSurface()
 {
-    setActive(false);
+    m_mainInterface->setHasAcrylicSurface(false);
 
     if (m_dummyWindow)
         DestroyWindow(m_dummyWindow);
@@ -106,7 +108,7 @@ bool CompositorDCompositionAcrylicSurface::nativeEventFilter(const QByteArray &e
 {
     MSG* msg = static_cast<MSG*>( message );
 
-    if (!m_intf || msg->hwnd != hwnd())
+    if (msg->hwnd != hwnd())
         return false;
 
     switch (msg->message)
@@ -122,18 +124,6 @@ bool CompositorDCompositionAcrylicSurface::nativeEventFilter(const QByteArray &e
         requestReset(); // incase z-order changed
         break;
     }
-    case WM_ACTIVATE:
-    {
-        if (!m_transparencyEnabled)
-            break;
-
-        const int activeType = LOWORD(msg->wParam);
-        if ((activeType == WA_ACTIVE) || (activeType == WA_CLICKACTIVE))
-            setActive(true);
-        else if (activeType == WA_INACTIVE)
-            setActive(false);
-        break;
-    }
     case WM_SETTINGCHANGE:
     {
         if (!lstrcmpW(LPCWSTR(msg->lParam), L"ImmersiveColorSet"))
@@ -143,8 +133,8 @@ bool CompositorDCompositionAcrylicSurface::nativeEventFilter(const QByteArray &e
                 break;
 
             m_transparencyEnabled = transparencyEnabled;
-            if (const auto w = window())
-                setActive(m_transparencyEnabled && w->isActive());
+            m_mainInterface->setHasAcrylicSurface(m_transparencyEnabled);
+            setActive(m_transparencyEnabled && m_mainInterface->acrylicActive());
         }
         break;
     }
@@ -168,8 +158,6 @@ bool CompositorDCompositionAcrylicSurface::init(ID3D11Device *device)
     if (!createBackHostVisual())
         return false;
 
-    m_transparencyEnabled = isTransparencyEnabled();
-
     m_leftMostScreenX = 0;
     m_topMostScreenY = 0;
     for (const auto screen : qGuiApp->screens())
@@ -179,6 +167,9 @@ bool CompositorDCompositionAcrylicSurface::init(ID3D11Device *device)
         m_topMostScreenY = std::min<int>(geometry.top(), m_topMostScreenY);
     }
 
+    m_transparencyEnabled = isTransparencyEnabled();
+    m_mainInterface->setHasAcrylicSurface(m_transparencyEnabled);
+
     return true;
 }
 
@@ -251,7 +242,7 @@ try
     m_saturationEffect->SetSaturation(2);
 
     m_gaussianBlur->SetBorderMode(D2D1_BORDER_MODE_HARD);
-    m_gaussianBlur->SetStandardDeviation(20);
+    m_gaussianBlur->SetStandardDeviation(40);
     m_gaussianBlur->SetInput(0, m_saturationEffect.Get(), 0);
     m_rootVisual->SetEffect(m_gaussianBlur.Get());
 
@@ -333,7 +324,7 @@ catch (const DXError &err)
 
 void CompositorDCompositionAcrylicSurface::sync()
 {
-    if (!m_intf || !hwnd())
+    if (!hwnd())
         return;
 
     const int dx = std::abs(m_leftMostScreenX);
@@ -351,7 +342,7 @@ void CompositorDCompositionAcrylicSurface::sync()
     int frameX = 0;
     int frameY = 0;
 
-    if (m_intf->p_mi && !m_intf->p_mi->useClientSideDecoration())
+    if (!m_mainInterface->useClientSideDecoration())
     {
         frameX = GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
         frameY = GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYCAPTION)
@@ -420,41 +411,29 @@ void CompositorDCompositionAcrylicSurface::setActive(const bool newActive)
     m_active = newActive;
     if (m_active)
     {
-        auto dcompositor = static_cast<vlc::CompositorDirectComposition *>(m_intf->p_compositor);
-        dcompositor->addVisual(m_rootVisual);
+        m_compositor->addVisual(m_rootVisual);
 
         updateVisual();
         sync();
         commitChanges();
-
-        // delay propagating changes to avoid flickering
-        QMetaObject::invokeMethod(this, [this]()
-        {
-            m_intf->p_mi->setHasAcrylicSurface(true);
-        }, Qt::QueuedConnection);
     }
     else
     {
-        m_intf->p_mi->setHasAcrylicSurface(false);
-
-        // delay propagating changes to avoid flickering
-        QMetaObject::invokeMethod(this, [this]()
-        {
-            auto dcompositor = static_cast<vlc::CompositorDirectComposition *>(m_intf->p_compositor);
-            dcompositor->removeVisual(m_rootVisual);
-        }, Qt::QueuedConnection);
+        m_compositor->removeVisual(m_rootVisual);
     }
 }
 
 QWindow *CompositorDCompositionAcrylicSurface::window()
 {
-    return m_intf ? m_intf->p_compositor->interfaceMainWindow() : nullptr;
+    return m_compositor->interfaceMainWindow();
 }
 
 HWND CompositorDCompositionAcrylicSurface::hwnd()
 {
-    auto w = window();
-    return w->handle() ? (HWND)w->winId() : nullptr;
+    if (auto w = window())
+        return w->handle() ? (HWND)w->winId() : nullptr;
+
+    return nullptr;
 }
 
 void CompositorDCompositionAcrylicSurface::timerEvent(QTimerEvent *event)


=====================================
modules/gui/qt/maininterface/compositor_dcomp_acrylicsurface.hpp
=====================================
@@ -155,6 +155,8 @@ typedef HRESULT (*DCompositionCreateDeviceFun)(IDXGIDevice *dxgiDevice, REFIID i
 namespace vlc
 {
 
+class CompositorDirectComposition;
+
 /**
  * @brief The CompositorDCompositionAcrylicSurface class
  * Adds acrylic surface to the compositor_dcomp when the main window becomes active
@@ -168,7 +170,7 @@ class CompositorDCompositionAcrylicSurface
     Q_OBJECT
 
 public:
-    CompositorDCompositionAcrylicSurface(qt_intf_t *intf_t, ID3D11Device *device, QObject *parent = nullptr);
+    CompositorDCompositionAcrylicSurface(qt_intf_t * intf, CompositorDirectComposition *compositor, MainInterface *mainInterface, ID3D11Device *device, QObject *parent = nullptr);
 
     ~CompositorDCompositionAcrylicSurface();
 
@@ -221,7 +223,9 @@ private:
     Microsoft::WRL::ComPtr<IDCompositionSaturationEffect> m_saturationEffect;
     Microsoft::WRL::ComPtr<IDCompositionGaussianBlurEffect> m_gaussianBlur;
 
-    qt_intf_t *m_intf {};
+    qt_intf_t *m_intf = nullptr;
+    CompositorDirectComposition *m_compositor = nullptr;
+    MainInterface *m_mainInterface = nullptr;
     QBasicTimer m_resetTimer;
     bool m_resetPending = false;
     bool m_active = false;


=====================================
modules/gui/qt/maininterface/main_interface.cpp
=====================================
@@ -388,15 +388,6 @@ void MainInterface::onWindowVisibilityChanged(QWindow::Visibility visibility)
     m_windowVisibility = visibility;
 }
 
-void MainInterface::setUseAcrylicBackground(const bool v)
-{
-    if (m_useAcrylicBackground == v)
-        return;
-
-    m_useAcrylicBackground = v;
-    emit useAcrylicBackgroundChanged();
-}
-
 void MainInterface::setHasAcrylicSurface(const bool v)
 {
     if (m_hasAcrylicSurface == v)
@@ -812,3 +803,17 @@ static int IntfBossCB( vlc_object_t *, const char *,
 
     return VLC_SUCCESS;
 }
+
+bool MainInterface::acrylicActive() const
+{
+    return m_acrylicActive;
+}
+
+void MainInterface::setAcrylicActive(bool newAcrylicActive)
+{
+    if (m_acrylicActive == newAcrylicActive)
+        return;
+
+    m_acrylicActive = newAcrylicActive;
+    emit acrylicActiveChanged();
+}


=====================================
modules/gui/qt/maininterface/main_interface.hpp
=====================================
@@ -163,9 +163,11 @@ class MainInterface : public QObject
     Q_PROPERTY(bool canShowVideoPIP READ canShowVideoPIP CONSTANT FINAL)
     Q_PROPERTY(bool pinVideoControls READ pinVideoControls WRITE setPinVideoControls NOTIFY pinVideoControlsChanged FINAL)
     Q_PROPERTY(ControlbarProfileModel* controlbarProfileModel READ controlbarProfileModel CONSTANT FINAL)
-    Q_PROPERTY(bool useAcrylicBackground READ useAcrylicBackground NOTIFY useAcrylicBackgroundChanged FINAL)
     Q_PROPERTY(bool hasAcrylicSurface READ hasAcrylicSurface NOTIFY hasAcrylicSurfaceChanged FINAL)
 
+    // This Property only works if hasAcrylicSurface is set
+    Q_PROPERTY(bool acrylicActive READ acrylicActive WRITE setAcrylicActive NOTIFY acrylicActiveChanged FINAL)
+
 public:
     /* tors */
     MainInterface(qt_intf_t *);
@@ -219,7 +221,6 @@ public:
     inline ControlbarProfileModel* controlbarProfileModel() const { return m_controlbarProfileModel; }
     inline QUrl getDialogFilePath() const { return m_dialogFilepath; }
     inline void setDialogFilePath(const QUrl& filepath ){ m_dialogFilepath = filepath; }
-    inline bool useAcrylicBackground() const { return m_useAcrylicBackground; }
     inline bool hasAcrylicSurface() const { return m_hasAcrylicSurface; }
     inline void reloadFromSettings() { loadFromSettingsImpl(true); }
 
@@ -237,6 +238,9 @@ public:
      */
     bool onWindowClose(QWindow* );
 
+    bool acrylicActive() const;
+    void setAcrylicActive(bool newAcrylicActive);
+
 protected:
     /* Systray */
     void createSystray();
@@ -295,8 +299,8 @@ protected:
 
     ControlbarProfileModel* m_controlbarProfileModel = nullptr;
 
-    bool m_useAcrylicBackground = true;
     bool m_hasAcrylicSurface = false;
+    bool m_acrylicActive = false;
 
 public slots:
     void toggleUpdateSystrayMenu();
@@ -314,7 +318,6 @@ public slots:
     void setPinVideoControls( bool );
     void updateIntfScaleFactor();
     void onWindowVisibilityChanged(QWindow::Visibility);
-    void setUseAcrylicBackground(bool);
     void setHasAcrylicSurface(bool);
 
     void emitBoss();
@@ -366,9 +369,10 @@ signals:
 
     void intfScaleFactorChanged();
     void pinVideoControlsChanged( bool );
-    void useAcrylicBackgroundChanged();
     void hasAcrylicSurfaceChanged();
 
+    void acrylicActiveChanged();
+
 private:
     void loadPrefs(bool callSignals);
     void loadFromSettingsImpl(bool callSignals);


=====================================
modules/gui/qt/style/AcrylicController.qml
=====================================
@@ -0,0 +1,49 @@
+/*****************************************************************************
+ * Copyright (C) 2021 VLC authors and VideoLAN
+ *
+ * Authors: Prince Gupta <guptaprince8832 at gmail.com>
+ *
+ * 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.
+ *****************************************************************************/
+pragma Singleton
+import QtQuick 2.11
+
+Item {
+    id: root
+
+    property real uiTransluency: (enabled && topWindow.active) ? 1 : 0
+
+    enabled: mainInterface.hasAcrylicSurface
+
+    Behavior on uiTransluency {
+        NumberAnimation {
+            duration: VLCStyle.duration_normal
+            easing.type: Easing.InOutSine
+        }
+    }
+
+    Binding {
+        when: root.enabled
+        target: mainInterface
+        property: "acrylicActive"
+        value: root.uiTransluency != 0
+
+        Component.onCompleted: {
+            // restoreMode is only available in Qt >= 5.14
+            if ("restoreMode" in this)
+                this.restoreMode = Binding.RestoreBindingOrValue
+        }
+    }
+}


=====================================
modules/gui/qt/style/qmldir
=====================================
@@ -1,2 +1,3 @@
 singleton VLCStyle 1.0 VLCStyle.qml
 singleton VLCIcons 1.0 VLCIcons.qml
+singleton AcrylicController 1.0 AcrylicController.qml


=====================================
modules/gui/qt/vlc.qrc
=====================================
@@ -313,6 +313,7 @@
         <file alias="VideoDisplayRecentVideos.qml">medialibrary/qml/VideoDisplayRecentVideos.qml</file>
     </qresource>
     <qresource prefix="/style">
+        <file alias="AcrylicController.qml">style/AcrylicController.qml</file>
         <file alias="qmldir">style/qmldir</file>
         <file alias="VLCStyle.qml">style/VLCStyle.qml</file>
         <file alias="VLCColors.qml">style/VLCColors.qml</file>


=====================================
modules/gui/qt/widgets/qml/AcrylicBackground.qml
=====================================
@@ -26,15 +26,17 @@ import "qrc:///style/"
 Item {
     id: root
 
-    readonly property bool usingAcrylic: visible && enabled && mainInterface.useAcrylicBackground && mainInterface.hasAcrylicSurface
+    readonly property bool usingAcrylic: visible && enabled && AcrylicController.enabled
 
     property color tintColor: VLCStyle.colors.setColorAlpha(VLCStyle.colors.bg, 0.7)
 
     property color alternativeColor: VLCStyle.colors.bgAlt
 
+    property real _blend: usingAcrylic ? AcrylicController.uiTransluency : 0
+
     layer.enabled: true
     layer.effect: ShaderEffect {
-        property color overlay: root.usingAcrylic ? root.tintColor : root.alternativeColor
+        property color overlay: VLCStyle.colors.blendColors(root.tintColor, root.alternativeColor, root._blend)
 
         blending: false
         fragmentShader: "



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/450363175621f1b6893a8cc833508b5129bfd938...a0b220223a75ac8d3a947e78e58a22c476652529

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/450363175621f1b6893a8cc833508b5129bfd938...a0b220223a75ac8d3a947e78e58a22c476652529
You're receiving this email because of your account on code.videolan.org.




More information about the vlc-commits mailing list