/*
 * Tablet Manager
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include "config.h"

#include <stdarg.h>

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

#include "wintab.h"

#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(wintab32);

/***********************************************************************
 *		WTMgrOpen (WINTAB32.100)
 */
HMGR WINAPI WTMgrOpen(HWND hWnd, UINT wMsgBase)
{
    FIXME("(%p, %u): stub\n", hWnd, wMsgBase);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return NULL;
}

/***********************************************************************
 *		WTMgrClose (WINTAB32.101)
 */
BOOL WINAPI WTMgrClose(HMGR hMgr)
{
    FIXME("(%p): stub\n", hMgr);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}

/***********************************************************************
 *		WTMgrContextEnum (WINTAB32.120)
 */
BOOL WINAPI WTMgrContextEnum(HMGR hMgr, WTENUMPROC lpEnumFunc, LPARAM lParam)
{
    FIXME("(%p, %p, %ld): stub\n", hMgr, lpEnumFunc, lParam);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}

/***********************************************************************
 *		WTMgrContextOwner (WINTAB32.121)
 */
HWND WINAPI WTMgrContextOwner(HMGR hMgr, HCTX hCtx)
{
    FIXME("(%p, %p): stub\n", hMgr, hCtx);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return NULL;
}

/***********************************************************************
 *		WTMgrDefContext (WINTAB32.122)
 */
HCTX WINAPI WTMgrDefContext(HMGR hMgr, BOOL fSystem)
{
    FIXME("(%p, %u): stub\n", hMgr, fSystem);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return NULL;
}

/***********************************************************************
 *		WTMgrDefContextEx (WINTAB32.206)
 *
 * 1.1
 */
HCTX WINAPI WTMgrDefContextEx(HMGR hMgr, UINT wDevice, BOOL fSystem)
{
    FIXME("(%p, %hu, %hu): stub\n", hMgr, wDevice, fSystem);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return NULL;
}

/***********************************************************************
 *		WTMgrDeviceConfig (WINTAB32.140)
 */
UINT WINAPI WTMgrDeviceConfig(HMGR hMgr, UINT wDevice, HWND hWnd)
{
    FIXME("(%p, %u, %p): stub\n", hMgr, wDevice, hWnd);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return 0;
}

/***********************************************************************
 *		WTMgrConfigReplaceExA (WINTAB32.202)
 */
BOOL WINAPI WTMgrConfigReplaceExA(HMGR hMgr, BOOL fInstall,
				  LPSTR lpszModule, LPSTR lpszCfgProc)
{
    FIXME("(%p, %u, %s, %s): stub\n", hMgr, fInstall,
	  debugstr_a(lpszModule), debugstr_a(lpszCfgProc));

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}

/***********************************************************************
 *		WTMgrConfigReplaceExW (WINTAB32.1202)
 */
BOOL WINAPI WTMgrConfigReplaceExW(HMGR hMgr, BOOL fInstall,
				  LPWSTR lpszModule, LPSTR lpszCfgProc)
{
    FIXME("(%p, %u, %s, %s): stub\n", hMgr, fInstall,
	  debugstr_w(lpszModule), debugstr_a(lpszCfgProc));

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}

/***********************************************************************
 *		WTMgrPacketHookExA (WINTAB32.203)
 */
HWTHOOK WINAPI WTMgrPacketHookExA(HMGR hMgr, int nType,
				  LPSTR lpszModule, LPSTR lpszHookProc)
{
    FIXME("(%p, %d, %s, %s): stub\n", hMgr, nType,
	  debugstr_a(lpszModule), debugstr_a(lpszHookProc));

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return NULL;
}

/***********************************************************************
 *		WTMgrPacketHookExW (WINTAB32.1203)
 */
HWTHOOK WINAPI WTMgrPacketHookExW(HMGR hMgr, int nType,
				  LPWSTR lpszModule, LPSTR lpszHookProc)
{
    FIXME("(%p, %d, %s, %s): stub\n", hMgr, nType,
	  debugstr_w(lpszModule), debugstr_a(lpszHookProc));

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return NULL;
}

/***********************************************************************
 *		WTMgrPacketUnhook (WINTAB32.204)
 */
BOOL WINAPI WTMgrPacketUnhook(HWTHOOK hHook)
{
    FIXME("(%p): stub\n", hHook);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}

/***********************************************************************
 *		WTMgrPacketHookNext (WINTAB32.205)
 */
LRESULT WINAPI WTMgrPacketHookNext(HWTHOOK hHook, int nCode,
				   WPARAM wParam, LPARAM lParam)
{
    FIXME("(%p, %d, %u, %lu): stub\n", hHook, nCode, wParam, lParam);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return 0;
}


/***********************************************************************
 *		WTMgrExt (WINTAB32.180)
 */
BOOL WINAPI WTMgrExt(HMGR hMgr, UINT wExt, LPVOID lpData)
{
    FIXME("(%p, %u, %p): stub\n", hMgr, wExt, lpData);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrEnable (WINTAB32.181)
 */
BOOL WINAPI WTMgrCsrEnable(HMGR hMgr, UINT wCursor, BOOL fEnable)
{
    FIXME("(%p, %u, %u): stub\n", hMgr, wCursor, fEnable);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrButtonMap (WINTAB32.182)
 */
BOOL WINAPI WTMgrCsrButtonMap(HMGR hMgr, UINT wCursor,
			      LPBYTE lpLogBtns, LPBYTE lpSysBtns)
{
    FIXME("(%p, %u, %p, %p): stub\n", hMgr, wCursor, lpLogBtns, lpSysBtns);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrPressureBtnMarks (WINTAB32.183)
 *
 * OBSOLETE IN WIN32! (But only according to documentation)
 */
BOOL WINAPI WTMgrCsrPressureBtnMarks(HMGR hMgr, UINT wCsr,
				     DWORD dwNMarks, DWORD dwTMarks)
{
    FIXME("(%p, %u, %lu, %lu): stub\n", hMgr, wCsr, dwNMarks, dwTMarks);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrPressureBtnMarksEx (WINTAB32.201)
 */
BOOL WINAPI WTMgrCsrPressureBtnMarksEx(HMGR hMgr, UINT wCsr,
				       UINT *lpNMarks, UINT *lpTMarks)
{
    FIXME("(%p, %u, %p, %p): stub\n", hMgr, wCsr, lpNMarks, lpTMarks);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrPressureResponse (WINTAB32.184)
 */
BOOL WINAPI WTMgrCsrPressureResponse(HMGR hMgr, UINT wCsr,
				     UINT *lpNResp, UINT *lpTResp)
{
    FIXME("(%p, %u, %p, %p): stub\n", hMgr, wCsr, lpNResp, lpTResp);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}

/***********************************************************************
 *		WTMgrCsrExt (WINTAB32.185)
 */
BOOL WINAPI WTMgrCsrExt(HMGR hMgr, UINT wCsr, UINT wExt, LPVOID lpData)
{
    FIXME("(%p, %u, %u, %p): stub\n", hMgr, wCsr, wExt, lpData);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);

    return FALSE;
}
