From 8db75fced0e34485cc92def9d2a1e25ed01a6358 Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 23 Jan 2003 17:43:40 +0000 Subject: [PATCH] clean up _pfnTrackMouseEvent (CMU reported crash) --- panda/src/windisplay/winGraphicsPipe.cxx | 13 ++++++++++++ panda/src/windisplay/winGraphicsPipe.h | 7 +++++++ panda/src/windisplay/winGraphicsWindow.cxx | 23 +++++----------------- panda/src/windisplay/winGraphicsWindow.h | 4 ---- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/panda/src/windisplay/winGraphicsPipe.cxx b/panda/src/windisplay/winGraphicsPipe.cxx index 318f62ed09..745b1b5696 100644 --- a/panda/src/windisplay/winGraphicsPipe.cxx +++ b/panda/src/windisplay/winGraphicsPipe.cxx @@ -28,6 +28,15 @@ TypeHandle WinGraphicsPipe::_type_handle; //////////////////////////////////////////////////////////////////// WinGraphicsPipe:: WinGraphicsPipe() { + // these fns arent defined on win95, so get dynamic ptrs to them + // to avoid ugly DLL loader failures on w95 + _pfnTrackMouseEvent = NULL; + + _hUser32 = (HINSTANCE)LoadLibrary("user32.dll"); + if (_hUser32 != NULL) { + _pfnTrackMouseEvent = + (PFN_TRACKMOUSEEVENT)GetProcAddress(_hUser32, "TrackMouseEvent"); + } } //////////////////////////////////////////////////////////////////// @@ -37,4 +46,8 @@ WinGraphicsPipe() { //////////////////////////////////////////////////////////////////// WinGraphicsPipe:: ~WinGraphicsPipe() { + if (_hUser32 != NULL) { + FreeLibrary(_hUser32); + _hUser32 = NULL; + } } diff --git a/panda/src/windisplay/winGraphicsPipe.h b/panda/src/windisplay/winGraphicsPipe.h index cb56c05f92..ecaf4a88a8 100644 --- a/panda/src/windisplay/winGraphicsPipe.h +++ b/panda/src/windisplay/winGraphicsPipe.h @@ -21,6 +21,7 @@ #include "pandabase.h" #include "graphicsPipe.h" +#include "winGraphicsWindow.h" //////////////////////////////////////////////////////////////////// // Class : WinGraphicsPipe @@ -40,6 +41,10 @@ public: WinGraphicsPipe(); virtual ~WinGraphicsPipe(); +private: + HINSTANCE _hUser32; + typedef BOOL (WINAPI *PFN_TRACKMOUSEEVENT)(LPTRACKMOUSEEVENT); + PFN_TRACKMOUSEEVENT _pfnTrackMouseEvent; public: static TypeHandle get_class_type() { @@ -57,6 +62,8 @@ public: private: static TypeHandle _type_handle; + + friend class WinGraphicsWindow; }; #include "winGraphicsPipe.I" diff --git a/panda/src/windisplay/winGraphicsWindow.cxx b/panda/src/windisplay/winGraphicsWindow.cxx index 03a301ab75..811bd876b3 100644 --- a/panda/src/windisplay/winGraphicsWindow.cxx +++ b/panda/src/windisplay/winGraphicsWindow.cxx @@ -29,9 +29,6 @@ TypeHandle WinGraphicsWindow::_type_handle; -bool WinGraphicsWindow::_got_dynamic_fns = false; -WinGraphicsWindow::PFN_TRACKMOUSEEVENT WinGraphicsWindow::_pfnTrackMouseEvent = NULL; - bool WinGraphicsWindow::_loaded_custom_cursor; HCURSOR WinGraphicsWindow::_mouse_cursor; const char * const WinGraphicsWindow::_window_class_name = "WinGraphicsWindow"; @@ -72,19 +69,6 @@ WinGraphicsWindow(GraphicsPipe *pipe) : _tracking_mouse_leaving = false; _maximized = false; memset(_keyboard_state, 0, sizeof(BYTE) * num_virtual_keys); - - if (!_got_dynamic_fns) { - // these fns arent defined on win95, so get dynamic ptrs to them - // to avoid ugly DLL loader failures on w95 - HINSTANCE hUser32 = (HINSTANCE)LoadLibrary("user32.dll"); - if (hUser32) { - _pfnTrackMouseEvent = - (PFN_TRACKMOUSEEVENT)GetProcAddress(hUser32, "TrackMouseEvent"); - FreeLibrary(hUser32); - } - - _got_dynamic_fns = true; - } } //////////////////////////////////////////////////////////////////// @@ -628,7 +612,10 @@ track_mouse_leaving(HWND hwnd) { // 3.0+) which emulates TrackMouseEvent on w95, but that requires // another 500K of memory to hold that DLL, which is lame just to // support w95, which probably has other issues anyway - if (_pfnTrackMouseEvent != NULL) { + WinGraphicsPipe *winpipe; + DCAST_INTO_V(winpipe, _pipe); + + if (winpipe->_pfnTrackMouseEvent != NULL) { TRACKMOUSEEVENT tme = { sizeof(TRACKMOUSEEVENT), TME_LEAVE, @@ -637,7 +624,7 @@ track_mouse_leaving(HWND hwnd) { }; // tell win32 to post WM_MOUSELEAVE msgs - BOOL bSucceeded = _pfnTrackMouseEvent(&tme); + BOOL bSucceeded = winpipe->_pfnTrackMouseEvent(&tme); if ((!bSucceeded) && windisplay_cat.is_debug()) { windisplay_cat.debug() diff --git a/panda/src/windisplay/winGraphicsWindow.h b/panda/src/windisplay/winGraphicsWindow.h index 3a3d4eb1b4..9980f671be 100644 --- a/panda/src/windisplay/winGraphicsWindow.h +++ b/panda/src/windisplay/winGraphicsWindow.h @@ -107,10 +107,6 @@ private: bool _maximized; DEVMODE _fullscreen_display_mode; - static bool _got_dynamic_fns; - typedef BOOL (WINAPI *PFN_TRACKMOUSEEVENT)(LPTRACKMOUSEEVENT); - static PFN_TRACKMOUSEEVENT _pfnTrackMouseEvent; - // This is used to remember the state of the keyboard when keyboard // focus is lost. static const int num_virtual_keys = 256;