This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch feature/rootless-mode in repository x2gokdrive. commit cd6bb1d38399f84642ac620855d5e38a06c9a580 Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> Date: Wed Feb 9 15:08:25 2022 -0600 Handling minimizing windows. --- x2gokdriveremote.c | 54 ++++++++++++++++++++++++++++++++++++++++++++---------- x2gokdriveremote.h | 7 +++++-- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/x2gokdriveremote.c b/x2gokdriveremote.c index 59d18db..58b262b 100644 --- a/x2gokdriveremote.c +++ b/x2gokdriveremote.c @@ -2586,11 +2586,6 @@ clientReadNotify(int fd, int ready, void *data) client_win_change(buff); break; } - case WINCLOSE: - { - client_win_close(buff); - break; - } default: { EPHYR_DBG("UNSUPPORTED EVENT: %d",event_type); @@ -2652,12 +2647,11 @@ ReflectStackChange(WindowPtr pWin, WindowPtr pSib, VTKind kind) WindowsRestructured(); } -void client_win_close(char* buff) +void client_win_close(uint32_t winId) { WindowPtr pWin; - uint32_t winId=*((uint32_t*)(buff+4)); xEvent e; -// EPHYR_DBG("Client request win close: 0x%x",winId); + // EPHYR_DBG("Client request win close: 0x%x",winId); pWin=remote_find_window_on_screen_by_id(winId, remoteVars.ephyrScreen->pScreen->root); if(!pWin) { @@ -2676,6 +2670,29 @@ void client_win_close(char* buff) DeliverEvents(pWin, &e, 1, NullWindow); } +void client_win_iconify(uint32_t winId) +{ + WindowPtr pWin; + xEvent e; + EPHYR_DBG("Client request win iconify: 0x%x",winId); + pWin=remote_find_window_on_screen_by_id(winId, remoteVars.ephyrScreen->pScreen->root); + if(!pWin) + { + EPHYR_DBG("Window with ID 0x%X not found on current screen",winId); + return; + } + e.u.u.type = ClientMessage; + e.u.u.detail = 32; + e.u.clientMessage.window = winId; + e.u.clientMessage.u.l.type = MakeAtom("WM_CHANGE_STATE",strlen("WM_CHANGE_STATE"),FALSE); + e.u.clientMessage.u.l.longs0 = 3;//iconicState + e.u.clientMessage.u.l.longs1 = 0; + e.u.clientMessage.u.l.longs2 = 0; + e.u.clientMessage.u.l.longs3 = 0; + e.u.clientMessage.u.l.longs4 = 0; + DeliverEvents(pWin->parent, &e, 1, NullWindow); +} + void client_win_change(char* buff) { @@ -2690,8 +2707,9 @@ void client_win_change(char* buff) uint16_t nw=*((int16_t*)(buff+16)); uint16_t nh=*((int16_t*)(buff+18)); uint8_t focus=*((int8_t*)(buff+20)); - + uint8_t newstate=*((int8_t*)(buff+21)); BOOL move=FALSE, resize=FALSE, restack=FALSE; + // EPHYR_DBG("Client request win change: %p %d:%d %dx%d",fptr, nx,ny,nw,nh); pWin=remote_find_window_on_screen_by_id(winId, remoteVars.ephyrScreen->pScreen->root); if(!pWin) @@ -2700,6 +2718,18 @@ void client_win_change(char* buff) return; } + if(newstate==WIN_DELETED) + { + client_win_close(winId); + return; + } + if(newstate==WIN_ICONIFIED) + { + client_win_iconify(winId); + ReflectStackChange(pWin, 0, VTOther); + return; + } + pParent = pWin->parent; pSib=0; if(newSibId) @@ -4014,7 +4044,11 @@ void remote_check_window(WindowPtr win) } } } -/* if(prop->propertyName==MakeAtom("WM_NAME", strlen("WM_NAME"),FALSE) && prop->data) + if(prop->propertyName==MakeAtom("WM_STATE", strlen("WM_STATE"),FALSE) && prop->data) + { + EPHYR_DBG("-- WM_STATE: %d",*((uint32_t*)(prop->data))); + } + /* if(prop->propertyName==MakeAtom("WM_NAME", strlen("WM_NAME"),FALSE) && prop->data) { // EPHYR_DBG("-- Name: %s",(char*)prop->data); } diff --git a/x2gokdriveremote.h b/x2gokdriveremote.h index 6e07a67..eb67378 100644 --- a/x2gokdriveremote.h +++ b/x2gokdriveremote.h @@ -133,6 +133,9 @@ enum WinType{WINDOW_TYPE_DESKTOP, WINDOW_TYPE_DOCK, WINDOW_TYPE_TOOLBAR, WINDOW_ WINDOW_TYPE_DIALOG, WINDOW_TYPE_DROPDOWN_MENU, WINDOW_TYPE_POPUP_MENU, WINDOW_TYPE_TOOLTIP, WINDOW_TYPE_NOTIFICATION, WINDOW_TYPE_COMBO, WINDOW_TYPE_DND, WINDOW_TYPE_NORMAL}; +//new state requested by WINCHANGE event +enum WinState{WIN_UNCHANGED, WIN_DELETED, WIN_ICONIFIED}; + //Size of 1 window update (new or changed window) = 4xwinId + type of update + 7 coordinates + visibility + type of window + size of name buffer + icon_size #define WINUPDSIZE 4*sizeof(uint32_t) + sizeof(int8_t) + 7*sizeof(int16_t) + sizeof(int8_t) + sizeof(int8_t) + sizeof(int16_t) + sizeof(int32_t) //Size of 1 window update (deleted window) = winId + type of update @@ -163,7 +166,6 @@ enum WinType{WINDOW_TYPE_DESKTOP, WINDOW_TYPE_DOCK, WINDOW_TYPE_TOOLBAR, WINDOW_ #define KEEPALIVE 12 #define CACHEREBUILD 13 #define WINCHANGE 14 -#define WINCLOSE 15 #define EVLENGTH 41 @@ -558,7 +560,8 @@ WindowPtr remote_find_window_on_screen_by_id(uint32_t winId, WindowPtr root); void remote_process_window_updates(void); void send_reinit_notification(void); void client_win_change(char* buff); -void client_win_close(char* buff); +void client_win_close(uint32_t winId); +void client_win_iconify(uint32_t winId); void remote_check_rootless_windows_for_updates(KdScreenInfo *screen); #endif /* X2GOKDRIVE_REMOTE_H */ -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdrive.git