This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch feature/rootless-mode in repository x2gokdriveclient. from 9d1e363 Handling WM_DELETE_WINDOW new e8fbd77 Handling minimizing windows. The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Summary of changes: client.cpp | 16 +++------------- client.h | 5 ++--- extwin.cpp | 43 +++++++++++++++++++++++++++++++------------ 3 files changed, 36 insertions(+), 28 deletions(-) -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdriveclient.git
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