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 1b656c77bf7f181cda1272046ccffce31d974b89 Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> Date: Thu Feb 3 10:07:28 2022 -0600 Focus handling --- client.cpp | 6 ++++-- extwin.cpp | 38 +++++++++++++++++++++++++++----------- extwin.h | 3 +++ 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/client.cpp b/client.cpp index 9e8aa29..d267821 100644 --- a/client.cpp +++ b/client.cpp @@ -1858,12 +1858,13 @@ void Client::changeWindow(ExtWin* win) uint32_t extWinId=win->getExtWinId(); uint32_t sibId=win->getNextSibId(); uint16_t x,y,w,h; + uint8_t focus=win->getHasFocus(); x=win->adjustGeometry().x(); y=win->adjustGeometry().y(); w=win->adjustGeometry().width(); h=win->adjustGeometry().height(); etype=WINCHANGE; - KDRStdErr()<<"Request change for "<<KDR_HEX<<extWinId<<KDR_ENDL; + // KDRStdErr()<<"Request change for "<<KDR_HEX<<extWinId<<KDR_ENDL; memcpy(evmsg,(char*)&etype,4); memcpy(evmsg+4,(char*)&extWinId,4); memcpy(evmsg+8,(char*)&sibId,4); @@ -1871,8 +1872,9 @@ void Client::changeWindow(ExtWin* win) memcpy(evmsg+14,(char*)&y,2); memcpy(evmsg+16,(char*)&w,2); memcpy(evmsg+18,(char*)&h,2); + memcpy(evmsg+20,(char*)&focus,1); sendEvent(evmsg); - QTimer::singleShot(1,win,SLOT(update())); +// QTimer::singleShot(1,win,SLOT(update())); } //requesting on demand selection diff --git a/extwin.cpp b/extwin.cpp index 354e212..6979da5 100644 --- a/extwin.cpp +++ b/extwin.cpp @@ -32,7 +32,6 @@ ExtWin::ExtWin(uint32_t extWinId, Client *client, QWidget* parent, Qt::WindowFla setWindowIcon(QIcon(":res/x2goclient.png")); this->extWinId=extWinId; this->client=client; - setFocusPolicy(Qt::StrongFocus); // QTimer::singleShot(10,this,SLOT(update())); switch(windowType) { @@ -49,6 +48,7 @@ ExtWin::ExtWin(uint32_t extWinId, Client *client, QWidget* parent, Qt::WindowFla setAttribute(Qt::WA_X11NetWmWindowTypeToolTip); break; } + setFocusPolicy(Qt::NoFocus); } void ExtWin::setWinSize(int w, int h) @@ -313,20 +313,36 @@ bool ExtWin::checkModality(QList<ExtWin*> &siblings) bool ExtWin::nativeEvent(const QByteArray &eventType, void *message, long *result) { - -/* if((windowType == WINDOW_TYPE_DROPDOWN_MENU)||(windowType == WINDOW_TYPE_POPUP_MENU)) + if((windowType == WINDOW_TYPE_DROPDOWN_MENU)||(windowType == WINDOW_TYPE_POPUP_MENU)) { - return QMainWindow::nativeEvent(eventType, message, result); - }*/ + return QMainWindow::nativeEvent(eventType, message, result); + } if(!eventType.compare("xcb_generic_event_t") && parentId==0) { slotCheckStackOrder(); - /* xcb_generic_event_t* ev = static_cast<xcb_generic_event_t *>(message); - - Client::KDRStdErr()<<"XCB EV "<<(ev->response_type & ~0x80) <<" "<<Client::QRectToStr(geometry())<<KDR_ENDL; - return QMainWindow::nativeEvent(eventType, message, result);*/ - -// Client::KDRStdErr()<<"Check win: "<<KDR_HEX<<extWinPtr<<KDR_ENDL; + // if(windowType == WINDOW_TYPE_DROPDOWN_MENU || windowType == WINDOW_TYPE_POPUP_MENU) + { + 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; + if(!hasFocus()) + { + setHasFocus(true); + client->changeWindow(this); + } + break; + case XCB_FOCUS_OUT: + Client::KDRStdErr()<<"FOCUS OUT "<<KDR_HEX<<extWinId<<KDR_ENDL; + if(hasFocus()) + { + setHasFocus(false); + client->changeWindow(this); + } + break; + } + } } return QMainWindow::nativeEvent(eventType, message, result); } diff --git a/extwin.h b/extwin.h index b9fad18..74047f2 100644 --- a/extwin.h +++ b/extwin.h @@ -49,6 +49,8 @@ public: DisplayArea* getDisplayArea(){return displayArea;} void setModality(int mod){modality=mod;} QRect adjustGeometry(); + void setHasFocus( bool f){focus=f;} + uint8_t getHasFocus(){return focus;} private: ExtWin* findWinByTopWinId(xcb_window_t topWinId, QList<ExtWin*> &siblings); @@ -64,6 +66,7 @@ private: xcb_window_t topWinId=0; int zOrderInd; int modality=MOD_NONE; + bool focus=0; private slots: void slotCheckStackOrder(); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdriveclient.git