From: Steven P. <bj...@us...> - 2008-03-27 08:59:22
|
Update of /cvsroot/virtuawin In directory sc8-pr-cvs9.sourceforge.net:/tmp/cvs-serv12592 Modified Files: Defines.h Messages.h VirtuaWin.c Log Message: 1926160 Stored flag for forced unmanaged windows and made its children unmanaged. 1926899 Added new VW_WINMANAGE module message to allow modules to force VW to (not) manage a window Index: Defines.h =================================================================== RCS file: /cvsroot/virtuawin/Defines.h,v retrieving revision 1.46 retrieving revision 1.47 diff -u -d -r1.46 -r1.47 --- Defines.h 13 Mar 2008 21:43:15 -0000 1.46 +++ Defines.h 27 Mar 2008 08:59:20 -0000 1.47 @@ -101,6 +101,7 @@ #define vwWINFLAGS_SHOW 0x00000200 #define vwWINFLAGS_NO_TASKBAR_BUT 0x00000400 #define vwWINFLAGS_RM_TASKBAR_BUT 0x00000800 +#define vwWINFLAGS_FORCE_NOT_MNGD vwWTFLAGS_STICKY #define vwWINFLAGS_STICKY vwWTFLAGS_STICKY #define vwWINFLAGS_MOVE vwWTFLAGS_MOVE #define vwWINFLAGS_MOVE_IMMEDIATE vwWTFLAGS_MOVE_IMMEDIATE Index: Messages.h =================================================================== RCS file: /cvsroot/virtuawin/Messages.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- Messages.h 28 Feb 2008 22:48:03 -0000 1.21 +++ Messages.h 27 Mar 2008 08:59:20 -0000 1.22 @@ -40,67 +40,67 @@ *************************************************************************/ /* Message, switch to a specified desktop, sent with following lParam or 1..vwDESKTOP_MAX */ -#define VW_CHANGEDESK (WM_USER + 10) -#define VW_STEPPREV (WM_USER + 1) -#define VW_STEPNEXT (WM_USER + 2) -#define VW_STEPLEFT (WM_USER + 11) -#define VW_STEPRIGHT (WM_USER + 12) -#define VW_STEPUP (WM_USER + 13) -#define VW_STEPDOWN (WM_USER + 14) +#define VW_CHANGEDESK (WM_USER + 10) +#define VW_STEPPREV (WM_USER + 1) +#define VW_STEPNEXT (WM_USER + 2) +#define VW_STEPLEFT (WM_USER + 11) +#define VW_STEPRIGHT (WM_USER + 12) +#define VW_STEPUP (WM_USER + 13) +#define VW_STEPDOWN (WM_USER + 14) /* Message, close VirtuaWin */ -#define VW_CLOSE (WM_USER + 15) +#define VW_CLOSE (WM_USER + 15) /* Message, display setup dialog */ -#define VW_SETUP (WM_USER + 16) +#define VW_SETUP (WM_USER + 16) /* Message, remove the systray icon */ -#define VW_DELICON (WM_USER + 17) +#define VW_DELICON (WM_USER + 17) /* Message, displays the systray icon */ -#define VW_SHOWICON (WM_USER + 18) +#define VW_SHOWICON (WM_USER + 18) /* Message, bring up the help */ -#define VW_HELP (WM_USER + 19) +#define VW_HELP (WM_USER + 19) /* Message, gather all windows */ -#define VW_GATHER (WM_USER + 20) +#define VW_GATHER (WM_USER + 20) /* Message, retuns desktop width */ -#define VW_DESKX (WM_USER + 21) +#define VW_DESKX (WM_USER + 21) /* Message, retuns desktop height */ -#define VW_DESKY (WM_USER + 22) +#define VW_DESKY (WM_USER + 22) /* Message, request the window list from VirtuaWin. List will be returned via a WM_COPYDATA * message, set wParam to the HWND which is to receive the WM_COPYDATA message */ -#define VW_WINLIST (WM_USER + 23) +#define VW_WINLIST (WM_USER + 23) /* Message, returns the current desktop number */ -#define VW_CURDESK (WM_USER + 24) +#define VW_CURDESK (WM_USER + 24) /* Message, assign a window to the specified desktop wParam is the window * handle (HWND, 0 for foreground window) and lParam is either VW_STEP* (see * 6 defines above) or the desktop number. If desk is -ve window is assigned * to desk (-lParam) and Vw change to the desk. Returns 0 if window was not * found (i.e. not managed by VW), non-zero otherwise */ -#define VW_ASSIGNWIN (WM_USER + 25) +#define VW_ASSIGNWIN (WM_USER + 25) /* Message, set the sticky state of a window. wParam is the window handle * (HWND, 0 for foreground window) and lParam should be -1 for toggle, 0 for * unset and 1 for set sticky state. */ -#define VW_SETSTICKY (WM_USER + 26) +#define VW_SETSTICKY (WM_USER + 26) /* Message, make a window the foreground, only if visible wParam is the window handle (HWND) */ -#define VW_FOREGDWIN (WM_USER + 27) +#define VW_FOREGDWIN (WM_USER + 27) /* Message, return VirtuaWin's installation path. The path will be returned via a WM_COPYDATA * message, set wParam to the HWND which is to receive the WM_COPYDATA message */ -#define VW_INSTALLPATH (WM_USER + 28) +#define VW_INSTALLPATH (WM_USER + 28) /* Message, return VirtuaWin's user application data path. The path will be returned via a * WM_COPYDATA message, set wParam to the HWND which is to receive the WM_COPYDATA message */ -#define VW_USERAPPPATH (WM_USER + 29) +#define VW_USERAPPPATH (WM_USER + 29) /* Message, access a window, wParam is the window handle (HWND) and lParam is the method: 0 - Use user's 'On hidden window activation' preference (ignore -> move) 1 - Move window to this desk 2 - Show window to this disk 3 - Change to window's desk Returns 0 if window was not found (i.e. not managed by VW), non-zero otherwise */ -#define VW_ACCESSWIN (WM_USER + 39) +#define VW_ACCESSWIN (WM_USER + 39) /* Message, return the information VW has on the window given via wParam. 0 is returned if the * window is not found, otherwise use the 2 macros to extract the window flags (see vwWINFLAGS_* * defines in Defines.h, the hide method flags are not given) and the windows desk. To check * if a window is hung do: * if(((vwGetWindowInfoFlags(ii) & vwWINFLAGS_SHOWN) == 0) ^ ((vwGetWindowInfoFlags(ii) & vwWINFLAGS_SHOW) == 0)) */ -#define VW_WINGETINFO (WM_USER + 40) +#define VW_WINGETINFO (WM_USER + 40) #define vwWindowGetInfoFlags(ii) ((ii) & 0x00ffffff) #define vwWindowGetInfoDesk(ii) (((ii) >> 24) & 0x00ff) /* Message, Desk image generation message, the action of the message depends on the @@ -130,7 +130,9 @@ * quickly obtain the maximum size of any desk based array, i.e. guaranteed to be greater * than the current desktop. Note the this is not true of (DESKX * DESKY) due to hidden desktops. */ #define VW_DESKTOP_SIZE (WM_USER + 44) - +/* Message, set whether a window is managed by VW. wParam is the window handle + * (HWND, 0 for foreground window) and lParam should be 0 for not managed and 1 for managed. */ +#define VW_WINMANAGE (WM_USER + 45) /* Message, sent by VirtuaWin after a switch. lParam will contain current desktop number if wParam isn't one of the following, then wParam will also contain current desktop. @@ -138,20 +140,20 @@ "over the edge". The first one will have a MOD_STEP* parameter, and the second will have current desktop in both parameters. */ -#define MOD_CHANGEDESK (WM_USER + 30) -#define MOD_STEPLEFT (WM_USER + 31) -#define MOD_STEPRIGHT (WM_USER + 32) -#define MOD_STEPUP (WM_USER + 33) -#define MOD_STEPDOWN (WM_USER + 34) +#define MOD_CHANGEDESK (WM_USER + 30) +#define MOD_STEPLEFT (WM_USER + 31) +#define MOD_STEPRIGHT (WM_USER + 32) +#define MOD_STEPUP (WM_USER + 33) +#define MOD_STEPDOWN (WM_USER + 34) /* Message, sent just after the module is started. wParam will contain VirtuaWin hWnd */ -#define MOD_INIT (WM_USER + 35) +#define MOD_INIT (WM_USER + 35) /* Message, sent when VirtuaWin quits or reloads its modules */ -#define MOD_QUIT (WM_USER + 36) +#define MOD_QUIT (WM_USER + 36) /* Message, sent by VirtuaWin when setup button is pressed in "module tab", * wParam set to the HWND of the 'parent' window or 0 */ -#define MOD_SETUP (WM_USER + 37) +#define MOD_SETUP (WM_USER + 37) /* Message, sent by VirtuaWin when the configuration has been updated */ -#define MOD_CFGCHANGE (WM_USER + 38) +#define MOD_CFGCHANGE (WM_USER + 38) #endif Index: VirtuaWin.c =================================================================== RCS file: /cvsroot/virtuawin/VirtuaWin.c,v retrieving revision 1.136 retrieving revision 1.137 diff -u -d -r1.136 -r1.137 --- VirtuaWin.c 4 Mar 2008 11:53:42 -0000 1.136 +++ VirtuaWin.c 27 Mar 2008 08:59:20 -0000 1.137 @@ -1527,24 +1527,26 @@ * the taskbar so VW will manage toolwin windows if they are not popups or have owners */ if(hwnd == hWnd) - flags = 1 ; + flags = vwWINFLAGS_FOUND ; else if((wt != NULL) && (wt->flags & vwWTFLAGS_MANAGE)) flags = 0 ; else if((wt != NULL) && (wt->flags & vwWTFLAGS_DONT_MANAGE)) - flags = 1 ; + flags = vwWINFLAGS_FOUND|vwWINFLAGS_FORCE_NOT_MNGD ; else if((exstyle & WS_EX_TOOLWINDOW) && ((style & WS_POPUP) || (GetWindow(hwnd,GW_OWNER) != NULL))) - flags = 1 ; - else - flags = (((phwnd=GetParent(hwnd)) != NULL) && (phwnd != desktopHWnd) && - ((pwb=vwWindowBaseFind(phwnd)) != NULL) && - ((vwWindowIsManaged(pwb) && vwWindowIsNotHideByMove(pwb)) || - (vwWindowIsNotManaged(pwb) && ((phwnd=GetParent(phwnd)) != NULL) && - ((pwb=vwWindowBaseFind(phwnd)) != NULL) && - vwWindowIsManaged(pwb) && vwWindowIsNotHideByMove(pwb)))) ; - if(flags) - // dont manage this window + flags = vwWINFLAGS_FOUND ; + else if(((phwnd=GetParent(hwnd)) == NULL) || (phwnd == desktopHWnd) || ((pwb=vwWindowBaseFind(phwnd)) == NULL)) + flags = 0 ; + else if(vwWindowIsManaged(pwb)) + flags = (vwWindowIsHideByMove(pwb)) ? 0:vwWINFLAGS_FOUND ; + else if(((pwb)->flags & vwWINFLAGS_FORCE_NOT_MNGD) != 0) + flags = vwWINFLAGS_FOUND|vwWINFLAGS_FORCE_NOT_MNGD ; + else if(((phwnd=GetParent(phwnd)) != NULL) && ((pwb=vwWindowBaseFind(phwnd)) != NULL) && + vwWindowIsManaged(pwb) && vwWindowIsNotHideByMove(pwb)) flags = vwWINFLAGS_FOUND ; else + flags = 0 ; + + if(flags == 0) { if(style & WS_VISIBLE) // manage this window @@ -2981,6 +2983,78 @@ } /************************************************ + * Changes whether a window is managed or not + * Used by the module message VW_WINMANAGE + */ +static int +windowSetManage(HWND theWin, int state) +{ + vwWindowBase *wb ; + vwWindow *win ; + int style, ret ; + vwLogBasic((_T("Manage window: %x %d\n"),(int) theWin,state)) ; + + if((theWin == NULL) && ((theWin = GetForegroundWindow()) == NULL)) + return 0 ; + + ret = 1 ; + vwMutexLock(); + windowListUpdate() ; + wb = vwWindowBaseFind(theWin) ; + if(state) + { + if((wb == NULL) || !vwWindowIsManaged(wb)) + { + vwUInt flags = vwWINFLAGS_FOUND | vwWINFLAGS_VISIBLE | vwWINFLAGS_WINDOW | vwWINFLAGS_MANAGED | vwWINFLAGS_SHOWN | vwWINFLAGS_SHOW ; + style = GetWindowLong(theWin,GWL_STYLE) ; + if(style & WS_MINIMIZE) + flags |= vwWINFLAGS_MINIMIZED ; + if(style & WS_MAXIMIZE) + flags |= vwWINFLAGS_MAXIMIZED ; + if(wb != NULL) + vwWindowBaseDelete(wb) ; + if((win = (vwWindow *) vwWindowBaseCreate(flags,theWin)) == NULL) + ret = 0 ; + else + { + win->exStyle = GetWindowLong(theWin,GWL_EXSTYLE) ; + vwLogBasic((_T("Manually started managing window %8x Proc %d Flg %x %x (%08x)\n"), + (int)win->handle,(int)win->processId,(int)win->flags,(int) win->exStyle,(int)style)) ; + /* Complete the initialization */ + windowListUpdate() ; + } + } + } + else if((wb == NULL) || vwWindowIsWindow(wb)) + { + if(wb != NULL) + { + win = (vwWindow *) wb ; + if(win->desk != currentDesk) + { + if(win->desk > nDesks) + return 0 ; + vwWindowSetDesk(win,currentDesk,1,FALSE) ; + } + vwWindowBaseDelete(wb) ; + } + vwLogBasic((_T("Manually stopped managing window %8x\n"),theWin)) ; + if(vwWindowBaseCreate((vwWINFLAGS_FOUND|vwWINFLAGS_FORCE_NOT_MNGD),theWin) == NULL) + ret = 0 ; + else + /* Complete the initialization */ + windowListUpdate() ; + vwLogBasic((_T("Manually stopped managing window %8x complete\n"),theWin)) ; + } + else + wb->flags |= vwWINFLAGS_FORCE_NOT_MNGD ; + + vwMutexRelease(); + vwLogBasic((_T("manage window %8x complete %d\n"),theWin,ret)) ; + return ret ; +} + +/************************************************ * Gather all windows created by the current window's process */ static int @@ -3170,14 +3244,17 @@ vwMutexLock(); windowListUpdate() ; - if((win = vwWindowFind(theWin)) != NULL) + win = (vwWindow *) vwWindowBaseFind(theWin) ; + if(win == NULL) + _tcscpy(ss,_T("not managed\r\n")) ; + else if(vwWindowIsManaged(win)) _stprintf(ss,_T("being managed\r\n\tProc:\t%x\r\n\tLink:\t%x\r\n\tFlags:\t%08x\r\n\tExStyle:\t%08x\r\n\tDesk:\t%d\r\n\tHandling:\t%s, %s\r\n"), (int)((win->processNext == NULL) ? 0:win->processNext->handle),(int)((win->linkedNext == NULL) ? 0:win->linkedNext->handle), (int)win->flags,(int)win->exStyle,(int)win->desk, winHandle[(win->flags & vwWTFLAGS_HIDEWIN_MASK) >> vwWTFLAGS_HIDEWIN_BITROT], tbbHandle[(win->flags & vwWTFLAGS_HIDETSK_MASK) >> vwWTFLAGS_HIDETSK_BITROT]) ; else - _tcscpy(ss,_T("not managed\r\n")) ; + _stprintf(ss,_T("not managed\r\n\tFlags:\t%08x\r\n"),(int)win->flags) ; vwMutexRelease(); } else @@ -3236,6 +3313,7 @@ if((win = vwWindowFind(theWin)) != NULL) { /* currently managed window */ + AppendMenu(hpopup,MF_STRING,ID_WM_MANAGE,_T("Stop &Managing")); Sticky = vwWindowIsSticky(win) ; AppendMenu(hpopup,(Sticky) ? (MF_STRING|MF_CHECKED):MF_STRING,ID_WM_STICKY,_T("&Always Show")); AppendMenu(hpopup,(win->processNext == NULL) ? (MF_STRING|MF_GRAYED):MF_STRING,ID_WM_GATHER,_T("&Gather")); @@ -3319,27 +3397,7 @@ windowGather(theWin) ; break ; case ID_WM_MANAGE: - vwMutexLock(); - windowListUpdate() ; - if(vwWindowFind(theWin) == NULL) - { - vwUInt flags = vwWINFLAGS_FOUND | vwWINFLAGS_VISIBLE | vwWINFLAGS_WINDOW | vwWINFLAGS_MANAGED | vwWINFLAGS_SHOWN | vwWINFLAGS_SHOW ; - style = GetWindowLong(theWin,GWL_STYLE) ; - if(style & WS_MINIMIZE) - flags |= vwWINFLAGS_MINIMIZED ; - if(style & WS_MAXIMIZE) - flags |= vwWINFLAGS_MAXIMIZED ; - if((win = (vwWindow *) vwWindowBaseFind(theWin)) != NULL) - vwWindowBaseDelete((vwWindowBase *) win) ; - if((win = (vwWindow *) vwWindowBaseCreate(flags,theWin)) == NULL) - return ; - win->exStyle = GetWindowLong(theWin,GWL_EXSTYLE) ; - vwLogBasic((_T("Manually started managing window %8x Proc %d Flg %x %x (%08x)\n"), - (int)win->handle,(int)win->processId,(int)win->flags,(int) win->exStyle,(int)style)) ; - /* Complete the initialization */ - windowListUpdate() ; - } - vwMutexRelease(); + windowSetManage(theWin,(win == NULL)) ; break; default: if(ii == ID_WM_NEXT) @@ -4111,6 +4169,9 @@ case VW_DESKTOP_SIZE: return vwDESKTOP_SIZE; + case VW_WINMANAGE: + return windowSetManage((HWND)wParam,(int) lParam); + // End plugin messages case WM_CREATE: // when main window is created |