diff --git a/src/librssguard/CMakeLists.txt b/src/librssguard/CMakeLists.txt index b5fafe424..7862fdaac 100644 --- a/src/librssguard/CMakeLists.txt +++ b/src/librssguard/CMakeLists.txt @@ -534,6 +534,8 @@ elseif(ENABLE_MEDIAPLAYER_LIBMPV) list(APPEND SOURCES gui/mediaplayer/libmpv/libmpvbackend.cpp gui/mediaplayer/libmpv/libmpvbackend.h + gui/mediaplayer/libmpv/libmpvwidget.cpp + gui/mediaplayer/libmpv/libmpvwidget.h gui/mediaplayer/libmpv/qthelper.h ) diff --git a/src/librssguard/gui/mediaplayer/libmpv/libmpvbackend.cpp b/src/librssguard/gui/mediaplayer/libmpv/libmpvbackend.cpp index aa11e3417..7d099b3fd 100644 --- a/src/librssguard/gui/mediaplayer/libmpv/libmpvbackend.cpp +++ b/src/librssguard/gui/mediaplayer/libmpv/libmpvbackend.cpp @@ -4,6 +4,7 @@ #include "3rd-party/boolinq/boolinq.h" #include "definitions/definitions.h" +#include "gui/mediaplayer/libmpv/libmpvwidget.h" #include "gui/mediaplayer/libmpv/qthelper.h" #include "miscellaneous/settings.h" #include "miscellaneous/textfactory.h" @@ -43,37 +44,21 @@ static void wakeup(void* ctx) { } LibMpvBackend::LibMpvBackend(Application* app, QWidget* parent) - : PlayerBackend(app, parent), m_mpvContainer(new QWidget(this)), m_mpvHandle(nullptr) { + : PlayerBackend(app, parent), m_mpvContainer(nullptr), m_mpvHandle(nullptr) { installEventFilter(this); loadSettings(); m_mpvHandle = mpv_create(); + m_mpvContainer = new LibMpvWidget(m_mpvHandle, this); if (m_mpvHandle == nullptr) { qFatal("cannot create mpv instance"); } - // Create a video child window. Force Qt to create a native window, and - // pass the window ID to the mpv wid option. Works on: X11, win32, Cocoa. - m_mpvContainer->setAttribute(Qt::WidgetAttribute::WA_DontCreateNativeAncestors); - m_mpvContainer->setAttribute(Qt::WidgetAttribute::WA_NativeWindow); - - m_mpvContainer->setMouseTracking(true); setMouseTracking(true); - layout()->addWidget(m_mpvContainer); - auto raw_wid = m_mpvContainer->winId(); - -#if defined(Q_OS_WIN) - // Truncate to 32-bit, as all Windows handles are. This also ensures - // it doesn't go negative. - int64_t wid = static_cast(raw_wid); -#else - int64_t wid = raw_wid; -#endif - - mpv_set_option(m_mpvHandle, "wid", MPV_FORMAT_INT64, &wid); + m_mpvContainer->bind(); mpv_set_option_string(m_mpvHandle, "msg-level", "all=v"); mpv_set_option_string(m_mpvHandle, "config", "yes"); @@ -91,16 +76,6 @@ LibMpvBackend::LibMpvBackend(Application* app, QWidget* parent) mpv_set_option_string(m_mpvHandle, "terminal", "yes"); #endif - // - // NOTE: Just random options for testing here. - // - // mpv_set_option_string(m_mpvHandle, "keep-open", "no"); - // mpv_set_option_string(m_mpvHandle, "osd-italic", "yes"); - // mpv_set_option_string(m_mpvHandle, "osd-color", "1.0/0.0/0.0"); - // mpv_set_option_string(m_mpvHandle, "watch-later-dir", "mpv"); - // mpv_set_option_string(m_mpvHandle, "input-builtin-bindings", "no"); - // mpv_set_option_string(m_mpvHandle, "input-test", "yes"); - if (!m_customConfigFolder.isEmpty()) { QByteArray cfg_folder = QDir::toNativeSeparators(m_customConfigFolder).toLocal8Bit(); diff --git a/src/librssguard/gui/mediaplayer/libmpv/libmpvbackend.h b/src/librssguard/gui/mediaplayer/libmpv/libmpvbackend.h index dab226525..b8b76e63a 100644 --- a/src/librssguard/gui/mediaplayer/libmpv/libmpvbackend.h +++ b/src/librssguard/gui/mediaplayer/libmpv/libmpvbackend.h @@ -7,6 +7,8 @@ #include +class LibMpvWidget; + class LibMpvBackend : public PlayerBackend { Q_OBJECT @@ -61,7 +63,7 @@ class LibMpvBackend : public PlayerBackend { private: QString m_customConfigFolder; - QWidget* m_mpvContainer; + LibMpvWidget* m_mpvContainer; mpv_handle* m_mpvHandle; QUrl m_url; }; diff --git a/src/librssguard/gui/mediaplayer/libmpv/libmpvwidget.cpp b/src/librssguard/gui/mediaplayer/libmpv/libmpvwidget.cpp new file mode 100644 index 000000000..e59abf28f --- /dev/null +++ b/src/librssguard/gui/mediaplayer/libmpv/libmpvwidget.cpp @@ -0,0 +1,25 @@ +// For license of this file, see /LICENSE.md. + +#include "gui/mediaplayer/libmpv/libmpvwidget.h" + +#include + +LibMpvWidget::LibMpvWidget(mpv_handle* mpv_handle, QWidget* parent) : QWidget(parent), m_mpvHandle(mpv_handle) { + setAttribute(Qt::WidgetAttribute::WA_DontCreateNativeAncestors); + setAttribute(Qt::WidgetAttribute::WA_NativeWindow); + setMouseTracking(true); +} + +void LibMpvWidget::bind() { + auto raw_wid = winId(); + +#if defined(Q_OS_WIN) + // Truncate to 32-bit, as all Windows handles are. This also ensures + // it doesn't go negative. + int64_t wid = static_cast(raw_wid); +#else + int64_t wid = raw_wid; +#endif + + mpv_set_option(m_mpvHandle, "wid", MPV_FORMAT_INT64, &wid); +} diff --git a/src/librssguard/gui/mediaplayer/libmpv/libmpvwidget.h b/src/librssguard/gui/mediaplayer/libmpv/libmpvwidget.h new file mode 100644 index 000000000..702abc036 --- /dev/null +++ b/src/librssguard/gui/mediaplayer/libmpv/libmpvwidget.h @@ -0,0 +1,24 @@ +// For license of this file, see /LICENSE.md. + +#ifndef LIBMPVWIDGET_H +#define LIBMPVWIDGET_H + +#include + +struct mpv_handle; + +class LibMpvWidget : public QWidget { + Q_OBJECT + + public: + explicit LibMpvWidget(mpv_handle* mpv_handle, QWidget* parent = nullptr); + + void bind(); + + signals: + + private: + mpv_handle* m_mpvHandle; +}; + +#endif // LIBMPVWIDGET_H