#include "qtdisplaywidget.h" #include "qthostdisplay.h" #include "qthostinterface.h" #include "qtutils.h" #include #include #include #include #include #include QtDisplayWidget::QtDisplayWidget(QWidget* parent) : QWidget(parent) { // We want a native window for both D3D and OpenGL. setAutoFillBackground(false); setAttribute(Qt::WA_NativeWindow, true); setAttribute(Qt::WA_NoSystemBackground, true); setAttribute(Qt::WA_PaintOnScreen, true); setFocusPolicy(Qt::StrongFocus); } QtDisplayWidget::~QtDisplayWidget() = default; qreal QtDisplayWidget::devicePixelRatioFromScreen() const { QScreen* screen_for_ratio; #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) screen_for_ratio = windowHandle()->screen(); #else screen_for_ratio = screen(); #endif if (!screen_for_ratio) screen_for_ratio = QGuiApplication::primaryScreen(); return screen_for_ratio ? screen_for_ratio->devicePixelRatio() : static_cast(1); } int QtDisplayWidget::scaledWindowWidth() const { return static_cast(std::ceil(static_cast(width()) * devicePixelRatioFromScreen())); } int QtDisplayWidget::scaledWindowHeight() const { return static_cast(std::ceil(static_cast(height()) * devicePixelRatioFromScreen())); } QPaintEngine* QtDisplayWidget::paintEngine() const { return nullptr; } bool QtDisplayWidget::event(QEvent* event) { switch (event->type()) { case QEvent::KeyPress: case QEvent::KeyRelease: { QKeyEvent* key_event = static_cast(event); if (!key_event->isAutoRepeat()) emit windowKeyEvent(QtUtils::KeyEventToInt(key_event), event->type() == QEvent::KeyPress); return true; } case QEvent::Resize: { QWidget::event(event); emit windowResizedEvent(scaledWindowWidth(), scaledWindowHeight()); return true; } case QEvent::Close: { emit windowClosedEvent(); QWidget::event(event); return true; } case QEvent::WindowStateChange: { QWidget::event(event); if (static_cast(event)->oldState() & Qt::WindowMinimized) emit windowRestoredEvent(); return true; } default: return QWidget::event(event); } }