From a452fa0cef296c4c8a7cc1c79148b599242a8646 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 10 Nov 2008 15:50:48 +0000 Subject: [PATCH] fix Windows out-of-memory dialog svn: r12375 --- src/mred/mred.cxx | 3 ++- src/wxwindow/include/msw/wx_win.h | 2 ++ src/wxwindow/src/msw/wx_main.cxx | 4 ++++ src/wxwindow/src/msw/wx_win.cxx | 28 +++++++++++++++++++++++++++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/mred/mred.cxx b/src/mred/mred.cxx index a91acc748b..6cc2387a35 100644 --- a/src/mred/mred.cxx +++ b/src/mred/mred.cxx @@ -3153,7 +3153,8 @@ static void MrEdOutOfMemory(void) #ifdef wx_mac Alert(101, NULL); #endif -#ifdef wx_win +#ifdef wx_msw + wxNoMoreCallbacks(); MessageBox(NULL, "PLT Scheme virtual machine is out of memory. Aborting.", "Out of Memory", diff --git a/src/wxwindow/include/msw/wx_win.h b/src/wxwindow/include/msw/wx_win.h index 01c461dc55..3250db976a 100644 --- a/src/wxwindow/include/msw/wx_win.h +++ b/src/wxwindow/include/msw/wx_win.h @@ -135,4 +135,6 @@ extern wxKeyEvent *wxMakeCharEvent(BOOL just_check, WORD wParam, LPARAM lParam, extern BOOL wxTranslateMessage(MSG *m); +extern void wxNoMoreCallbacks(void); + #endif diff --git a/src/wxwindow/src/msw/wx_main.cxx b/src/wxwindow/src/msw/wx_main.cxx index 1c217916f6..6967df3146 100644 --- a/src/wxwindow/src/msw/wx_main.cxx +++ b/src/wxwindow/src/msw/wx_main.cxx @@ -41,6 +41,8 @@ char wxCanvasClassName[] = "wxCanvasClass"; HICON wxSTD_FRAME_ICON = NULL; +DWORD wx_original_thread_id; + HFONT wxSTATUS_LINE_FONT = NULL; LRESULT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM); @@ -102,6 +104,8 @@ void wxInitialize(HINSTANCE hInstance) if (!gaugeInit(hInstance)) wxFatalError("Cannot initalize Gauge library"); + wx_original_thread_id = GetCurrentThreadId(); + wxSTD_FRAME_ICON = LoadIcon(hInstance, "wxSTD_FRAME"); { diff --git a/src/wxwindow/src/msw/wx_win.cxx b/src/wxwindow/src/msw/wx_win.cxx index 1e24582585..478ce3f2b3 100644 --- a/src/wxwindow/src/msw/wx_win.cxx +++ b/src/wxwindow/src/msw/wx_win.cxx @@ -1264,14 +1264,37 @@ static LONG WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, in return retval; } + +extern DWORD wx_original_thread_id; +static int cut_off_callbacks; + +void wxNoMoreCallbacks(void) +{ + cut_off_callbacks = 1; +} + +static int invalid_callback_context() +{ + if (GetCurrentThreadId() != wx_original_thread_id) { + return 1; + } + if (cut_off_callbacks) + return 1; + + return 0; +} + extern int wx_trampolining; // Main window proc LRESULT APIENTRY wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ +{ LRESULT res; int tramp = wx_trampolining; + if (invalid_callback_context()) + return ::DefWindowProcW(hWnd, message, wParam, lParam); + wx_trampolining = 0; /* WM_NCHITTEST is extremely common, and we do nothing with it. @@ -1300,6 +1323,9 @@ LONG APIENTRY wxDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) LRESULT res; int tramp = wx_trampolining; + if (invalid_callback_context()) + return ::DefWindowProcW(hWnd, message, wParam, lParam); + wx_trampolining = 0; /* See mredmsw.cxx: */