qt-display.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "qt-display.hpp"
  2. #include "qt-wrappers.hpp"
  3. #include "display-helpers.hpp"
  4. #include <QWindow>
  5. #include <QScreen>
  6. #include <QResizeEvent>
  7. #include <QShowEvent>
  8. OBSQTDisplay::OBSQTDisplay(QWidget *parent, Qt::WindowFlags flags)
  9. : QWidget(parent, flags)
  10. {
  11. setAttribute(Qt::WA_PaintOnScreen);
  12. setAttribute(Qt::WA_StaticContents);
  13. setAttribute(Qt::WA_NoSystemBackground);
  14. setAttribute(Qt::WA_OpaquePaintEvent);
  15. setAttribute(Qt::WA_DontCreateNativeAncestors);
  16. setAttribute(Qt::WA_NativeWindow);
  17. auto windowVisible = [this] (bool visible)
  18. {
  19. if (!visible)
  20. return;
  21. if (!display) {
  22. CreateDisplay();
  23. } else {
  24. QSize size = GetPixelSize(this);
  25. obs_display_resize(display, size.width(), size.height());
  26. }
  27. };
  28. auto sizeChanged = [this] (QScreen*)
  29. {
  30. CreateDisplay();
  31. QSize size = GetPixelSize(this);
  32. obs_display_resize(display, size.width(), size.height());
  33. };
  34. connect(windowHandle(), &QWindow::visibleChanged, windowVisible);
  35. connect(windowHandle(), &QWindow::screenChanged, sizeChanged);
  36. }
  37. void OBSQTDisplay::CreateDisplay()
  38. {
  39. if (display || !windowHandle()->isExposed())
  40. return;
  41. QSize size = GetPixelSize(this);
  42. gs_init_data info = {};
  43. info.cx = size.width();
  44. info.cy = size.height();
  45. info.format = GS_RGBA;
  46. info.zsformat = GS_ZS_NONE;
  47. QTToGSWindow(winId(), info.window);
  48. display = obs_display_create(&info);
  49. emit DisplayCreated(this);
  50. }
  51. void OBSQTDisplay::resizeEvent(QResizeEvent *event)
  52. {
  53. QWidget::resizeEvent(event);
  54. CreateDisplay();
  55. if (isVisible() && display) {
  56. QSize size = GetPixelSize(this);
  57. obs_display_resize(display, size.width(), size.height());
  58. }
  59. emit DisplayResized();
  60. }
  61. void OBSQTDisplay::paintEvent(QPaintEvent *event)
  62. {
  63. CreateDisplay();
  64. QWidget::paintEvent(event);
  65. }
  66. QPaintEngine *OBSQTDisplay::paintEngine() const
  67. {
  68. return nullptr;
  69. }