[X2Go-Commits] [x2gokdriveclient] 01/01: Support for MS Windows in rootless mode.

git-admin at x2go.org git-admin at x2go.org
Fri Feb 11 18:13:12 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 468c632a0ba1131625561f86cacbc1a4e3369147
Author: Oleksandr Shneyder <o.shneyder at phoca-gmbh.de>
Date:   Fri Feb 11 11:12:53 2022 -0600

    Support for MS Windows in rootless mode.
---
 client.cpp |  14 ++------
 client.h   |   1 -
 extwin.cpp | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++--------
 extwin.h   |   7 ++++
 4 files changed, 103 insertions(+), 26 deletions(-)

diff --git a/client.cpp b/client.cpp
index fcbaee5..dd43279 100644
--- a/client.cpp
+++ b/client.cpp
@@ -1097,15 +1097,6 @@ void Client::getDeletedCursorsList()
     freeMessageBuffer();
 }
 
-ExtWin* Client::getExtWin(uint32_t id)
-{
-    foreach( ExtWin* win, extWindows)
-    {
-        if(win->getExtWinId()==id)
-            return win;
-    }
-    return NULL;
-}
 ExtWin* Client::findExtWinById(uint32_t extWinId)
 {
     for(QList<ExtWin*>::iterator j=extWindows.begin(); j!=extWindows.end(); ++j)
@@ -1133,7 +1124,7 @@ void Client::getWinUpdateBuffer()
         ExtWin* win;
         if(state!=2)
         {
-            win=getExtWin(extWinId);
+            win=findExtWinById(extWinId);
             if(!win)
             {
                 KDRStdErr()<<"Error: update Wind "<<KDR_HEX<<extWinId<<" not found in the list"<<KDR_DEC<<KDR_ENDL;
@@ -1215,7 +1206,9 @@ void Client::getWinUpdateBuffer()
                 Qt::WindowFlags flags;
                 switch(winType)
                 {
+                    case WINDOW_TYPE_UTILITY:
                     case WINDOW_TYPE_DIALOG:
+                        winType=WINDOW_TYPE_DIALOG;
                         flags=Qt::Dialog;
                         KDRStdErr()<<"new win: "<<KDR_HEX<<extWinId<<" Setting dialog flags";
                         break;
@@ -1225,7 +1218,6 @@ void Client::getWinUpdateBuffer()
                     case WINDOW_TYPE_COMBO:
                     case WINDOW_TYPE_POPUP_MENU:
                     case WINDOW_TYPE_DROPDOWN_MENU:
-                    case WINDOW_TYPE_UTILITY:
                         flags=Qt::Window|Qt::FramelessWindowHint|Qt::BypassWindowManagerHint|Qt::X11BypassWindowManagerHint|Qt::WindowStaysOnTopHint;
                         break;
                     case WINDOW_TYPE_TOOLTIP:
diff --git a/client.h b/client.h
index 079cd4c..ad87a8e 100644
--- a/client.h
+++ b/client.h
@@ -276,7 +276,6 @@ private:
 #endif
     void parseOptions();
     void initDesktopMode();
-    ExtWin* getExtWin(uint32_t id);
 
     static bool debug;
     //initial values
diff --git a/extwin.cpp b/extwin.cpp
index ea9c3a7..4fe46d9 100644
--- a/extwin.cpp
+++ b/extwin.cpp
@@ -36,6 +36,7 @@ ExtWin::ExtWin(uint32_t extWinId, Client *client, QWidget* parent, Qt::WindowFla
     this->extWinId=extWinId;
     this->client=client;
 //     QTimer::singleShot(10,this,SLOT(update()));
+#ifdef Q_OS_LINUX
     switch(windowType)
     {
         case WINDOW_TYPE_DROPDOWN_MENU:
@@ -54,6 +55,7 @@ ExtWin::ExtWin(uint32_t extWinId, Client *client, QWidget* parent, Qt::WindowFla
             setAttribute(Qt::WA_X11NetWmWindowTypeUtility);
             break;
     }
+#endif
     setFocusPolicy(Qt::NoFocus);
 }
 
@@ -66,7 +68,7 @@ void ExtWin::moveEvent(QMoveEvent* ev)
 {
     if((windowType == WINDOW_TYPE_NORMAL)||(windowType == WINDOW_TYPE_DIALOG))
     {
-        Client::KDRStdErr()<<"Move "<<Client::QRectToStr(geometry())<<KDR_ENDL;
+//         Client::KDRStdErr()<<"Move "<<Client::QRectToStr(geometry())<<KDR_ENDL;
         client->changeWindow(this);
     }
     QMainWindow::moveEvent(ev);
@@ -86,7 +88,7 @@ void ExtWin::resizeEvent(QResizeEvent* ev)
 {
     if((windowType == WINDOW_TYPE_NORMAL)||(windowType == WINDOW_TYPE_DIALOG))
     {
-        Client::KDRStdErr()<<"Resize "<<Client::QRectToStr(geometry())<<KDR_ENDL;
+//         Client::KDRStdErr()<<"Resize "<<Client::QRectToStr(geometry())<<KDR_ENDL;
         client->changeWindow(this);
     }
     QMainWindow::resizeEvent(ev);
@@ -97,7 +99,7 @@ void ExtWin::showEvent(QShowEvent *ev)
     QMainWindow::showEvent(ev);
     if((windowType == WINDOW_TYPE_NORMAL)||(windowType == WINDOW_TYPE_DIALOG))
     {
-        Client::KDRStdErr()<<"Show "<<Client::QRectToStr(geometry())<<KDR_ENDL;
+//         Client::KDRStdErr()<<"Show "<<Client::QRectToStr(geometry())<<KDR_ENDL;
         foreach(ExtWin* w, client->getExtWindows())
         {
             if(w->transWinId==extWinId)
@@ -112,7 +114,7 @@ void ExtWin::hideEvent(QHideEvent *ev)
     QMainWindow::hideEvent(ev);
     if(((windowType == WINDOW_TYPE_NORMAL)||(windowType == WINDOW_TYPE_DIALOG))&&isMinimized())
     {
-        Client::KDRStdErr()<<"Request window minimize";
+//         Client::KDRStdErr()<<"Request window minimize";
         client->changeWindow(this,ICONIFIED);
         foreach(ExtWin* w, client->getExtWindows())
         {
@@ -136,6 +138,7 @@ void ExtWin::focusOutEvent(QFocusEvent *ev)
     QMainWindow::focusOutEvent(ev);
 }
 
+#ifdef Q_OS_LINUX
 xcb_window_t getRootNativeId(xcb_window_t winId)
 {
     xcb_query_tree_cookie_t cookie;
@@ -214,6 +217,21 @@ ExtWin* ExtWin::findWinByTopWinId(xcb_window_t topWinId, QList<ExtWin*> &sibling
     return 0;
 }
 
+#endif //Q_OS_LINUX
+#ifdef Q_OS_WIN
+ExtWin* ExtWin::findWinByHWND(HWND hwnd, QList<ExtWin*> &siblings)
+{
+    for(int i=0; i< siblings.count(); ++i)
+    {
+        if((HWND)(siblings[i]->winId())==hwnd)
+        {
+            return siblings[i];
+        }
+    }
+    return 0;
+}
+#endif
+
 ExtWin* ExtWin::findWinByZInd(int zInd, QList<ExtWin*> &siblings)
 {
     for(int i=0; i< siblings.count(); ++i)
@@ -247,13 +265,18 @@ QRect ExtWin::adjustGeometry()
 
 void ExtWin::slotCheckStackOrder()
 {
+    #ifdef Q_OS_WIN
+    if(!isVisible())
+        return;
+    #endif //Q_OS_WIN
     QList<ExtWin*> siblings=client->getSiblings(this);
-    //         Client::KDRStdErr()<<"Have Siblings: "<<siblings.count()<<KDR_ENDL;
+//     Client::KDRStdErr()<<"Have Siblings: "<<siblings.count()<<KDR_ENDL;
     if(siblings.count())
     {
+        siblings<<this;
+        #ifdef Q_OS_LINUX
         xcb_window_t commonParent=getCommonParent(this->winId(), siblings[0]->winId());
         //             Client::KDRStdErr()<<"common parent: "<<KDR_HEX<<commonParent<<KDR_ENDL;
-        siblings<<this;
         xcb_connection_t *connection = QX11Info::connection();
         xcb_query_tree_cookie_t cookie;
         xcb_query_tree_reply_t *reply;
@@ -263,22 +286,46 @@ void ExtWin::slotCheckStackOrder()
         if ((reply = xcb_query_tree_reply(connection, cookie, NULL)))
         {
             xcb_window_t *children = xcb_query_tree_children(reply);
+        #endif //Q_OS_LINUX
             int z=0;
             int negative_z=0;
             //                 Client::KDRStdErr()<<"Current stack for parent: "<<KDR_ENDL;
+        #ifdef Q_OS_LINUX
             for (int i = 0; i < xcb_query_tree_children_length(reply); i++)
             {
                 ExtWin* win=findWinByTopWinId(children[i], siblings);
+        #endif //Q_OS_LINUX
+        #ifdef Q_OS_WIN
+            HWND w=GetTopWindow(NULL);
+            while (w)
+            {
+                ExtWin* win=findWinByHWND(w, siblings);
+                w=GetNextWindow(w,GW_HWNDNEXT);
+        #endif //Q_OS_WIN
                 if(win)
                 {
                     if(!win->isMinimized())
                         win->zOrderInd=z++;
                     else
                         win->zOrderInd=--negative_z;
-                    //                         Client::KDRStdErr()<<win->zOrderInd<<" - "<<KDR_HEX<< win->extWinId<<" "<<win->windowTitle()<<"->";
+//                     Client::KDRStdErr()<<win->zOrderInd<<" - "<<KDR_HEX<< win->extWinId<<" "<<win->windowTitle()<<KDR_ENDL;
                 }
             }
+#ifdef Q_OS_WIN
+            //need to invert z-order for visible windows (to make it like in Linux)
+            for(int i=0;i<siblings.count();++i)
+            {
+                if(siblings[i]->zOrderInd>=0)
+                {
+                    siblings[i]->zOrderInd=(z-1)-siblings[i]->zOrderInd;
+                }
+//                 Client::KDRStdErr()<<siblings[i]->zOrderInd<<" - "<<KDR_HEX<< siblings[i]->extWinId<<" "<<siblings[i]->windowTitle()<<KDR_ENDL;
+            }
+
+#endif //Q_OS_WIN
+            #ifdef Q_OS_LINUX
             free(reply);
+            #endif //Q_OS_LINUX
             //                 Client::KDRStdErr()<<"End of stack "<<KDR_ENDL;
             uint32_t newNextSib;
             ExtWin* win=findWinByZInd(zOrderInd-1, siblings);
@@ -302,12 +349,10 @@ void ExtWin::slotCheckStackOrder()
                 nextSibId=newNextSib;
                 client->changeWindow(this);
             }
-            /*else
-             *               {
-             *                    Client::KDRStdErr()<<"Stack order is ok"<<KDR_ENDL;
-        }*/
         }
+#ifdef Q_OS_LINUX
     }
+#endif
 }
 
 bool ExtWin::checkModality(QList<ExtWin*> &siblings)
@@ -337,6 +382,7 @@ bool ExtWin::checkModality(QList<ExtWin*> &siblings)
 //                         QTimer::singleShot(2,w,SLOT(update()));
 //                         trwin->update();
                         w->raise();
+                        w->activateWindow();
                         mod_res=false;
                     }
                 }
@@ -349,16 +395,17 @@ bool ExtWin::checkModality(QList<ExtWin*> &siblings)
 
 bool ExtWin::nativeEvent(const QByteArray &eventType, void *message, long *result)
 {
+#ifdef Q_OS_LINUX
     if((windowType == WINDOW_TYPE_NORMAL)||(windowType == WINDOW_TYPE_DIALOG))
     {
         if(!eventType.compare("xcb_generic_event_t") && parentId==0)
         {
-            slotCheckStackOrder();
             xcb_generic_event_t* ev = static_cast<xcb_generic_event_t *>(message);
             switch((ev->response_type & ~0x80))
             {
                 case XCB_FOCUS_IN:
-                    Client::KDRStdErr()<<"FOCUS IN "<<KDR_HEX<<extWinId<<KDR_ENDL;
+                    slotCheckStackOrder();
+//                     Client::KDRStdErr()<<"FOCUS IN "<<KDR_HEX<<extWinId<<KDR_ENDL;
                     if(!hasFocus())
                     {
                         setHasFocus(true);
@@ -366,7 +413,38 @@ bool ExtWin::nativeEvent(const QByteArray &eventType, void *message, long *resul
                     }
                     break;
                 case XCB_FOCUS_OUT:
-                    Client::KDRStdErr()<<"FOCUS OUT "<<KDR_HEX<<extWinId<<KDR_ENDL;
+                    slotCheckStackOrder();
+//                     Client::KDRStdErr()<<"FOCUS OUT "<<KDR_HEX<<extWinId<<KDR_ENDL;
+                    if(hasFocus())
+                    {
+                        setHasFocus(false);
+                        client->changeWindow(this);
+                    }
+                    break;
+            }
+        }
+    }
+#endif //Q_OS_LINUX
+#ifdef Q_OS_WIN
+    if((windowType == WINDOW_TYPE_NORMAL)||(windowType == WINDOW_TYPE_DIALOG))
+    {
+        if(!eventType.compare("windows_generic_MSG") && parentId==0)
+        {
+            MSG* ev = static_cast<MSG *>(message);
+            switch((ev->message))
+            {
+                case WM_SETFOCUS:
+                    slotCheckStackOrder();
+//                     Client::KDRStdErr()<<"FOCUS IN "<<KDR_HEX<<extWinId<<KDR_ENDL;
+                    if(!hasFocus())
+                    {
+                        setHasFocus(true);
+                        client->changeWindow(this);
+                    }
+                    break;
+                case WM_KILLFOCUS:
+                    slotCheckStackOrder();
+//                     Client::KDRStdErr()<<"FOCUS OUT "<<KDR_HEX<<extWinId<<KDR_ENDL;
                     if(hasFocus())
                     {
                         setHasFocus(false);
@@ -376,5 +454,6 @@ bool ExtWin::nativeEvent(const QByteArray &eventType, void *message, long *resul
             }
         }
     }
+#endif
     return QMainWindow::nativeEvent(eventType, message, result);
 }
diff --git a/extwin.h b/extwin.h
index f13279a..175edd2 100644
--- a/extwin.h
+++ b/extwin.h
@@ -53,7 +53,12 @@ public:
     uint8_t getHasFocus(){return focus;}
 
 private:
+#ifdef Q_OS_LINUX
     ExtWin* findWinByTopWinId(xcb_window_t topWinId, QList<ExtWin*> &siblings);
+#endif
+#ifdef Q_OS_WIN
+    ExtWin* findWinByHWND(HWND hwnd, QList<ExtWin*> &siblings);
+#endif
     ExtWin* findWinByZInd(int zInd, QList<ExtWin*> &siblings);
     bool checkModality(QList<ExtWin*> &siblings);
     DisplayArea* displayArea;
@@ -63,7 +68,9 @@ private:
     uint32_t nextSibId=0;
     uint32_t transWinId=0;
     uint8_t windowType=WINDOW_TYPE_NORMAL;
+#ifdef Q_OS_LINUX
     xcb_window_t topWinId=0;
+#endif
     int zOrderInd;
     int modality=MOD_NONE;
     bool focus=0;

--
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