diff --git a/obs/CMakeLists.txt b/obs/CMakeLists.txt index 273e04c81287bb6c5a854b0f0897fa4e52fe6c12..bd41e642287310b5b9c42a19125e9426a5586d41 100644 --- a/obs/CMakeLists.txt +++ b/obs/CMakeLists.txt @@ -126,6 +126,7 @@ set(obs_SOURCES visibility-item-widget.cpp slider-absoluteset-style.cpp source-list-widget.cpp + qt-display.cpp crash-report.cpp hotkey-edit.cpp source-label.cpp diff --git a/obs/qt-display.cpp b/obs/qt-display.cpp new file mode 100644 index 0000000000000000000000000000000000000000..90bd9bebd9dd2eafa9fbc90cfdd8c3dd20745f29 --- /dev/null +++ b/obs/qt-display.cpp @@ -0,0 +1,88 @@ +#include "qt-display.hpp" +#include "qt-wrappers.hpp" +#include "display-helpers.hpp" +#include +#include +#include +#include + +OBSQTDisplay::OBSQTDisplay(QWidget *parent, Qt::WindowFlags flags) + : QWidget(parent, flags) +{ + setAttribute(Qt::WA_PaintOnScreen); + setAttribute(Qt::WA_StaticContents); + setAttribute(Qt::WA_NoSystemBackground); + setAttribute(Qt::WA_OpaquePaintEvent); + setAttribute(Qt::WA_DontCreateNativeAncestors); + setAttribute(Qt::WA_NativeWindow); + + auto windowVisible = [this] (bool visible) + { + if (!visible) + return; + + if (!display) { + CreateDisplay(); + } else { + QSize size = GetPixelSize(this); + obs_display_resize(display, size.width(), size.height()); + } + }; + + auto sizeChanged = [this] (QScreen*) + { + CreateDisplay(); + + QSize size = GetPixelSize(this); + obs_display_resize(display, size.width(), size.height()); + }; + + connect(windowHandle(), &QWindow::visibleChanged, windowVisible); + connect(windowHandle(), &QWindow::screenChanged, sizeChanged); +} + +void OBSQTDisplay::CreateDisplay() +{ + if (display || !windowHandle()->isExposed()) + return; + + QSize size = GetPixelSize(this); + + gs_init_data info = {}; + info.cx = size.width(); + info.cy = size.height(); + info.format = GS_RGBA; + info.zsformat = GS_ZS_NONE; + + QTToGSWindow(winId(), info.window); + + display = obs_display_create(&info); + + emit DisplayCreated(this); +} + +void OBSQTDisplay::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + + CreateDisplay(); + + if (isVisible() && display) { + QSize size = GetPixelSize(this); + obs_display_resize(display, size.width(), size.height()); + } + + emit DisplayResized(); +} + +void OBSQTDisplay::paintEvent(QPaintEvent *event) +{ + CreateDisplay(); + + QWidget::paintEvent(event); +} + +QPaintEngine *OBSQTDisplay::paintEngine() const +{ + return nullptr; +} diff --git a/obs/qt-display.hpp b/obs/qt-display.hpp index 9f5227a15b967bbb3887ee7c182c2f4a795b437e..438100bf9c5ae1ea4b9c20320738c1496b73204f 100644 --- a/obs/qt-display.hpp +++ b/obs/qt-display.hpp @@ -1,30 +1,26 @@ #pragma once #include +#include class OBSQTDisplay : public QWidget { Q_OBJECT - virtual void resizeEvent(QResizeEvent *event) override - { - emit DisplayResized(); - QWidget::resizeEvent(event); - } + OBSDisplay display; + + void CreateDisplay(); + + void resizeEvent(QResizeEvent *event) override; + void paintEvent(QPaintEvent *event) override; signals: + void DisplayCreated(OBSQTDisplay *window); void DisplayResized(); public: - inline OBSQTDisplay(QWidget *parent = 0, Qt::WindowFlags flags = 0) - : QWidget(parent, flags) - { - setAttribute(Qt::WA_PaintOnScreen); - setAttribute(Qt::WA_StaticContents); - setAttribute(Qt::WA_NoSystemBackground); - setAttribute(Qt::WA_OpaquePaintEvent); - setAttribute(Qt::WA_DontCreateNativeAncestors); - setAttribute(Qt::WA_NativeWindow); - } - - virtual QPaintEngine *paintEngine() const override {return nullptr;} + OBSQTDisplay(QWidget *parent = 0, Qt::WindowFlags flags = 0); + + virtual QPaintEngine *paintEngine() const override; + + inline obs_display_t *GetDisplay() const {return display;} };