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 e8fbd7782e4a09a7c6ee1ad1ff2fc603a669890d Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> Date: Wed Feb 9 15:09:41 2022 -0600 Handling minimizing windows. --- client.cpp | 16 +++------------- client.h | 5 ++--- extwin.cpp | 43 +++++++++++++++++++++++++++++++------------ 3 files changed, 36 insertions(+), 28 deletions(-) diff --git a/client.cpp b/client.cpp index 0d447b2..fcbaee5 100644 --- a/client.cpp +++ b/client.cpp @@ -1217,6 +1217,7 @@ void Client::getWinUpdateBuffer() { case WINDOW_TYPE_DIALOG: flags=Qt::Dialog; + KDRStdErr()<<"new win: "<<KDR_HEX<<extWinId<<" Setting dialog flags"; break; case WINDOW_TYPE_SPLASH: flags=Qt::SplashScreen; @@ -1896,7 +1897,7 @@ void Client::sendClientVersion() } -void Client::changeWindow(ExtWin* win) +void Client::changeWindow(ExtWin* win, uint8_t newState) { char evmsg[EVLENGTH]{}; uint32_t etype; @@ -1918,22 +1919,11 @@ void Client::changeWindow(ExtWin* win) memcpy(evmsg+16,(char*)&w,2); memcpy(evmsg+18,(char*)&h,2); memcpy(evmsg+20,(char*)&focus,1); + memcpy(evmsg+21,(char*)&newState,1); sendEvent(evmsg); // QTimer::singleShot(1,win,SLOT(update())); } -//request window closing -void Client::closeWindow(ExtWin* win) -{ - char evmsg[EVLENGTH]{}; - uint32_t etype; - uint32_t extWinId=win->getExtWinId(); - etype=WINCLOSE; - memcpy(evmsg,(char*)&etype,4); - memcpy(evmsg+4,(char*)&extWinId,4); - sendEvent(evmsg); -} - //requesting on demand selection void Client::requestSelectionFromServer(SelectionType sel) { diff --git a/client.h b/client.h index 976c815..079cd4c 100644 --- a/client.h +++ b/client.h @@ -62,7 +62,6 @@ enum OS_VERSION{OS_LINUX, OS_WINDOWS, OS_DARWIN}; #define KEEPALIVE 12 #define CACHEREBUILD 13 #define WINCHANGE 14 -#define WINCLOSE 15 #define ShiftMask (1<<0) #define LockMask (1<<1) @@ -83,6 +82,7 @@ enum OS_VERSION{OS_LINUX, OS_WINDOWS, OS_DARWIN}; enum SelectionMime{STRING,UTF_STRING,PIXMAP}; +enum WinState{UNCHANGED, DELETED, ICONIFIED}; enum SelectionType{PRIMARY,CLIPBOARD}; enum ClipboardMode{CLIP_BOTH, CLIP_SERVER, CLIP_CLIENT, CLIP_NONE}; @@ -195,8 +195,7 @@ public: static QTextStream& KDRStdErr(bool dbg=true); static QString QRectToStr(const QRect& rec); static QString QSizeToStr(const QSizeF& sz); - void changeWindow(ExtWin* win); - void closeWindow(ExtWin* win); + void changeWindow(ExtWin* win, uint8_t newState=UNCHANGED); bool isRootless(){return rootless;} const QList<ExtWin*> getExtWindows(){return extWindows;} const QList<ExtWin*> getSiblings(ExtWin* win); diff --git a/extwin.cpp b/extwin.cpp index 5d99b66..ea9c3a7 100644 --- a/extwin.cpp +++ b/extwin.cpp @@ -24,6 +24,7 @@ #include <QTimer> #include <QCloseEvent> + ExtWin::ExtWin(uint32_t extWinId, Client *client, QWidget* parent, Qt::WindowFlags flags): QMainWindow(parent, flags) { displayArea=new DisplayArea((Client*)client,this); @@ -76,7 +77,7 @@ void ExtWin::closeEvent(QCloseEvent* ev) if((windowType == WINDOW_TYPE_NORMAL)||(windowType == WINDOW_TYPE_DIALOG)) { Client::KDRStdErr()<<"Request window close "; - client->closeWindow(this); + client->changeWindow(this,DELETED); ev->ignore(); } } @@ -93,16 +94,33 @@ void ExtWin::resizeEvent(QResizeEvent* ev) void ExtWin::showEvent(QShowEvent *ev) { - Client::KDRStdErr()<<"Show "<<Client::QRectToStr(geometry())<<KDR_ENDL; QMainWindow::showEvent(ev); + if((windowType == WINDOW_TYPE_NORMAL)||(windowType == WINDOW_TYPE_DIALOG)) + { + Client::KDRStdErr()<<"Show "<<Client::QRectToStr(geometry())<<KDR_ENDL; + foreach(ExtWin* w, client->getExtWindows()) + { + if(w->transWinId==extWinId) + w->raise(); + } + QTimer::singleShot(5,this,SLOT(slotCheckStackOrder())); + } } void ExtWin::hideEvent(QHideEvent *ev) { QMainWindow::hideEvent(ev); - if(isMinimized()) + if(((windowType == WINDOW_TYPE_NORMAL)||(windowType == WINDOW_TYPE_DIALOG))&&isMinimized()) { - Client::KDRStdErr()<<"Minimized "<<Client::QRectToStr(geometry())<<KDR_ENDL; + Client::KDRStdErr()<<"Request window minimize"; + client->changeWindow(this,ICONIFIED); + foreach(ExtWin* w, client->getExtWindows()) + { + if(w->transWinId==extWinId) + w->showMinimized(); + if(w->extWinId==transWinId) + w->showMinimized(); + } } } @@ -246,31 +264,30 @@ void ExtWin::slotCheckStackOrder() { xcb_window_t *children = xcb_query_tree_children(reply); int z=0; + int negative_z=0; // Client::KDRStdErr()<<"Current stack for parent: "<<KDR_ENDL; for (int i = 0; i < xcb_query_tree_children_length(reply); i++) { ExtWin* win=findWinByTopWinId(children[i], siblings); if(win) { - win->zOrderInd=z++; + if(!win->isMinimized()) + win->zOrderInd=z++; + else + win->zOrderInd=--negative_z; // Client::KDRStdErr()<<win->zOrderInd<<" - "<<KDR_HEX<< win->extWinId<<" "<<win->windowTitle()<<"->"; } } free(reply); // Client::KDRStdErr()<<"End of stack "<<KDR_ENDL; uint32_t newNextSib; - if(zOrderInd==0) + ExtWin* win=findWinByZInd(zOrderInd-1, siblings); + if(!win) { newNextSib=0; } else { - ExtWin* win=findWinByZInd(zOrderInd-1, siblings); - if(!win) - { - Client::KDRStdErr()<<"Error finding window with z-order "<<zOrderInd-1<<KDR_ENDL; - return ; - } newNextSib=win->extWinId; } if(nextSibId != newNextSib) @@ -295,6 +312,8 @@ void ExtWin::slotCheckStackOrder() bool ExtWin::checkModality(QList<ExtWin*> &siblings) { + if(isMinimized()) + return true; bool mod_res=true; for(int i=0;i<siblings.count();++i) -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdriveclient.git