#include "qt-display.hpp" #include "qt-wrappers.hpp" #include "display-helpers.hpp" #include #include #include #include static inline long long color_to_int(QColor color) { auto shift = [&](unsigned val, int shift) { return ((val & 0xff) << shift); }; return shift(color.red(), 0) | shift(color.green(), 8) | shift(color.blue(), 16) | shift(color.alpha(), 24); } 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); this->setProperty("themeID", "displayBackgroundColor"); } void OBSQTDisplay::SetDisplayBackgroundColor(const QColor &color) { backgroundColor = (uint32_t)color_to_int(color); obs_display_set_background_color(display, backgroundColor); } 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, backgroundColor); 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; }