[X2Go-Commits] [x2gokdriveclient] 01/01: Improved display image updates.

git-admin at x2go.org git-admin at x2go.org
Mon Feb 14 20:30:58 CET 2022


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch feature/rootless-mode
in repository x2gokdriveclient.

commit 27ab44de9d988003748f34619d41acd7c4d147b7
Author: Oleksandr Shneyder <o.shneyder at phoca-gmbh.de>
Date:   Mon Feb 14 13:30:47 2022 -0600

    Improved display image updates.
---
 client.cpp      |  87 +++++++++++++++++++++-----------------
 client.h        |   9 ++--
 displayarea.cpp | 126 +++++++++++++++++++++++---------------------------------
 displayarea.h   |   1 -
 menuframe.cpp   |   2 +
 5 files changed, 107 insertions(+), 118 deletions(-)

diff --git a/client.cpp b/client.cpp
index dd43279..34041bc 100644
--- a/client.cpp
+++ b/client.cpp
@@ -254,19 +254,7 @@ void Client::initDesktopMode()
     connect(menu,SIGNAL(aboutToShow()), this, SLOT(slotSetupMenu()));
     setWindowTitle(mainWndTitle);
 }
-void Client::slotGrabDisplay()
-{
-    if(hasUpdates)
-    {
-        //         Client::KDRStdErr()<<"save display";
-        if(!rootless)
-        {
-            QScreen *screen = QGuiApplication::primaryScreen();
-            displayPix = screen->grabWindow(winId());
-        }
-        hasUpdates=false;
-    }
-}
+
 
 void Client::slotIdentifyScreen()
 {
@@ -323,9 +311,6 @@ void Client::slotIdentifyScreen()
     menu->show();
     //hide the identifier, when no screen actions are hovered
     QTimer::singleShot(100,this, SLOT(slotIdentifyScreen()));
-    QTimer *tm=new QTimer(this);
-    connect(tm, &QTimer::timeout, this, &Client::slotGrabDisplay);
-    tm->start(1000);
 }
 
 void Client::editWindowTitle()
@@ -526,7 +511,6 @@ void Client::slotSetupMenu()
             actDisp[i]->setVisible(false);
         }
     }
-    slotGrabDisplay();
 }
 
 bool Client::isDisplayPointer(QMouseEvent* event)
@@ -730,28 +714,19 @@ QPixmap Client::getPixmapFromCache(uint32_t crc)
     return frameCache[crc];
 }
 
-void Client::setDisplayPix(QPixmap pix, int32_t x, int32_t y)
+void Client::saveDispImage(QString path)
 {
-    if(x==-1 || y==-1)
-    {
-        displayPix=pix;
-    }
-    else
-    {
-        QPainter pt;
-        pt.begin(&displayPix);
-        pt.drawPixmap(x,y,pix);
-        pt.end();
-    }
+    displayImage.save(path);
 }
 
-
 void Client::renderFrame()
 {
+    QPainter dispImagePainter;
+
     if(!currentFrame->crc)
     {
         //we got a whole display copy
-        if(currentFrame->x==-1)
+        if(currentFrame->x==-1||currentFrame->y==-1)
         {
             KDRStdErr()<<"got initial Image: "<<currentFrame->width<<"x"<<currentFrame->height<<" "<<QSizeToStr(currentFrame->regions[0]->pix.size())<<KDR_ENDL;
             if(!rootless)
@@ -759,13 +734,19 @@ void Client::renderFrame()
                 displayArea->resize(currentFrame->width, currentFrame->height);
                 this->resize(currentFrame->width, currentFrame->height);
             }
-            setDisplayPix(currentFrame->regions[0]->pix);
-        }
-        else
-        {
-//                 KDRStdErr()<<"got Screen update: "<<currentFrame->x<<":"<< currentFrame->y<<" "<<KDR_ENDL;
-                setDisplayPix(currentFrame->regions[0]->pix, currentFrame->x, currentFrame->y);
+            displayImage=QImage(currentFrame->width, currentFrame->height, QImage::Format_RGB32);
+/*            dispImagePainter.begin(&displayImage);
+            dispImagePainter.drawPixmap(0,0,currentFrame->regions[0]->pix);
+            dispImagePainter.end();*/
+//             saveDispImage("/tmp/dispInit.png");
         }
+//         else
+//         {
+//             dispImagePainter.begin(&displayImage);
+//             dispImagePainter.drawPixmap(currentFrame->x,currentFrame->y,currentFrame->regions[0]->pix);
+//             dispImagePainter.end();
+// //             saveDispImage("/tmp/dispUpdate.png");
+//         }
     }
     else
     {
@@ -805,9 +786,14 @@ void Client::renderFrame()
             cacheSize+=frameSize;
 
             frameCount++;
-
+//             saveDispImage("/tmp/dispDraw.png");
             /*KDRStdErr()<<"Insert in cache Frame:"<<frameCount<<dec<<frameSize<<pix.size()<<
             frameCache.count()<<"Total(MB)"<<cacheSize/(1024*1024);*/
+//             QPainter dispImagePainter;
+//             dispImagePainter.begin(this->getDisplayImage());
+//             dispImagePainter.drawPixmap(currentFrame->x,currentFrame->y,pix);
+//             dispImagePainter.end();
+
         }
     }
     wantRepaint=true;
@@ -837,6 +823,31 @@ void Client::renderFrame()
         }
     }
     setUptodate();
+
+
+//////put another func if works
+
+    Frame* currentFrame=this->getCurrentFrame();
+    QPixmap pix;
+    if(!currentFrame->crc)
+    {
+        //                 Client::KDRStdErr()<<"Draw DISPLAY PIX "<<KDR_ENDL;
+        pix=currentFrame->regions[0]->pix;
+        //             disp=true;
+    }
+    else
+    {
+        //                 Client::KDRStdErr()<<"Draw PIX from cache"<<KDR_ENDL;
+        pix=this->getPixmapFromCache(currentFrame->crc);
+    }
+    if(currentFrame->x==-1 || currentFrame->y==-1)
+    {
+        currentFrame->x=currentFrame->y=0;
+    }
+    QPainter painter;
+    painter.begin(this->getDisplayImage());
+    painter.drawPixmap(currentFrame->x,currentFrame->y,pix);
+    painter.end();
 }
 
 void Client::setUptodate()
diff --git a/client.h b/client.h
index ad87a8e..b9c544a 100644
--- a/client.h
+++ b/client.h
@@ -183,7 +183,6 @@ public:
     void setUptodate();
     QPixmap getPixmapFromCache(uint32_t crc);
     QPixmap addPixmapToCache();
-    QPixmap getDisplayPix(){return displayPix;}
     bool isDisplayPointer(QMouseEvent* event);
     void addToSelectionOutput(OutputChunk* chunk);
     bool serverSupportsExtSelection(){return serverExtSelection;}
@@ -200,11 +199,11 @@ public:
     const QList<ExtWin*> getExtWindows(){return extWindows;}
     const QList<ExtWin*> getSiblings(ExtWin* win);
     ExtWin* findExtWinById(uint32_t extWinId);
+    QImage* getDisplayImage(){return &displayImage;}
 
 public slots:
     void sendOutputSelChunk();
-    void slotGrabDisplay();
-
+    void saveDispImage(QString path="/tmp/dispPin.png");
 
 
 private slots:
@@ -267,7 +266,6 @@ private:
     void setFS(int screenNumber);
     void reinitCaches();
     void initGeometry();
-    void setDisplayPix(QPixmap pix, int32_t x=-1, int32_t y=-1);
     bool wantRepaint=false;
     bool hasUpdates=false;
 #ifndef Q_OS_LINUX
@@ -276,6 +274,8 @@ private:
 #endif
     void parseOptions();
     void initDesktopMode();
+    QImage displayImage;
+
 
     static bool debug;
     //initial values
@@ -365,7 +365,6 @@ private:
     int cacheSize=0;
     ScreenIdentifier *screenIdentifier=0l;
     QLabel* fr;
-    QPixmap displayPix;
 
     //selection
 #ifdef Q_OS_LINUX
diff --git a/displayarea.cpp b/displayarea.cpp
index 444a758..9b913ea 100644
--- a/displayarea.cpp
+++ b/displayarea.cpp
@@ -120,92 +120,70 @@ DisplayArea::~DisplayArea()
 void DisplayArea::paintEvent(QPaintEvent* ev)
 {
     QPainter painter;
-    bool disp=false;
-    if(! client->getDisplayPix().isNull())
+//     bool disp=false;
+    painter.begin(this);
+    if(client->needUpdate())
     {
-        painter.begin(this);
-        if(client->needUpdate())
+        Frame* currentFrame=client->getCurrentFrame();
+        QPixmap pix;
+        if(!currentFrame->crc)
         {
-            Frame* currentFrame=client->getCurrentFrame();
-            QPixmap pix;
-            if(!currentFrame->crc)
-            {
-//                 Client::KDRStdErr()<<"Draw DISPLAY PIX "<<KDR_ENDL;
-                pix=client->getDisplayPix();
-                disp=true;
-            }
-            else
-            {
-//                 Client::KDRStdErr()<<"Draw PIX from cache"<<KDR_ENDL;
-                pix=client->getPixmapFromCache(currentFrame->crc);
-            }
-            if(currentFrame->x==-1 || currentFrame->y==-1)
-            {
-                currentFrame->x=currentFrame->y=0;
-            }
-            if(!client->isRootless())
-            {
-                if(!disp)
-                    painter.drawPixmap(currentFrame->x,currentFrame->y,pix);
-                else
-                    painter.drawPixmap(currentFrame->x,currentFrame->y,pix,currentFrame->x,currentFrame->y,currentFrame->width,currentFrame->height);
-            }
-            else
-            {
-                    if(!disp)
-                    {
-                        painter.drawPixmap(currentFrame->x-((ExtWin*)parentWidget)->adjustGeometry().x(),currentFrame->y-((ExtWin*)parentWidget)->adjustGeometry().y(),pix);
-                    }
-                    else
-                        painter.drawPixmap(currentFrame->x-((ExtWin*)parentWidget)->adjustGeometry().x(),currentFrame->y-((ExtWin*)parentWidget)->adjustGeometry().y(),pix,
-                                           currentFrame->x,currentFrame->y,ev->rect().width(),ev->rect().height());
-            }
+            //                 Client::KDRStdErr()<<"Draw DISPLAY PIX "<<KDR_ENDL;
+            pix=currentFrame->regions[0]->pix;
+//             disp=true;
         }
         else
         {
-//             Client::KDRStdErr()<<"Win update event: "<<KDR_HEX<<((ExtWin*)parentWidget)->getPtr()<< " "<<Client::QRectToStr(ev->rect()) <<KDR_ENDL;
-            char evmsg[EVLENGTH]={};
-            int32_t etype, x, y, width, height;
-            etype=UPDATE;
-            width=ev->rect().width();
-            height=ev->rect().height();
-
-            if(!client->isRootless())
-            {
-                x=ev->rect().x();
-                y=ev->rect().y();
-                painter.drawPixmap(ev->rect(),client->getDisplayPix(),ev->rect());
-            }
-            else
+            //                 Client::KDRStdErr()<<"Draw PIX from cache"<<KDR_ENDL;
+            pix=client->getPixmapFromCache(currentFrame->crc);
+        }
+        if(currentFrame->x==-1 || currentFrame->y==-1)
+        {
+            currentFrame->x=currentFrame->y=0;
+        }
+        if(!client->isRootless())
+         {
+//             if(!disp)
             {
-                x=((ExtWin*)parentWidget)->adjustGeometry().x()+ev->rect().x();
-                y=((ExtWin*)parentWidget)->adjustGeometry().y()+ev->rect().y();
-//                 painter.drawPixmap(0,0,client->getDisplayPix(),((ExtWin*)parentWidget)->adjustGeometry().x(),((ExtWin*)parentWidget)->adjustGeometry().y(),ev->rect().width(),ev->rect().height());
-
-                #warning check this later
-                //this is making the window to flicker a bit, but it's the best I can do at the moment. We should try to get the displaypix not from the main image in
-                //x2gokdrive, but maybe directly from the window drawable to get the image not covered by windows on top and save it for every window separately
-                painter.drawPixmap(ev->rect().x(),ev->rect().y(), ev->rect().width(), ev->rect().height(),
-                                   client->getDisplayPix(), ev->rect().x()+((ExtWin*)parentWidget)->adjustGeometry().x(),
-                                   ev->rect().y()+((ExtWin*)parentWidget)->adjustGeometry().y(), ev->rect().width(), ev->rect().height());
+                painter.drawPixmap(currentFrame->x,currentFrame->y,pix);
+
             }
-//             Client::KDRStdErr()<<"Request update:"<<KDR_HEX<<((ExtWin*)parentWidget)->getExtWinId() <<KDR_DEC<<" "<<x<<":"<<y<<" - "<<width<<"x"<<height<<KDR_ENDL<<"====================="<<KDR_ENDL;
-            memcpy(evmsg,(char*)&etype,4);
-            memcpy(evmsg+4,(char*)&width,4);
-            memcpy(evmsg+8,(char*)&height,4);
-            memcpy(evmsg+12,(char*)&x,4);
-            memcpy(evmsg+16,(char*)&y,4);
-            if(client->isRootless())
+//             else
+//             {
+//                 painter.drawPixmap(currentFrame->x,currentFrame->y,pix,currentFrame->x,currentFrame->y,currentFrame->width,currentFrame->height);
+//                 dispImagePainter.drawPixmap(currentFrame->x,currentFrame->y,pix,currentFrame->x,currentFrame->y,currentFrame->width,currentFrame->height);
+//             }
+        }
+        else
+        {
+//             if(!disp)
             {
-                uint32_t win_id=(((ExtWin*)parentWidget)->getExtWinId());
-                memcpy(evmsg+20,(char*)&win_id,4);
+                painter.drawPixmap(currentFrame->x-((ExtWin*)parentWidget)->adjustGeometry().x(),currentFrame->y-((ExtWin*)parentWidget)->adjustGeometry().y(),pix);
             }
-            client->sendEvent(evmsg);
+//             else
+//             {
+//                 painter.drawPixmap(currentFrame->x-((ExtWin*)parentWidget)->adjustGeometry().x(),currentFrame->y-((ExtWin*)parentWidget)->adjustGeometry().y(),pix,
+//                                    currentFrame->x,currentFrame->y,ev->rect().width(),ev->rect().height());
+//                 dispImagePainter.drawPixmap(currentFrame->x-((ExtWin*)parentWidget)->adjustGeometry().x(),currentFrame->y-((ExtWin*)parentWidget)->adjustGeometry().y(),pix,
+//                                    currentFrame->x,currentFrame->y,ev->rect().width(),ev->rect().height());
+//             }
         }
-        painter.end();
     }
     else
-        Client::KDRStdErr()<<"DISPLAY PIX IS NULL"<<KDR_ENDL;
+    {
+        if(!client->isRootless())
+        {
+//             Client::KDRStdErr()<<"WM update: "<<Client::QRectToStr(ev->rect())<<KDR_ENDL;
+             painter.drawImage(ev->rect(),*(client->getDisplayImage()),ev->rect());
+        }
+        else
+        {
+             painter.drawImage(ev->rect().x(),ev->rect().y(),
+                               *(client->getDisplayImage()), ev->rect().x()+((ExtWin*)parentWidget)->adjustGeometry().x(),
+                              ev->rect().y()+((ExtWin*)parentWidget)->adjustGeometry().y(), ev->rect().width(), ev->rect().height());
+        }
+    }
+    painter.end();
 }
 
 uint32_t DisplayArea::X11MouseButtonsState(Qt::MouseButtons qtMouseButtons)
diff --git a/displayarea.h b/displayarea.h
index e32bc9b..b573b03 100644
--- a/displayarea.h
+++ b/displayarea.h
@@ -39,7 +39,6 @@ public:
     DisplayArea(Client* client, QWidget* parentWidget);
     ~DisplayArea();
 private:
-    QPainter* painter=0l;
     Client* client;
     QWidget* parentWidget;
 
diff --git a/menuframe.cpp b/menuframe.cpp
index 576185d..774b593 100644
--- a/menuframe.cpp
+++ b/menuframe.cpp
@@ -127,6 +127,8 @@ MenuFrame::MenuFrame(QWidget* parent, QMenu* menu):QFrame(parent)
      bDisc->setIcon(QIcon(":res/network-disconnect.svg"));
      Client* client=(Client*)parent;
      connect(bDisc, SIGNAL(clicked(bool)),client, SLOT(slotDisconnect()));
+     connect(bPin, SIGNAL(toggled(bool)), client, SLOT(saveDispImage()));
+
 
      bMin=new QToolButton(this);
      bMin->setToolTip(tr("Minimize"));

--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdriveclient.git


More information about the x2go-commits mailing list