/* * Misc. USER functions * * Copyright 1993 Robert J. Amstadt * 1996 Alex Korobka */ #include #include #include "windows.h" #include "gdi.h" #include "user.h" #include "task.h" #include "queue.h" #include "class.h" #include "win.h" #include "hook.h" #include "debug.h" #include "toolhelp.h" #ifndef WINELIB WORD USER_HeapSel = 0; extern void TIMER_NukeTimers(HWND, HQUEUE ); extern HTASK TASK_GetNextTask(HTASK); /*********************************************************************** * GetFreeSystemResources (USER.284) */ WORD GetFreeSystemResources( WORD resType ) { int userPercent, gdiPercent; switch(resType) { case GFSR_USERRESOURCES: userPercent = (int)LOCAL_CountFree( USER_HeapSel ) * 100 / LOCAL_HeapSize( USER_HeapSel ); gdiPercent = 100; break; case GFSR_GDIRESOURCES: gdiPercent = (int)LOCAL_CountFree( GDI_HeapSel ) * 100 / LOCAL_HeapSize( GDI_HeapSel ); userPercent = 100; break; case GFSR_SYSTEMRESOURCES: userPercent = (int)LOCAL_CountFree( USER_HeapSel ) * 100 / LOCAL_HeapSize( USER_HeapSel ); gdiPercent = (int)LOCAL_CountFree( GDI_HeapSel ) * 100 / LOCAL_HeapSize( GDI_HeapSel ); break; default: return 0; } return (WORD)MIN( userPercent, gdiPercent ); } /*********************************************************************** * SystemHeapInfo (TOOLHELP.71) */ BOOL SystemHeapInfo( SYSHEAPINFO *pHeapInfo ) { pHeapInfo->wUserFreePercent = GetFreeSystemResources( GFSR_USERRESOURCES ); pHeapInfo->wGDIFreePercent = GetFreeSystemResources( GFSR_GDIRESOURCES ); pHeapInfo->hUserSegment = USER_HeapSel; pHeapInfo->hGDISegment = GDI_HeapSel; return TRUE; } #endif /* WINELIB */ /*********************************************************************** * TimerCount (TOOLHELP.80) */ BOOL TimerCount( TIMERINFO *pTimerInfo ) { /* FIXME * In standard mode, dwmsSinceStart = dwmsThisVM * * I tested this, under Windows in enhanced mode, and * if you never switch VM (ie start/stop DOS) these * values should be the same as well. * * Also, Wine should adjust for the hardware timer * to reduce the amount of error to ~1ms. * I can't be bothered, can you? */ pTimerInfo->dwmsSinceStart = pTimerInfo->dwmsThisVM = GetTickCount(); return TRUE; } /********************************************************************** * USER_InitApp */ int USER_InitApp(HINSTANCE hInstance) { int queueSize; /* Create task message queue */ queueSize = GetProfileInt( "windows", "DefaultQueueSize", 8 ); if (!SetMessageQueue( queueSize )) return 0; return 1; } /********************************************************************** * USER_AppExit */ void USER_AppExit(HTASK hTask, HINSTANCE hInstance, HQUEUE hQueue) { /* FIXME: flush send messages (which are not implemented yet), * empty clipboard if needed, maybe destroy menus (Windows * only complains about them but does nothing); */ WND* desktop = WIN_GetDesktop(); /* Patch desktop window queue */ if( desktop->hmemTaskQ == hQueue ) desktop->hmemTaskQ = GetTaskQueue(TASK_GetNextTask(hTask)); /* Nuke timers */ TIMER_NukeTimers( 0, hQueue ); HOOK_FreeQueueHooks( hQueue ); /* Nuke orphaned windows */ WIN_DestroyQueueWindows( desktop->child, hQueue ); /* Free the message queue */ QUEUE_DeleteMsgQueue( hQueue ); }