wine/loader/task.c
Alexandre Julliard 3f2abfaa0a Release 940815
Tue Aug  9 23:58:29 MET DST 1994	<erik@hacktic.nl>

	* [misc/file.c]
	OpenFile(): Completly rewritten.

	* [miscemu/int21.c]
	CreateFile(): Fixed wrong mode in call to open.
	OpenExistingFile(): Implemented file sharing.
	FindNext(): Fixed.
	CreateNewFile(): Fixed wrong mode in call to open.
	fLock(): Added to handle record locking.
	GetFileAttribute(): Added.
	As a result, AH = 0x5c, 0x09, and 0x0b were changed.

	* [miscemu/int2f.c]
	AH = 0x10: SHARE installation check
 
	* [loader/resource.c]
	AccessResource(): Fixed. A new file descriptor will be returned by
	every call to AccessResource().

	* [windows/utility.c]
	wvsprintf(): Fixed.

	* [controls/menu.c]
	FindMenuItem(): Fixed (handling for nPos == -1 added).	

	* [windows/win.c]
	CreateWindowEx(): Added call to WINPOS_GetMinMaxInfo.

	* [Configure]
	Added two options for a processor emulator that might be
	plugged in later..

	* [loader/task.c] [include/toolhelp.h] [if1632/toolhelp.spec]
	CreateNewTask() stores real modulename instead of 'TASKxxxx'.
	Added TaskFirst(), TaskNext(), TaskFindHandle().

	* [memory/global.c]
	Added stub for MemManInfo().

	* [objects/text.c]
	Added stub for GetTabbedTextExt().

	* [miscemu/*]
	Changed all references to registers. Please don't access
 	the context structure.
	fix for GetSystemTime() by <jspeter@birch.ee.vt.edu> added.

	* [misc/lstr.c]
	Fixed bug in AnsiUpper() & AnsiLower().

	* [misc/winsocket.c]
	bugfix in getsockopt()/setsockopt(): winsock uses different values
	than unix.

	* [objects/dib.c]
	Added DIB_SetImageBits_RLE[48] to support compressed bitmaps.

Mon Aug  8 21:12:33 1994  David Metcalfe <david@prism.demon.co.uk>

	* [controls/edit.c]
	Added support for WM_COPY, WM_CUT and WM_PASTE messages.

	* [windows/dialog.c] [windows/defdlg.c] [include/dialog.h]
	Modified dialog code to create new heap for edit controls
	unless DS_LOCALEDIT style is set.

Thu Aug  4 18:50:56 1994  Alexandre Julliard  (julliard@lamisun.epfl.ch)

	* [controls/button.c] [controls/edit.c] [controls/static.c]
	Removed unneeded GlobalUnlock() calls.

	* [controls/menu.c] [include/menu.h]
	Lots of changes, fixed a lot of old bugs and introduced a lot of
	new ones :-)
	- Changed message loop to use MSG_GetInternalMessage().
	- Fixed a bug that caused the main window to lose activation when
	  displaying a menu.
	- Correctly send initialisation messages (WM_INITMENUPOPUP).
	- Implemented EndMenu() and LookupMenuHandle().
	- Changed internal structures to be as compatible as possible with
	  MS-Windows.
	- Allocated everything on the USER heap instead of the global heap.
	- Prefixed all internal function names with MENU_ and declared
	  them static.
	- Moved "About Wine..." handling to NC_HandleSysCommand().
	- Multi-line menus should now work correctly.

	* [loader/resource.c] [objects/bitmap.c]
	Added the possibility to create OEM bitmaps directly as X bitmaps.

	* [objects/dcvalues.c] [windows/dc.c]
	Fixed GetDCOrg() to return screen coordinates.

	* [windows/message.c]
	Fixed double-click checks when the message is not removed from the
	queue.
	Fixed MSG_GetInternalMessage() to send WM_ENTERIDLE messages.

	* [windows/nonclient.c]
	Bug fix in system menu hit-test calculation.
	A few changes for new menu functions.

Thu Aug 11 17:51:02 1994  Thomas Sandford <t.d.g.sandford@bradford.ac.uk>

        * [controls/edit.c]
        Bug fix in Edit_NCCreateMessage
        es->textlen was being used before being set

        * [controls/menu.c]
        Bug fix in MENU_DrawMenuItem
        don't try to write text if NULL pointer passed
1994-08-16 15:43:11 +00:00

306 lines
7.1 KiB
C

/*
* Tasks functions
*/
static char Copyright[] = "Copyright Martin Ayotte, 1994";
/*
#define DEBUG_TASK
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#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;
MODULEENTRY module;
module.dwSize = sizeof(module);
ModuleFindHandle(&module, hInst);
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;
strcpy(lpNewTask->te.szModule, module.szModule);
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;
}
BOOL TaskFirst(LPTASKENTRY lpTask)
{
printf("TaskFirst(%8x)\n", (int) lpTask);
if (lpTaskList) {
memcpy(lpTask, &lpTaskList->te, lpTask->dwSize);
return TRUE;
} else
return FALSE;
}
BOOL TaskNext(LPTASKENTRY lpTask)
{
LPWINETASKENTRY list;
printf("TaskNext(%8x)\n", (int) lpTask);
list = lpTaskList;
while (list) {
if (list->te.hTask == lpTask->hTask) {
list = list->lpNextTask;
if (list) {
memcpy(lpTask, &list->te, lpTask->dwSize);
return TRUE;
} else
return FALSE;
}
list = list->lpNextTask;
}
return FALSE;
}
BOOL TaskFindHandle(LPTASKENTRY lpTask, HTASK hTask)
{
static LPWINETASKENTRY list;
printf("TaskFindHandle(%8x,%4x)\n", (int) lpTask, hTask);
list = lpTaskList;
while (list) {
if (list->te.hTask == hTask) {
list = list->lpNextTask;
if (list) {
memcpy(lpTask, &list->te, lpTask->dwSize);
return TRUE;
} else
return FALSE;
}
list = list->lpNextTask;
}
return FALSE;
}