[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