/*
 * Tablet Win16
 *
 * Copyright 2002 Patrik Stridvall
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "config.h"

#include <stdarg.h>

#include "windef.h"
#include "winbase.h"

#include "wintab.h"

#include "wine/windef16.h"
#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(wintab);

/**********************************************************************/

#define DECLARE_HANDLE16(a) \
	typedef HANDLE16 a##16; \
	typedef a##16 *P##a##16; \
	typedef a##16 *NP##a##16; \
	typedef a##16 *LP##a##16

DECLARE_HANDLE16(HMGR);     /* manager handle */
DECLARE_HANDLE16(HCTX);     /* context handle */
DECLARE_HANDLE16(HWTHOOK);  /* hook handle */

/**********************************************************************/

typedef struct tagLOGCONTEXT16 {
    char    lcName[LCNAMELEN];
    UINT16  lcOptions;
    UINT16  lcStatus;
    UINT16  lcLocks;
    UINT16  lcMsgBase;
    UINT16  lcDevice;
    UINT16  lcPktRate;
    WTPKT   lcPktData;
    WTPKT   lcPktMode;
    WTPKT   lcMoveMask;
    DWORD   lcBtnDnMask;
    DWORD   lcBtnUpMask;
    LONG    lcInOrgX;
    LONG    lcInOrgY;
    LONG    lcInOrgZ;
    LONG    lcInExtX;
    LONG    lcInExtY;
    LONG    lcInExtZ;
    LONG    lcOutOrgX;
    LONG    lcOutOrgY;
    LONG    lcOutOrgZ;
    LONG    lcOutExtX;
    LONG    lcOutExtY;
    LONG    lcOutExtZ;
    FIX32   lcSensX;
    FIX32   lcSensY;
    FIX32   lcSensZ;
    BOOL16  lcSysMode;
    INT16   lcSysOrgX;
    INT16   lcSysOrgY;
    INT16   lcSysExtX;
    INT16   lcSysExtY;
    FIX32   lcSysSensX;
    FIX32   lcSysSensY;
} LOGCONTEXT16, *PLOGCONTEXT16, *NPLOGCONTEXT16, *LPLOGCONTEXT16;

/**********************************************************************/

typedef BOOL16 (WINAPI * WTENUMPROC16)(HCTX16, LPARAM);  /* changed CALLBACK->WINAPI, 1.1 */
typedef BOOL16 (WINAPI * WTCONFIGPROC16)(HCTX16, HWND16);
typedef LRESULT (WINAPI * WTHOOKPROC16)(INT16, WPARAM16, LPARAM);
typedef WTHOOKPROC16 *LPWTHOOKPROC16;

/***********************************************************************
 *		WTInfo (WINTAB.20)
 */
UINT16 WINAPI WTInfo16(UINT16 wCategory, UINT16 nIndex, LPVOID lpOutput)
{
    FIXME("(%hu, %hu, %p): stub\n", wCategory, nIndex, lpOutput);

    return 0;
}

/***********************************************************************
 *		WTOpen (WINTAB.21)
 */
HCTX16 WINAPI WTOpen16(HWND16 hWnd, LPLOGCONTEXT16 lpLogCtx, BOOL16 fEnable)
{
    FIXME("(0x%04hx, %p, %hu): stub\n", hWnd, lpLogCtx, fEnable);

    return 0;
}

/***********************************************************************
 *		WTClose (WINTAB.22)
 */
BOOL16 WINAPI WTClose16(HCTX16 hCtx)
{
    FIXME("(0x%04hx): stub\n", hCtx);

    return TRUE;
}

/***********************************************************************
 *		WTPacketsGet (WINTAB.23)
 */
INT16 WINAPI WTPacketsGet16(HCTX16 hCtx, INT16 cMaxPkts, LPVOID lpPkts)
{
    FIXME("(0x%04hx, %hd, %p): stub\n", hCtx, cMaxPkts, lpPkts);

    return 0;
}

/***********************************************************************
 *		WTPacket (WINTAB.24)
 */
BOOL16 WINAPI WTPacket16(HCTX16 hCtx, UINT16 wSerial, LPVOID lpPkt)
{
    FIXME("(0x%04hx, %hd, %p): stub\n", hCtx, wSerial, lpPkt);

    return FALSE;
}

/***********************************************************************
 *		WTEnable (WINTAB.40)
 */
BOOL16 WINAPI WTEnable16(HCTX16 hCtx, BOOL16 fEnable)
{
    FIXME("(0x%04hx, %hu): stub\n", hCtx, fEnable);

    return FALSE;
}

/***********************************************************************
 *		WTOverlap (WINTAB.41)
 */
BOOL16 WINAPI WTOverlap16(HCTX16 hCtx, BOOL16 fToTop)
{
    FIXME("(0x%04hx, %hu): stub\n", hCtx, fToTop);

    return FALSE;
}

/***********************************************************************
 *		WTConfig (WINTAB.60)
 */
BOOL16 WINAPI WTConfig16(HCTX16 hCtx, HWND16 hWnd)
{
    FIXME("(0x%04hx, 0x%04hx): stub\n", hCtx, hWnd);

    return FALSE;
}

/***********************************************************************
 *		WTGet (WINTAB.61)
 */
BOOL16 WINAPI WTGet16(HCTX16 hCtx, LPLOGCONTEXT16 lpLogCtx)
{
    FIXME("(0x%04hx, %p): stub\n", hCtx, lpLogCtx);

    return FALSE;
}

/***********************************************************************
 *		WTSet (WINTAB.62)
 */
BOOL16 WINAPI WTSet16(HCTX16 hCtx, LPLOGCONTEXT16 lpLogCtx)
{
    FIXME("(0x%04hx, %p): stub\n", hCtx, lpLogCtx);

    return FALSE;
}

/***********************************************************************
 *		WTExtGet (WINTAB.63)
 */
BOOL16 WINAPI WTExtGet16(HCTX16 hCtx, UINT16 wExt, LPVOID lpData)
{
    FIXME("(0x%04hx, %hu, %p): stub\n", hCtx, wExt, lpData);

    return FALSE;
}

/***********************************************************************
 *		WTExtSet (WINTAB.64)
 */
BOOL16 WINAPI WTExtSet16(HCTX16 hCtx, UINT16 wExt, LPVOID lpData)
{
    FIXME("(0x%04hx, %hu, %p): stub\n", hCtx, wExt, lpData);

    return FALSE;
}

/***********************************************************************
 *		WTSave (WINTAB.65)
 */
BOOL16 WINAPI WTSave16(HCTX16 hCtx, LPVOID lpSaveInfo)
{
    FIXME("(0x%04hx, %p): stub\n", hCtx, lpSaveInfo);

    return FALSE;
}

/***********************************************************************
 *		WTRestore (WINTAB.66)
 */
HCTX16 WINAPI WTRestore16(HWND16 hWnd, LPVOID lpSaveInfo, BOOL16 fEnable)
{
    FIXME("(0x%04hx, %p, %hu): stub\n", hWnd, lpSaveInfo, fEnable);

    return 0;
}

/***********************************************************************
 *		WTPacketsPeek (WINTAB.80)
 */
INT16 WINAPI WTPacketsPeek16(HCTX16 hCtx, INT16 cMaxPkts, LPVOID lpPkts)
{
    FIXME("(0x%04hx, %hd, %p): stub\n", hCtx, cMaxPkts, lpPkts);

    return 0;
}

/***********************************************************************
 *		WTDataGet (WINTAB.81)
 */
INT16 WINAPI WTDataGet16(HCTX16 hCtx, UINT16 wBegin, UINT16 wEnd,
			 INT16 cMaxPkts, LPVOID lpPkts, LPINT16 lpNPkts)
{
    FIXME("(0x%04hx, %hu, %hu, %hd, %p, %p): stub\n",
	  hCtx, wBegin, wEnd, cMaxPkts, lpPkts, lpNPkts);

    return 0;
}

/***********************************************************************
 *		WTDataPeek (WINTAB.82)
 */
INT16 WINAPI WTDataPeek16(HCTX16 hCtx, UINT16 wBegin, UINT16 wEnd,
			  INT16 cMaxPkts, LPVOID lpPkts, LPINT16 lpNPkts)
{
    FIXME("(0x%04hx, %hu, %hu, %hd, %p, %p): stub\n",
	  hCtx, wBegin, wEnd, cMaxPkts, lpPkts, lpNPkts);

    return 0;
}

/***********************************************************************
 *		WTQueuePackets (WINTAB.83)
 *
 * OBSOLETE IN WIN32!
 */
DWORD WINAPI WTQueuePackets16(HCTX16 hCtx)
{
    FIXME("(0x%04hx): stub\n", hCtx);

    return 0;
}

/***********************************************************************
 *		WTQueuePacketsEx (WINTAB.200)
 */
BOOL16 WINAPI WTQueuePacketsEx16(HCTX16 hCtx, UINT16 *lpOld, UINT16 *lpNew)
{
    FIXME("(0x%04hx, %p, %p): stub\n", hCtx, lpOld, lpNew);

    return TRUE;
}

/***********************************************************************
 *		WTQueueSizeGet (WINTAB.84)
 */
INT16 WINAPI WTQueueSizeGet16(HCTX16 hCtx)
{
    FIXME("(0x%04hx): stub\n", hCtx);

    return 0;
}

/***********************************************************************
 *		WTQueueSizeSet (WINTAB.85)
 */
BOOL16 WINAPI WTQueueSizeSet16(HCTX16 hCtx, INT16 nPkts)
{
    FIXME("(0x%04hx, %hd): stub\n", hCtx, nPkts);

    return FALSE;
}

/***********************************************************************
 *		WTMgrOpen (WINTAB.100)
 */
HMGR16 WINAPI WTMgrOpen16(HWND16 hWnd, UINT16 wMsgBase)
{
    FIXME("(0x%04hx, %hu): stub\n", hWnd, wMsgBase);

    return 0;
}

/***********************************************************************
 *		WTMgrClose (WINTAB.101)
 */
BOOL16 WINAPI WTMgrClose16(HMGR16 hMgr)
{
    FIXME("(0x%04hx): stub\n", hMgr);

    return FALSE;
}

/***********************************************************************
 *		WTMgrContextEnum (WINTAB.120)
 */
BOOL16 WINAPI WTMgrContextEnum16(HMGR16 hMgr, WTENUMPROC16 lpEnumFunc, LPARAM lParam)
{
    FIXME("(0x%04hx, %p, %ld): stub\n", hMgr, lpEnumFunc, lParam);

    return FALSE;
}

/***********************************************************************
 *		WTMgrContextOwner (WINTAB.121)
 */
HWND16 WINAPI WTMgrContextOwner16(HMGR16 hMgr, HCTX16 hCtx)
{
    FIXME("(0x%04hx, 0x%04hx): stub\n", hMgr, hCtx);

    return 0;
}

/***********************************************************************
 *		WTMgrDefContext (WINTAB.122)
 */
HCTX16 WINAPI WTMgrDefContext16(HMGR16 hMgr, BOOL16 fSystem)
{
    FIXME("(0x%04hx, %hu): stub\n", hMgr, fSystem);

    return 0;
}

/***********************************************************************
 *		WTMgrDefContextEx (WINTAB.206)
 *
 * 1.1
 */
HCTX16 WINAPI WTMgrDefContextEx16(HMGR16 hMgr, UINT16 wDevice, BOOL16 fSystem)
{
    FIXME("(0x%04hx, %hu, %hu): stub\n", hMgr, wDevice, fSystem);

    return 0;
}

/***********************************************************************
 *		WTMgrDeviceConfig (WINTAB.140)
 */
UINT16 WINAPI WTMgrDeviceConfig16(HMGR16 hMgr, UINT16 wDevice, HWND16 hWnd)
{
    FIXME("(0x%04hx, %hu, 0x%04hx): stub\n", hMgr, wDevice, hWnd);

    return 0;
}

/***********************************************************************
 *		WTMgrConfigReplace (WINTAB.141)
 *
 * OBSOLETE IN WIN32!
 */
BOOL16 WINAPI WTMgrConfigReplace16(HMGR16 hMgr, BOOL16 fInstall,
				   WTCONFIGPROC16 lpConfigProc)
{
    FIXME("(0x%04hx, %hu, %p): stub\n", hMgr, fInstall, lpConfigProc);

    return FALSE;
}

/***********************************************************************
 *		WTMgrConfigReplaceEx (WINTAB.202)
 */
BOOL16 WINAPI WTMgrConfigReplaceEx16(HMGR16 hMgr, BOOL16 fInstall,
				     LPSTR lpszModule, LPSTR lpszCfgProc)
{
    FIXME("(0x%04hx, %hu, %s, %s): stub\n", hMgr, fInstall,
	  debugstr_a(lpszModule), debugstr_a(lpszCfgProc));

    return FALSE;
}

/***********************************************************************
 *		WTMgrPacketHook (WINTAB.160)
 *
 * OBSOLETE IN WIN32!
 */
WTHOOKPROC16 WINAPI WTMgrPacketHook16(HMGR16 hMgr, BOOL16 fInstall,
				      INT16 nType, WTHOOKPROC16 lpFunc)
{
    FIXME("(0x%04hx, %hu, %hd, %p): stub\n", hMgr, fInstall, nType, lpFunc);

    return 0;
}

/***********************************************************************
 *		WTMgrPacketHookEx (WINTAB.203)
 */
HWTHOOK16 WINAPI WTMgrPacketHookEx16(HMGR16 hMgr, INT16 nType,
				     LPSTR lpszModule, LPSTR lpszHookProc)
{
    FIXME("(0x%04hx, %hd, %s, %s): stub\n", hMgr, nType,
	  debugstr_a(lpszModule), debugstr_a(lpszHookProc));

    return 0;
}

/***********************************************************************
 *		WTMgrPacketUnhook (WINTAB.204)
 */
BOOL16 WINAPI WTMgrPacketUnhook16(HWTHOOK16 hHook)
{
    FIXME("(0x%04hx): stub\n", hHook);

    return FALSE;
}

/***********************************************************************
 *		WTMgrPacketHookDefProc (WINTAB.161)
 *
 * OBSOLETE IN WIN32!
 */
LRESULT WINAPI WTMgrPacketHookDefProc16(INT16 nCode, WPARAM16 wParam,
					LPARAM lParam, LPWTHOOKPROC16 lplpFunc)
{
    FIXME("(%hd, %hu, %lu, %p): stub\n", nCode, wParam, lParam, lplpFunc);

    return 0;
}

/***********************************************************************
 *		WTMgrPacketHookNext (WINTAB.205)
 */
LRESULT WINAPI WTMgrPacketHookNext16(HWTHOOK16 hHook, INT16 nCode,
				     WPARAM16 wParam, LPARAM lParam)
{
    FIXME("(0x%04hx, %hd, %hu, %lu): stub\n", hHook, nCode, wParam, lParam);

    return 0;
}


/***********************************************************************
 *		WTMgrExt (WINTAB.180)
 */
BOOL16 WINAPI WTMgrExt16(HMGR16 hMgr, UINT16 wExt, LPVOID lpData)
{
    FIXME("(0x%04hx, %hu, %p): stub\n", hMgr, wExt, lpData);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrEnable (WINTAB.181)
 */
BOOL16 WINAPI WTMgrCsrEnable16(HMGR16 hMgr, UINT16 wCursor, BOOL16 fEnable)
{
    FIXME("(0x%04hx, %hu, %hu): stub\n", hMgr, wCursor, fEnable);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrButtonMap (WINTAB.182)
 */
BOOL16 WINAPI WTMgrCsrButtonMap16(HMGR16 hMgr, UINT16 wCursor,
				  LPBYTE lpLogBtns, LPBYTE lpSysBtns)
{
    FIXME("(0x%04hx, %hu, %p, %p): stub\n", hMgr, wCursor, lpLogBtns, lpSysBtns);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrPressureBtnMarks (WINTAB.183)
 *
 * OBSOLETE IN WIN32! (But only according to documentation)
 */
BOOL16 WINAPI WTMgrCsrPressureBtnMarks16(HMGR16 hMgr, UINT16 wCsr,
					 DWORD dwNMarks, DWORD dwTMarks)
{
    FIXME("(0x%04hx, %hu, %u, %u): stub\n", hMgr, wCsr, dwNMarks, dwTMarks);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrPressureBtnMarksEx (WINTAB.201)
 */
BOOL16 WINAPI WTMgrCsrPressureBtnMarksEx16(HMGR16 hMgr, UINT16 wCsr,
					   UINT16 *lpNMarks, UINT16 *lpTMarks)
{
    FIXME("(0x%04hx, %hu, %p, %p): stub\n", hMgr, wCsr, lpNMarks, lpTMarks);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrPressureResponse (WINTAB.184)
 */
BOOL16 WINAPI WTMgrCsrPressureResponse16(HMGR16 hMgr, UINT16 wCsr,
					 UINT16 *lpNResp, UINT16 *lpTResp)
{
    FIXME("(0x%04hx, %hu, %p, %p): stub\n", hMgr, wCsr, lpNResp, lpTResp);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrExt (WINTAB.185)
 */
BOOL16 WINAPI WTMgrCsrExt16(HMGR16 hMgr, UINT16 wCsr, UINT16 wExt, LPVOID lpData)
{
    FIXME("(0x%04hx, %hu, %hu, %p): stub\n", hMgr, wCsr, wExt, lpData);

    return FALSE;
}