@@ -53,8 +53,13 @@ class VncViewer : public QWidget
5353 int serverPort;
5454 std::thread *vncThread () const ;
5555 void paintEvent (QPaintEvent *event) override ;
56+ void mouseMoveEvent (QMouseEvent *event) override ;
57+ void mousePressEvent (QMouseEvent *event) override ;
58+ void mouseReleaseEvent (QMouseEvent *event) override ;
59+ void closeEvent (QCloseEvent *event) override ;
5660
5761private:
62+ bool m_startFlag = false ;
5863 QImage m_image;
5964 rfbClient *cl;
6065 std::thread *m_vncThread;
@@ -74,6 +79,7 @@ void VncViewer::finishedFramebufferUpdate(rfbClient *cl)
7479
7580 update ();
7681}
82+
7783void VncViewer::paintEvent (QPaintEvent *event)
7884{
7985 event->accept ();
@@ -82,6 +88,45 @@ void VncViewer::paintEvent(QPaintEvent *event)
8288 painter.drawImage (this ->rect (), m_image);
8389}
8490
91+ void VncViewer::mouseMoveEvent (QMouseEvent *event)
92+ {
93+ if (m_startFlag) {
94+ SendPointerEvent (cl,
95+ event->localPos ().x () / width () * cl->width ,
96+ event->localPos ().y () / height () * cl->height ,
97+ (event->buttons () & Qt::LeftButton) ? 1 : 0 );
98+ }
99+ }
100+
101+ void VncViewer::mousePressEvent (QMouseEvent *event)
102+ {
103+ if (m_startFlag) {
104+ SendPointerEvent (cl,
105+ event->localPos ().x () / width () * cl->width ,
106+ event->localPos ().y () / height () * cl->height ,
107+ 1 );
108+ }
109+ }
110+
111+ void VncViewer::mouseReleaseEvent (QMouseEvent *event)
112+ {
113+ if (m_startFlag) {
114+ SendPointerEvent (cl,
115+ event->localPos ().x () / width () * cl->width ,
116+ event->localPos ().y () / height () * cl->height ,
117+ 0 );
118+ }
119+ }
120+
121+ void VncViewer::closeEvent (QCloseEvent *event)
122+ {
123+ m_startFlag = false ;
124+ if (m_vncThread->joinable ()) {
125+ m_vncThread->join ();
126+ }
127+ QWidget::closeEvent (event);
128+ }
129+
85130void VncViewer::start ()
86131{
87132 cl = rfbGetClient (8 , 3 , 4 );
@@ -109,9 +154,13 @@ void VncViewer::start()
109154 std::cout << " [INFO] disconnected" << std::endl;
110155 return ;
111156 }
157+ m_startFlag = true ;
158+
159+ std::cout << " [INFO] screen size: " << cl->width << " x " << cl->height << std::endl;
160+ this ->resize (cl->width , cl->height );
112161
113162 m_vncThread = new std::thread ([this ]() {
114- while (true ) {
163+ while (m_startFlag ) {
115164 int i = WaitForMessage (cl, 500 );
116165 if (i < 0 ) {
117166 std::cout << " [INFO] disconnected" << std::endl;
0 commit comments