#ifndef ORBITHUB_RDP_DISPLAY_WIDGET_H #define ORBITHUB_RDP_DISPLAY_WIDGET_H #include #include class QKeyEvent; class QMouseEvent; class QPaintEvent; class QResizeEvent; class QTimer; class QWheelEvent; class RdpDisplayWidget : public QWidget { Q_OBJECT public: explicit RdpDisplayWidget(QWidget* parent = nullptr); void setFrame(const QImage& frame); void setRemoteDesktopSize(int width, int height); void clearFrame(); void setCursorImage(const QImage& image, const QPoint& hotspot); void setCursorHidden(); void setCursorDefault(); signals: void keyInput(int key, quint32 nativeScanCode, const QString& text, bool pressed, int modifiers); void mouseMoveInput(int x, int y); void mouseButtonInput(int x, int y, int button, bool pressed); void mouseWheelInput(int x, int y, int deltaX, int deltaY); void viewportSizeChanged(int width, int height); void displayScaleChanged(qreal devicePixelRatio); protected: void paintEvent(QPaintEvent* event) override; void resizeEvent(QResizeEvent* event) override; bool event(QEvent* event) override; void keyPressEvent(QKeyEvent* event) override; void keyReleaseEvent(QKeyEvent* event) override; void mousePressEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override; void wheelEvent(QWheelEvent* event) override; bool focusNextPrevChild(bool next) override; private: enum class CursorMode { Default, Custom, Hidden, }; QImage m_frame; QSize m_remoteSize; QImage m_cursorImage; QPoint m_cursorHotspot; CursorMode m_cursorMode; QTimer* m_resizeDebounceTimer; QRectF renderRect() const; QPoint mapToRemote(const QPointF& pos) const; QSize effectiveRemoteSize() const; void applyCursor(); void emitViewportGeometry(); void scheduleViewportGeometryEmit(); }; #endif