/* * Tasks functions */ static char Copyright[] = "Copyright Martin Ayotte, 1994"; /* #define DEBUG_TASK */ #include #include #include #include "windows.h" #include "wine.h" #include "task.h" static LPWINETASKENTRY lpTaskList = NULL; static int nTaskCount = 0; /********************************************************************** * GetCurrentTask [KERNEL.36] */ HTASK GetCurrentTask() { LPWINETASKENTRY lpTask = lpTaskList; int pid = getpid(); #ifdef DEBUG_TASK printf("GetCurrentTask() // unix_pid=%08X !\n", pid); #endif if (lpTask == NULL) return 0; while (TRUE) { if (lpTask->unix_pid == pid) break; if (lpTask->lpNextTask == NULL) return 0; lpTask = lpTask->lpNextTask; } #ifdef DEBUG_TASK printf("GetCurrentTask() returned hTask=%04X !\n", lpTask->te.hTask); #endif return lpTask->te.hTask; } /********************************************************************** * GetNumTasks [KERNEL.152] */ WORD GetNumTasks() { printf("GetNumTasks() returned %d !\n", nTaskCount); return nTaskCount; } /********************************************************************** * GetWindowTask [USER.224] */ HTASK GetWindowTask(HWND hWnd) { HWND *wptr; int count; LPWINETASKENTRY lpTask = lpTaskList; printf("GetWindowTask(%04X) !\n", hWnd); while (lpTask != NULL) { wptr = lpTask->lpWndList; if (wptr != NULL) { count = 0; while (++count < MAXWIN_PER_TASK) { printf("GetWindowTask // searching %04X %04X !\n", lpTask->te.hTask, *(wptr)); if (*(wptr) == hWnd) { printf("GetWindowTask(%04X) found hTask=%04X !\n", hWnd, lpTask->te.hTask); return lpTask->te.hTask; } wptr++; } } lpTask = lpTask->lpNextTask; } return 0; } /********************************************************************** * EnumTaskWindows [USER.225] */ BOOL EnumTaskWindows(HANDLE hTask, FARPROC lpEnumFunc, LONG lParam) { HWND *wptr, hWnd; BOOL bRet; int count = 0; LPWINETASKENTRY lpTask = lpTaskList; printf("EnumTaskWindows(%04X, %08X, %08X) !\n", hTask, lpEnumFunc, lParam); while (TRUE) { if (lpTask->te.hTask == hTask) break; if (lpTask == NULL) { printf("EnumTaskWindows // hTask=%04X not found !\n", hTask); return FALSE; } lpTask = lpTask->lpNextTask; } printf("EnumTaskWindows // found hTask=%04X !\n", hTask); wptr = lpTask->lpWndList; if (wptr == NULL) return FALSE; if (lpEnumFunc == NULL) return FALSE; while ((hWnd = *(wptr++)) != 0) { if (++count >= MAXWIN_PER_TASK) return FALSE; printf("EnumTaskWindows // hWnd=%04X count=%d !\n", hWnd, count); #ifdef WINELIB bRet = (*lpEnumFunc)(hWnd, lParam); #else bRet = CallBack16(lpEnumFunc, 2, 0, (int)hWnd, 2, (int)lParam); #endif if (bRet == 0) break; } return TRUE; } /********************************************************************** * CreateNewTask [internal] */ HANDLE CreateNewTask(HINSTANCE hInst, HTASK hTaskParent) { HANDLE hTask; LPWINETASKENTRY lpTask = lpTaskList; LPWINETASKENTRY lpNewTask; if (lpTask != NULL) { while (TRUE) { if (lpTask->lpNextTask == NULL) break; lpTask = lpTask->lpNextTask; } } hTask = GlobalAlloc(GMEM_MOVEABLE, sizeof(WINETASKENTRY)); lpNewTask = (LPWINETASKENTRY) GlobalLock(hTask); #ifdef DEBUG_TASK printf("CreateNewTask entry allocated %08X\n", lpNewTask); #endif if (lpNewTask == NULL) return 0; if (lpTaskList == NULL) { lpTaskList = lpNewTask; lpNewTask->lpPrevTask = NULL; } else { lpTask->lpNextTask = lpNewTask; lpTask->te.hNext = lpNewTask->te.hTask; lpNewTask->lpPrevTask = lpTask; } lpNewTask->lpNextTask = NULL; lpNewTask->hIcon = 0; lpNewTask->te.dwSize = sizeof(TASKENTRY); lpNewTask->te.hModule = 0; lpNewTask->te.hInst = hInst; lpNewTask->te.hTask = hTask; lpNewTask->te.hTaskParent = hTaskParent; lpNewTask->te.wSS = 0; lpNewTask->te.wSP = 0; lpNewTask->te.wStackTop = 0; lpNewTask->te.wStackMinimum = 0; lpNewTask->te.wStackBottom = 0; lpNewTask->te.wcEvents = 0; lpNewTask->te.hQueue = 0; sprintf(lpNewTask->te.szModule, "TASK%04X", hInst); lpNewTask->te.wPSPOffset = 0; lpNewTask->unix_pid = getpid(); lpNewTask->lpWndList = (HWND *) malloc(MAXWIN_PER_TASK * sizeof(HWND)); if (lpNewTask->lpWndList != NULL) memset((LPSTR)lpNewTask->lpWndList, 0, MAXWIN_PER_TASK * sizeof(HWND)); #ifdef DEBUG_TASK printf("CreateNewTask // unix_pid=%08X return hTask=%04X\n", lpNewTask->unix_pid, hTask); #endif GlobalUnlock(hTask); nTaskCount++; return hTask; } /********************************************************************** * AddWindowToTask [internal] */ BOOL AddWindowToTask(HTASK hTask, HWND hWnd) { HWND *wptr; int count = 0; LPWINETASKENTRY lpTask = lpTaskList; #ifdef DEBUG_TASK printf("AddWindowToTask(%04X, %04X); !\n", hTask, hWnd); #endif while (TRUE) { if (lpTask->te.hTask == hTask) break; if (lpTask == NULL) { printf("AddWindowToTask // hTask=%04X not found !\n", hTask); return FALSE; } lpTask = lpTask->lpNextTask; } wptr = lpTask->lpWndList; if (wptr == NULL) return FALSE; while (*(wptr) != 0) { if (++count >= MAXWIN_PER_TASK) return FALSE; wptr++; } *wptr = hWnd; #ifdef DEBUG_TASK printf("AddWindowToTask // window added, count=%d !\n", count); #endif return TRUE; } /********************************************************************** * RemoveWindowFromTask [internal] */ BOOL RemoveWindowFromTask(HTASK hTask, HWND hWnd) { HWND *wptr; int count = 0; LPWINETASKENTRY lpTask = lpTaskList; #ifdef DEBUG_TASK printf("RemoveWindowToTask(%04X, %04X); !\n", hTask, hWnd); #endif while (TRUE) { if (lpTask->te.hTask == hTask) break; if (lpTask == NULL) { printf("RemoveWindowFromTask // hTask=%04X not found !\n", hTask); return FALSE; } lpTask = lpTask->lpNextTask; } wptr = lpTask->lpWndList; if (wptr == NULL) return FALSE; while (*(wptr) != hWnd) { if (++count >= MAXWIN_PER_TASK) return FALSE; wptr++; } while (*(wptr) != 0) { *(wptr) = *(wptr + 1); if (++count >= MAXWIN_PER_TASK) return FALSE; wptr++; } #ifdef DEBUG_TASK printf("RemoveWindowFromTask // window removed, count=%d !\n", --count); #endif return TRUE; }