[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