#include "qt-display.hpp" #include "qt-wrappers.hpp" #include "display-helpers.hpp" #include #include #include #include static inline long long color_to_int(const 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); } static inline QColor rgba_to_color(uint32_t rgba) { return QColor::fromRgb(rgba & 0xFF, (rgba >> 8) & 0xFF, (rgba >> 16) & 0xFF, (rgba >> 24) & 0xFF); } 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); } QColor OBSQTDisplay::GetDisplayBackgroundColor() const { return rgba_to_color(backgroundColor); } void OBSQTDisplay::SetDisplayBackgroundColor(const QColor &color) { uint32_t newBackgroundColor = (uint32_t)color_to_int(color); if (newBackgroundColor != backgroundColor) { backgroundColor = newBackgroundColor; UpdateDisplayBackgroundColor(); } } void OBSQTDisplay::UpdateDisplayBackgroundColor() { 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; }