summaryrefslogtreecommitdiffstats
path: root/win/tkWinWm.c
diff options
context:
space:
mode:
authorpatthoyts <patthoyts@users.sourceforge.net>2009-11-22 23:28:36 (GMT)
committerpatthoyts <patthoyts@users.sourceforge.net>2009-11-22 23:28:36 (GMT)
commit289a84bb2587e4db1a64b76701759a572d6c3447 (patch)
treee01df5da2143b20b5ca3910c5adb667ea5d213a4 /win/tkWinWm.c
parent59ddd65061064dbf6eb5a124e7888f95bb88da48 (diff)
downloadtk-289a84bb2587e4db1a64b76701759a572d6c3447.zip
tk-289a84bb2587e4db1a64b76701759a572d6c3447.tar.gz
tk-289a84bb2587e4db1a64b76701759a572d6c3447.tar.bz2
Make sure the window is still present when handling delayed activation [Bug 2899949]
Diffstat (limited to 'win/tkWinWm.c')
-rw-r--r--win/tkWinWm.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/win/tkWinWm.c b/win/tkWinWm.c
index 4266663..8896b1a 100644
--- a/win/tkWinWm.c
+++ b/win/tkWinWm.c
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkWinWm.c,v 1.124.2.7 2009/11/03 23:49:11 patthoyts Exp $
+ * RCS: @(#) $Id: tkWinWm.c,v 1.124.2.8 2009/11/22 23:28:36 patthoyts Exp $
*/
#include "tkWinInt.h"
@@ -43,7 +43,8 @@
typedef struct ActivateEvent {
Tcl_Event ev;
TkWindow *winPtr;
- int *flagPtr;
+ const int *flagPtr;
+ HWND hwnd;
} ActivateEvent;
/*
@@ -422,7 +423,7 @@ TCL_DECLARE_MUTEX(winWmMutex)
static int ActivateWindow(Tcl_Event *evPtr, int flags);
static void ConfigureTopLevel(WINDOWPOS *pos);
static void GenerateConfigureNotify(TkWindow *winPtr);
-static void GenerateActivateEvent(TkWindow *winPtr, int *flagPtr);
+static void GenerateActivateEvent(TkWindow *winPtr, const int *flagPtr);
static void GetMaxSize(WmInfo *wmPtr,
int *maxWidthPtr, int *maxHeightPtr);
static void GetMinSize(WmInfo *wmPtr,
@@ -8236,13 +8237,14 @@ TkpGetWrapperWindow(
*/
static void
-GenerateActivateEvent(TkWindow * winPtr, int *flagPtr)
+GenerateActivateEvent(TkWindow * winPtr, const int *flagPtr)
{
ActivateEvent *eventPtr;
eventPtr = (ActivateEvent *)ckalloc(sizeof(ActivateEvent));
eventPtr->ev.proc = ActivateWindow;
eventPtr->winPtr = winPtr;
eventPtr->flagPtr = flagPtr;
+ eventPtr->hwnd = Tk_GetHWND(winPtr->window);
Tcl_QueueEvent((Tcl_Event *)eventPtr, TCL_QUEUE_TAIL);
}
@@ -8275,6 +8277,15 @@ ActivateWindow(
}
/*
+ * Ensure the window has not been destroyed while we delayed
+ * processing the WM_ACTIVATE message [Bug 2899949].
+ */
+
+ if (!IsWindow(eventPtr->hwnd)) {
+ return 1;
+ }
+
+ /*
* If the toplevel is in the middle of a move or size operation then
* we must delay handling of this event to avoid stealing the focus
* while the window manage is in control.