@ -331,15 +331,63 @@ static void createKeyTables(void)
}
}
// Window procedure for the hidden helper window
//
static LRESULT CALLBACK helperWindowProc ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam )
{
switch ( uMsg )
{
case WM_DISPLAYCHANGE :
_glfwPollMonitorsWin32 ( ) ;
break ;
case WM_DEVICECHANGE :
{
if ( ! _glfw . joysticksInitialized )
break ;
if ( wParam = = DBT_DEVICEARRIVAL )
{
DEV_BROADCAST_HDR * dbh = ( DEV_BROADCAST_HDR * ) lParam ;
if ( dbh & & dbh - > dbch_devicetype = = DBT_DEVTYP_DEVICEINTERFACE )
_glfwDetectJoystickConnectionWin32 ( ) ;
}
else if ( wParam = = DBT_DEVICEREMOVECOMPLETE )
{
DEV_BROADCAST_HDR * dbh = ( DEV_BROADCAST_HDR * ) lParam ;
if ( dbh & & dbh - > dbch_devicetype = = DBT_DEVTYP_DEVICEINTERFACE )
_glfwDetectJoystickDisconnectionWin32 ( ) ;
}
break ;
}
}
return DefWindowProcW ( hWnd , uMsg , wParam , lParam ) ;
}
// Creates a dummy window for behind-the-scenes work
//
static GLFWbool createHelperWindow ( void )
{
MSG msg ;
WNDCLASSEXW wc = { sizeof ( wc ) } ;
wc . style = CS_OWNDC ;
wc . lpfnWndProc = ( WNDPROC ) helperWindowProc ;
wc . hInstance = _glfw . win32 . instance ;
wc . lpszClassName = L " GLFW3 Helper " ;
if ( ! RegisterClassExW ( & wc ) )
{
_glfwInputErrorWin32 ( GLFW_PLATFORM_ERROR ,
" WIn32: Failed to register helper window class " ) ;
return GLFW_FALSE ;
}
_glfw . win32 . helperWindowHandle =
CreateWindowExW ( WS_EX_OVERLAPPEDWINDOW ,
_GLFW_WNDCLASSNAME ,
L " GLFW3 Helper " ,
L " GLFW message window " ,
WS_CLIPSIBLINGS | WS_CLIPCHILDREN ,
0 , 0 , 1 , 1 ,
@ -663,7 +711,10 @@ void _glfwTerminateWin32(void)
UnregisterDeviceNotification ( _glfw . win32 . deviceNotificationHandle ) ;
if ( _glfw . win32 . helperWindowHandle )
{
DestroyWindow ( _glfw . win32 . helperWindowHandle ) ;
UnregisterClassW ( L " GLFW3 Helper " , _glfw . win32 . instance ) ;
}
_glfwUnregisterWindowClassWin32 ( ) ;