/*
 * Tablet header
 *
 * Copyright 2003 CodeWeavers (Aric Stewart)
 *
 * 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
 */

#ifndef __WINE_WINTAB_INTERNAL_H
#define __WINE_WINTAB_INTERNAL_H

typedef struct tagWTI_INTERFACE_INFO {
    CHAR  WINTABID[1024];
        /* a copy of the null-terminated tablet hardware identification string
         * in the user buffer. This string should include make, model, and
         * revision information in user-readable format.
         */
    WORD    SPECVERSION;
        /* the specification version number. The high-order byte contains the
         * major version number; the low-order byte contains the minor version
         * number.
         */
    WORD    IMPLVERSION;
        /* the implementation version number. The high-order byte contains the
         * major version number; the low-order byte contains the minor version
         * number.
         */
    UINT    NDEVICES;
        /* the number of devices supported. */
    UINT    NCURSORS;
        /* the total number of cursor types supported. */
    UINT    NCONTEXTS;
        /* the number of contexts supported. */
    UINT    CTXOPTIONS;
        /* flags indicating which context options are supported */
    UINT    CTXSAVESIZE;
        /* the size of the save information returned from WTSave.*/
    UINT    NEXTENSIONS;
        /* the number of extension data items supported.*/
    UINT    NMANAGERS;
        /* the number of manager handles supported.*/
    }WTI_INTERFACE_INFO, *LPWTI_INTERFACE_INFO;

typedef struct tagWTI_STATUS_INFO{
    UINT    CONTEXTS;
        /* the number of contexts currently open.*/
    UINT    SYSCTXS;
        /* the number of system contexts currently open.*/
    UINT    PKTRATE;
        /* the maximum packet report rate currently being received by any
         * context, in Hertz.
         */
    WTPKT   PKTDATA;
        /* a mask indicating which packet data items are requested by at
         * least one context.
         */
    UINT    MANAGERS;
        /* the number of manager handles currently open.*/
    BOOL    SYSTEM;
        /* a non-zero value if system pointing is available to the whole
         * screen; zero otherwise.
         */
    DWORD   BUTTONUSE;
        /* a button mask indicating the logical buttons whose events are
         * requested by at least one context.
         */
    DWORD   SYSBTNUSE;
        /* a button mask indicating which logical buttons are assigned a system
         * button function by the current cursor's system button map.
         */
} WTI_STATUS_INFO, *LPWTI_STATUS_INFO;

typedef struct tagWTI_EXTENSIONS_INFO
{
    CHAR   NAME[256];
        /* a unique, null-terminated string describing the extension.*/
    UINT    TAG;
        /* a unique identifier for the extension. */
    WTPKT   MASK;
        /* a mask that can be bitwise OR'ed with WTPKT-type variables to select
         * the extension.
         */
    UINT    SIZE[2];
        /* an array of two UINTs specifying the extension's size within a packet
         * (in bytes). The first is for absolute mode; the second is for
         * relative mode.
         */
    AXIS    *AXES;
        /* an array of axis descriptions, as needed for the extension. */
    BYTE    *DEFAULT;
        /* the current global default data, as needed for the extension.  This
         * data is modified via the WTMgrExt function.
         */
    BYTE    *DEFCONTEXT;
    BYTE    *DEFSYSCTX;
        /* the current default context-specific data, as needed for the
         * extension. The indices identify the digitizing- and system-context
         * defaults, respectively.
         */
    BYTE    *CURSORS;
        /* Is the first of one or more consecutive indices, one per cursor type.
         * Each returns the current default cursor-specific data, as need for
         * the extension. This data is modified via the WTMgrCsrExt function.
         */
} WTI_EXTENSIONS_INFO, *LPWTI_EXTENSIONS_INFO;

typedef struct tagWTPACKET {
        HCTX pkContext;
        UINT pkStatus;
        LONG pkTime;
        WTPKT pkChanged;
        UINT pkSerialNumber;
        UINT pkCursor;
        DWORD pkButtons;
        DWORD pkX;
        DWORD pkY;
        DWORD pkZ;
        UINT pkNormalPressure;
        UINT pkTangentPressure;
        ORIENTATION pkOrientation;
        ROTATION pkRotation; /* 1.1 */
} WTPACKET, *LPWTPACKET;

typedef struct tagOPENCONTEXT
{
    HCTX        handle;
    LOGCONTEXTW context;
    HWND        hwndOwner;
    BOOL        enabled;
    INT         ActiveCursor;
    INT         QueueSize;
    INT         PacketsQueued;
    LPWTPACKET  PacketQueue;
    struct tagOPENCONTEXT *next;
} OPENCONTEXT, *LPOPENCONTEXT;

int TABLET_PostTabletMessage(LPOPENCONTEXT newcontext, UINT msg, WPARAM wParam,
                             LPARAM lParam, BOOL send_always) DECLSPEC_HIDDEN;
LPOPENCONTEXT AddPacketToContextQueue(LPWTPACKET packet, HWND hwnd) DECLSPEC_HIDDEN;

/* X11drv functions */
extern int  (CDECL *pLoadTabletInfo)(HWND hwnddefault) DECLSPEC_HIDDEN;
extern int  (CDECL *pGetCurrentPacket)(LPWTPACKET packet) DECLSPEC_HIDDEN;
extern int  (CDECL *pAttachEventQueueToTablet)(HWND hOwner) DECLSPEC_HIDDEN;
extern UINT (CDECL *pWTInfoW)(UINT wCategory, UINT nIndex, LPVOID lpOutput) DECLSPEC_HIDDEN;

extern HWND hwndDefault DECLSPEC_HIDDEN;
extern CRITICAL_SECTION csTablet DECLSPEC_HIDDEN;

#endif /* __WINE_WINTAB_INTERNAL_H */
