Handle (console) applications that never created a queue correctly
in USER_AppExit(); call InitThreadInput() in InitApp().
diff --git a/windows/user.c b/windows/user.c
index f08656d..fb3a7cc 100644
--- a/windows/user.c
+++ b/windows/user.c
@@ -130,8 +130,6 @@
*/
INT16 WINAPI InitApp( HINSTANCE16 hInstance )
{
- int queueSize;
-
/* InitTask() calls LibMain()'s of implicitly loaded DLLs
* prior to InitApp() so there is no clean way to do
* SetTaskSignalHandler() in time. So, broken Windows bypasses
@@ -145,9 +143,8 @@
/* FIXME: should set a USER-specific handler that displays a msg box */
INT_SetPMHandler( 0, INT_GetPMHandler( 0xff ) );
- /* Create task message queue */
- queueSize = GetProfileInt32A( "windows", "DefaultQueueSize", 8 );
- if (!SetMessageQueue32( queueSize )) return 0;
+ /* Create task message queue */
+ if ( !GetFastQueue() ) return 0;
return 1;
}
@@ -166,32 +163,34 @@
*/
static void USER_AppExit( HTASK16 hTask, HINSTANCE16 hInstance, HQUEUE16 hQueue )
{
- /* FIXME: empty clipboard if needed, maybe destroy menus (Windows
- * only complains about them but does nothing);
- */
+ if ( hQueue )
+ {
+ /* FIXME: empty clipboard if needed, maybe destroy menus (Windows
+ * only complains about them but does nothing);
+ */
- WND* desktop = WIN_GetDesktop();
+ WND* desktop = WIN_GetDesktop();
- /* Patch desktop window */
- if( desktop->hmemTaskQ == hQueue )
- desktop->hmemTaskQ = GetTaskQueue(TASK_GetNextTask(hTask));
+ /* Patch desktop window */
+ if( desktop->hmemTaskQ == hQueue )
+ desktop->hmemTaskQ = GetTaskQueue(TASK_GetNextTask(hTask));
- /* Patch resident popup menu window */
- MENU_PatchResidentPopup( hQueue, NULL );
+ /* Patch resident popup menu window */
+ MENU_PatchResidentPopup( hQueue, NULL );
- TIMER_RemoveQueueTimers( hQueue );
+ TIMER_RemoveQueueTimers( hQueue );
- QUEUE_FlushMessages( hQueue );
- HOOK_FreeQueueHooks( hQueue );
+ QUEUE_FlushMessages( hQueue );
+ HOOK_FreeQueueHooks( hQueue );
- QUEUE_SetExitingQueue( hQueue );
- WIN_ResetQueueWindows( desktop, hQueue, (HQUEUE16)0);
- CLIPBOARD_ResetLock( hQueue, 0 );
- QUEUE_SetExitingQueue( 0 );
+ QUEUE_SetExitingQueue( hQueue );
+ WIN_ResetQueueWindows( desktop, hQueue, (HQUEUE16)0);
+ CLIPBOARD_ResetLock( hQueue, 0 );
+ QUEUE_SetExitingQueue( 0 );
- /* Free the message queue */
-
- QUEUE_DeleteMsgQueue( hQueue );
+ /* Free the message queue */
+ QUEUE_DeleteMsgQueue( hQueue );
+ }
/* ModuleUnload() in "Internals" */