|
|
/*++
Copyright (c) 2000 Microsoft Corporation. All rights reserved.
Module Name: tabsrv.h
Abstract: This module contains private definitions of the TabletPC Listener Service.
Author: Michael Tsang (MikeTs) 01-Jun-2000
Environment: User mode
Revision History: --*/
#ifndef _TABSRV_H
#define _TABSRV_H
//
// Constants
//
#define STR_TABSRV_NAME MODNAME
#define STR_REGPATH_TABSRVPARAM "System\\CurrentControlSet\\Services\\TabSrv\\Parameters";
#define STR_LINEARITY_MAP "LinearityMap"
// gdwfTabSrv flags
#define TSF_RPCTHREAD 0x00000001
#define TSF_SUPERTIPTHREAD 0x00000002
#define TSF_DIGITHREAD 0x00000004
#define TSF_MOUSETHREAD 0x00000008
#define TSF_BUTTONTHREAD 0x00000010
#define TSF_ALLTHREAD (TSF_RPCTHREAD | \
TSF_SUPERTIPTHREAD | \ TSF_DIGITHREAD | \ TSF_MOUSETHREAD | \ TSF_BUTTONTHREAD) #define TSF_TERMINATE 0x00000020
#define TSF_HAS_LINEAR_MAP 0x00000040
#define TSF_PORTRAIT_MODE 0x00000080
#define TSF_SUPERTIP_MINIMIZED_BEFORE 0x00000100
#define TSF_SUPERTIP_OPENED 0x00000200
#define TSF_SUPERTIP_SENDINK 0x00000400
#define TSF_TASKBAR_CREATED 0x00000800
#define TSF_TRAYICON_CREATED 0x00001000
#define TSF_PORTRAIT_MODE2 0x40000000
#define TSF_DEBUG_MODE 0x80000000
// dwfThread flags
#define THREADF_ENABLED 0x00000001
#define THREADF_RESTARTABLE 0x00000002
#define THREADF_SDT_POSTMSG 0x00000004
#define THREADF_SDT_SETEVENT 0x00000008
#define THREADF_DESKTOP_WINLOGON 0x00000010
// HID USAGE DIGITIZER defines (BUGBUG: move to ddk\inc\hidusage.h someday?)
#define HID_USAGE_DIGITIZER_PEN ((USAGE)0x02)
#define HID_USAGE_DIGITIZER_IN_RANGE ((USAGE)0x32)
#define HID_USAGE_DIGITIZER_TIP_SWITCH ((USAGE)0x42)
#define HID_USAGE_DIGITIZER_BARREL_SWITCH ((USAGE)0x44)
#define HID_USAGE_CONSUMERCTRL ((USAGE)0x01)
// gdwPenState values
#define PENSTATE_NORMAL 0x00000000
#define PENSTATE_PENDOWN 0x00000001
#define PENSTATE_LEFTUP_PENDING 0x00000002
#define PENSTATE_PRESSHOLD 0x00000003
#define PENSTATE_RIGHTDRAG 0x00000004
#define MAX_RESTARTS 5
#define MAX_NORMALIZED_X 65535
#define MAX_NORMALIZED_Y 65535
#define NUM_PIXELS_LONG 1024
#define NUM_PIXELS_SHORT 768
#define TIMERID_PRESSHOLD 1
#define TIMEOUT_LEFTCLICK 20 //20 msec.
#define TIMEOUT_BALLOON_TIP (10*1000) //10 sec.
// Button constants
#define BUTTONSTATE_BUTTON_1 0x00000004
#define BUTTONSTATE_BUTTON_2 0x00000002
#define BUTTONSTATE_BUTTON_3 0x00000001
#define BUTTONSTATE_BUTTON_4 0x00000010
#define BUTTONSTATE_BUTTON_5 0x00000008
#define BUTTONSTATE_DEFHOTKEY (BUTTONSTATE_BUTTON_1 | BUTTONSTATE_BUTTON_5)
// Gesture related constants
#define WM_GESTURE (WM_APP)
#define WM_SUPERTIP_NOTIFY (WM_APP + 1)
#define WM_SUPERTIP_INIT (WM_APP + 2)
#define TIP_SWITCH (1) // bit flag in wButtonState
#define BARREL_SWITCH (2) // bit flag in wButtonState
#define DEF_RADIUS 200 // The pen must have been outside sqrt(Radius) for a while
#define DEF_MINOUTPTS 6
#define DEF_MAXTIMETOINSPECT 800
#define DEF_ASPECTRATIO 3
#define DEF_CHECKTIME 400
#define DEF_PTSTOEXAMINE 4
#define DEF_STOPDIST 50 // The pen is considered stopped if all points during the last STOPTIME ms
// are within this distance of the current point.
#define DEF_STOPTIME 200
#define DEF_PRESSHOLD_TIME 500
#define DEF_HOLD_TOLERANCE 3
//
// Macros
//
#define InitializeListHead(lh) ((lh)->Flink = (lh)->Blink = (lh))
#define IsListEmpty(lh) ((lh)->Flink == (lh))
#define RemoveHeadList(lh) (lh)->Flink; \
{RemoveEntryList((lh)->Flink)} #define RemoveEntryList(e) { \
(e)->Blink->Flink = (e)->Flink; \ (e)->Flink->Blink = (e)->Blink; \ } #define InsertTailList(lh,e) { \
(e)->Flink = (lh); \ (e)->Blink = (lh)->Blink; \ (lh)->Blink->Flink = (e); \ (lh)->Blink = (e); \ } #define SET_SERVICE_STATUS(s) if (ghServStatus) { \
gServStatus.dwCurrentState = s; \ SetServiceStatus(ghServStatus, \ &gServStatus); \ } #define TABSRVERR(p) { \
TRACEERROR(p); \ TabSrvLogError p; \ } #define SWAPBUTTONS(c,e1,e2) (((c) == 0)? (e1): (e2))
#define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0]))
#define SCREEN_TO_NORMAL_X(x) ((((x) - glVirtualDesktopLeft)* \
(MAX_NORMALIZED_X + 1) + \ (MAX_NORMALIZED_X + 1)/2)/ \ gcxScreen) #define SCREEN_TO_NORMAL_Y(y) ((((y) - glVirtualDesktopTop)* \
(MAX_NORMALIZED_Y + 1) + \ (MAX_NORMALIZED_Y + 1) /2)/ \ gcyScreen) #define NORMAL_TO_SCREEN_X(x) (((x)*gcxScreen + gcxScreen/2)/ \
(MAX_NORMALIZED_X + 1) + \ glVirtualDesktopLeft) #define NORMAL_TO_SCREEN_Y(y) (((y)*gcyScreen + gcyScreen/2)/ \
(MAX_NORMALIZED_Y + 1) + \ glVirtualDesktopTop)
//
// Type definitions
//
typedef struct _PEN_TILT { LONG dx; LONG dy; } PEN_TILT, *PPEN_TILT;
typedef struct _CONFIG { GESTURE_SETTINGS GestureSettings; PEN_TILT PenTilt; LINEAR_MAP LinearityMap; BUTTON_SETTINGS ButtonSettings; } CONFIG, *PCONFIG;
typedef unsigned (__stdcall *PFNTHREAD)(void *); typedef struct _TSTHREAD { PFNTHREAD pfnThread; PSZ pszThreadName; DWORD dwThreadTag; DWORD dwfThread; DWORD dwcRestartTries; PVOID pvSDTParam; HANDLE hThread; int iThreadStatus; PVOID pvParam; } TSTHREAD, *PTSTHREAD;
typedef struct _DEVICE_DATA { USAGE UsagePage; USAGE Usage; HANDLE hStopDeviceEvent; HANDLE hDevice; ULONG dwcButtons; PUSAGE pDownButtonUsages; PHIDP_PREPARSED_DATA pPreParsedData; HIDP_CAPS hidCaps; } DEVICE_DATA, *PDEVICE_DATA;
typedef struct _DIGITIZER_DATA { WORD wButtonState; WORD wX; WORD wY; DWORD dwTime; } DIGITIZER_DATA, *PDIGITIZER_DATA;
typedef struct _DIGIRECT { USHORT wx0; USHORT wy0; USHORT wx1; USHORT wy1; } DIGIRECT, *PDIGIRECT;
typedef struct _NOTIFYCLIENT { DWORD dwSig; LIST_ENTRY list; EVTNOTIFY Event; HWND hwnd; UINT uiMsg; } NOTIFYCLIENT, *PNOTIFYCLIENT;
#define SIG_NOTIFYCLIENT 'tnlC'
//
// Global data
//
extern HMODULE ghMod; extern DWORD gdwfTabSrv; extern LIST_ENTRY glistNotifyClients; extern HANDLE ghDesktopSwitchEvent; extern HANDLE ghmutNotifyList; extern HANDLE ghHotkeyEvent; extern HANDLE ghRefreshEvent; extern HANDLE ghRPCServerThread; extern HWND ghwndSuperTIP; extern HWND ghwndMouse; extern HWND ghwndSuperTIPInk; extern HCURSOR ghcurPressHold; extern HCURSOR ghcurNormal; extern UINT guimsgSuperTIPInk; #ifdef DRAW_INK
extern HWND ghwndDrawInk; #endif
extern ISuperTip *gpISuperTip; extern ITellMe *gpITellMe; extern int gcxScreen, gcyScreen; extern int gcxPrimary, gcyPrimary; extern LONG glVirtualDesktopLeft, glVirtualDesktopRight, glVirtualDesktopTop, glVirtualDesktopBottom; extern LONG glLongOffset, glShortOffset; extern int giButtonsSwapped; extern ULONG gdwMinX, gdwMaxX, gdwRngX; extern ULONG gdwMinY, gdwMaxY, gdwRngY; extern int gixIndex, giyIndex; extern INPUT gInput; extern DWORD gdwPenState; extern DWORD gdwPenDownTime; extern LONG glPenDownX; extern LONG glPenDownY; extern DWORD gdwPenUpTime; extern LONG glPenUpX; extern LONG glPenUpY; extern WORD gwLastButtons; extern CONFIG gConfig; extern TSTHREAD gTabSrvThreads[]; extern TCHAR gtszTabSrvTitle[]; extern TCHAR gtszTabSrvName[]; extern TCHAR gtszGestureSettings[]; extern TCHAR gtszButtonSettings[]; extern TCHAR gtszPenTilt[]; extern TCHAR gtszLinearityMap[]; extern TCHAR gtszRegPath[]; extern TCHAR gtszInputDesktop[];
extern SERVICE_STATUS_HANDLE ghServStatus; extern SERVICE_STATUS gServStatus; extern DIGITIZER_DATA gLastRawDigiReport; extern DEVICE_DATA gdevDigitizer; extern DEVICE_DATA gdevButtons;
#ifdef DEBUG
extern NAMETABLE ServiceControlNames[]; extern NAMETABLE ConsoleControlNames[]; #endif
//
// Function prototypes
//
// tabsrv.cpp
VOID InstallTabSrv( VOID );
VOID SetTabSrvConfig( IN SC_HANDLE hService );
VOID RemoveTabSrv( VOID );
VOID StartTabSrv( VOID );
VOID StopTabSrv( VOID );
VOID WINAPI TabSrvServiceHandler( IN DWORD dwControl );
#ifdef ALLOW_DEBUG
BOOL WINAPI TabSrvConsoleHandler( IN DWORD dwControl ); #endif
VOID WINAPI TabSrvMain( IN DWORD icArgs, IN LPTSTR *aptszArgs );
VOID InitConfigFromReg( VOID );
BOOL InitThreads( IN PTSTHREAD pThreads, IN int nThreads );
PTSTHREAD FindThread( IN DWORD dwThreadTag );
VOID WaitForTermination( VOID );
VOID TabSrvTerminate( IN BOOL fTerminate );
VOID TabSrvLogError( IN LPTSTR ptszFormat, ... );
LONG ReadConfig( IN LPCTSTR lptstrValueName, OUT LPBYTE lpbData, IN DWORD dwcb );
LONG WriteConfig( IN LPCTSTR lptstrValueName, IN DWORD dwType, IN LPBYTE lpbData, IN DWORD dwcb );
LONG GetRegValueString( IN HKEY hkeyTopLevel, IN LPCTSTR pszSubKey, IN LPCTSTR pszValueName, OUT LPTSTR pszValueString, IN OUT LPDWORD lpdwcb );
BOOL SwitchThreadToInputDesktop( IN PTSTHREAD pThread );
BOOL GetInputDesktopName( OUT LPTSTR pszDesktopName, IN DWORD dwcbLen );
BOOL SendAltCtrlDel( VOID );
VOID NotifyClient( IN EVTNOTIFY Event, IN WPARAM wParam, IN LPARAM lParam );
BOOL ImpersonateCurrentUser( VOID );
BOOL RunProcessAsUser( IN LPTSTR pszCmd );
// tabdev.cpp
unsigned __stdcall DeviceThread( IN PVOID param );
BOOL OpenTabletDevice( IN OUT PDEVICE_DATA pDevData );
VOID CloseTabletDevice( IN PDEVICE_DATA pDevData );
PSP_DEVICE_INTERFACE_DETAIL_DATA GetDeviceInterfaceDetail( IN HDEVINFO hDevInfo, IN PSP_DEVICE_INTERFACE_DATA pDevInterface );
BOOL GetDeviceData( IN LPCTSTR pszDevPath, OUT PDEVICE_DATA pDevData );
BOOL ReadReportOverlapped( IN PDEVICE_DATA pDevData, OUT LPVOID lpvBuffer, OUT LPDWORD lpdwcBytesRead, IN LPOVERLAPPED lpOverlapped );
// digidev.cpp
BOOL GetMinMax( IN USAGE UsagePage, IN USAGE Usage, OUT PULONG pulMin, OUT PULONG pulMax );
VOID ProcessDigitizerReport( IN PCHAR pBuff );
VOID AdjustLinearity( IN OUT PUSHORT pwX, IN OUT PUSHORT pwY );
LRESULT ProcessMouseEvent( IN LONG x, IN LONG y, IN WORD wButtons, IN DWORD dwTime, IN BOOL fLowLevelMouse );
VOID PressHoldMode( IN BOOL fEnable );
VOID SetPressHoldCursor( IN BOOL fPressHold );
LPTSTR MakeFileName( IN OUT LPTSTR pszFile );
BOOL CanDoPressHold( IN LONG x, IN LONG y );
// buttons.cpp
VOID ProcessButtonsReport( IN PCHAR pBuff );
VOID CALLBACK ButtonTimerProc( IN HWND hwnd, IN UINT uMsg, IN UINT_PTR idEvent, IN DWORD dwTime );
BOOL DoButtonAction( IN BUTTON_ACTION Action, IN DWORD dwButtonTag, IN BOOL fButtonDown );
BOOL DoInvokeNoteBook( VOID );
VOID UpdateButtonRepeatRate( VOID );
#ifdef MOUSE_THREAD
// mouse.cpp
unsigned __stdcall MouseThread( IN PVOID param );
VOID DoLowLevelMouse( IN PTSTHREAD pThread );
LRESULT CALLBACK LowLevelMouseProc( IN int nCode, IN WPARAM wParam, IN LPARAM lParam );
LRESULT CALLBACK MouseWndProc( IN HWND hwnd, IN UINT uiMsg, IN WPARAM wParam, IN LPARAM lParam ); #endif
// butdev.cpp
unsigned __stdcall ButtonsThread( PVOID param );
// gesture.cpp
int RecognizeGesture( IN LONG x, IN LONG y, IN WORD wButtons, IN DWORD dwTime, IN BOOL fLowLevelMouse );
int Recognize( IN POINT& pt, IN DWORD dwTime );
void AddItem( IN POINT& pt, IN DWORD dwTime );
bool penStopped( IN POINT& pt, IN DWORD dwTime, IN int ci, IN int li );
bool checkEarlierPoints( IN POINT& pt, IN DWORD dwTime, IN int ci, IN int li );
int dist( IN POINT& pt, IN int index );
VOID DoGestureAction( IN GESTURE_ACTION Action, IN LONG x, IN LONG y );
// tsrpc.cpp
unsigned __stdcall RPCServerThread( IN PVOID param );
// Supertip.cpp
unsigned __stdcall SuperTIPThread( IN PVOID param );
LRESULT CALLBACK SuperTIPWndProc( IN HWND hwnd, IN UINT uiMsg, IN WPARAM wParam, IN LPARAM lParam );
#if 0
VOID EnumDisplayModes( VOID ); #endif
VOID UpdateRotation( VOID );
BOOL CALLBACK MonitorEnumProc( IN HMONITOR hMon, IN HDC hdcMon, IN LPRECT lprcMon, IN LPARAM dwData );
BOOL CreateTrayIcon( IN HWND hwnd, IN UINT umsgTray, IN HICON hIcon, IN LPCTSTR ptszTip );
BOOL DestroyTrayIcon( IN HWND hwnd, IN UINT umsgTray, IN HICON hIcon );
BOOL SetBalloonToolTip( IN HWND hwnd, IN UINT umsgTray, IN LPCTSTR ptszTitle, IN LPCTSTR ptszTip, IN UINT uTimeout, IN DWORD dwInfoFlags );
#endif //ifndef _TABSRV_H
|