|
|
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
mutohpen.c
Abstract: Tablet PC Mutoh Pen Tablet Property Sheet module.
Environment:
User mode
Author:
Michael Tsang (MikeTs) 20-Apr-2000
Revision History:
--*/
#include "pch.h"
#ifdef PENPAGE
#define CHANGED_SAMPLINGRATE 0x00000001
#define CHANGED_SIDESW_MAP 0x00000002
#define CHANGED_DIGITAL_FILTER 0x00000004
#define CHANGED_GLITCH_FILTER 0x00000008
#define CHANGED_PENTILTCAL 0x00000010
#define CHANGED_LINEARCAL 0x00000020
#define CHANGED_FEATURES (CHANGED_SAMPLINGRATE | \
CHANGED_DIGITAL_FILTER | \ CHANGED_GLITCH_FILTER) DWORD gdwfChanged = 0; PEN_SETTINGS PenSettings = {0, SWCOMBO_RCLICK}; TCHAR gtszRateTextFormat[32]; COMBOBOX_STRING SwitchComboStringTable[] = { SWCOMBO_NONE, IDS_SWCOMBO_NONE, SWCOMBO_RCLICK, IDS_SWCOMBO_RCLICK, 0, 0 }; DWORD gMutohPenHelpIDs[] = { IDC_SAMPLINGRATE, IDH_MUTOHPEN_SAMPLINGRATE, IDC_SIDE_SWITCH, IDH_MUTOHPEN_SIDE_SWITCH, IDC_ENABLE_DIGITALFILTER, IDH_MUTOHPEN_ENABLE_DIGITALFILTER, IDC_ENABLE_GLITCHFILTER, IDH_MUTOHPEN_ENABLE_GLITCHFILTER, IDC_CALIBRATE, IDH_CALIBRATE, 0, 0 };
/*****************************************************************************
* * @doc EXTERNAL * * @func INT_PTR | MutohPenDlgProc | * Dialog procedure for the pen tablet page. * * @parm IN HWND | hwnd | Window handle. * @parm IN UINT | uMsg | Message. * @parm IN WPARAM | wParam | Word Parameter. * @parm IN LPARAM | lParam | Long Parameter. * * @rvalue Return value depends on the message. * *****************************************************************************/
INT_PTR APIENTRY MutohPenDlgProc( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { TRACEPROC("MutohPenDlgProc", 2) INT_PTR rc = FALSE; ULONG dwFeature, dwMask, Rate; int iSideSwitchMapping; TCHAR tszRateText[32];
TRACEENTER(("(hwnd=%p,Msg=%s,wParam=%x,lParam=%x)\n", hwnd, LookupName(uMsg, WMMsgNames) , wParam, lParam));
switch (uMsg) { case WM_INITDIALOG: rc = InitMutohPenPage(hwnd); if (rc == FALSE) { EnableWindow(hwnd, FALSE); } break;
case WM_NOTIFY: { NMHDR FAR *lpnm = (NMHDR FAR *)lParam;
switch (lpnm->code) { case PSN_APPLY: rc = TRUE; RPC_TRY("TabSrvSetPenFeatures", if ((gdwfChanged & CHANGED_FEATURES) && !TabSrvSetPenFeatures(ghBinding, PENFEATURE_REPORT_ID, PENFEATURE_USAGE_PAGE, PENFEATURE_USAGE, PenSettings.dwFeatures)) { ErrorMsg(IDSERR_TABSRV_SETPENFEATURE); rc = FALSE; } );
if (gdwfChanged & CHANGED_SIDESW_MAP) { //
// BUGBUG: send side switch mapping to TabSrv.
//
}
if (gdwfChanged & CHANGED_PENTILTCAL) { RPC_TRY("TabSrvSetPenTilt", TabSrvSetPenTilt(ghBinding, PenSettings.dxPenTilt, PenSettings.dyPenTilt)); }
if (gdwfChanged & CHANGED_LINEARCAL) { RPC_TRY("TabSrvSetLinearityMap", TabSrvSetLinearityMap(ghBinding, &PenSettings.LinearityMap)); } gdwfChanged = 0; break; } break; }
case WM_COMMAND: { DWORD Changed = 0;
rc = TRUE; switch (LOWORD(wParam)) { case IDC_SIDE_SWITCH: switch (HIWORD(wParam)) { case CBN_SELCHANGE: iSideSwitchMapping = (int)SendMessage(GetDlgItem(hwnd, IDC_SIDE_SWITCH), CB_GETCURSEL, 0, 0); Changed = CHANGED_SIDESW_MAP; break; } break;
case IDC_ENABLE_DIGITALFILTER: dwFeature = IsDlgButtonChecked(hwnd, IDC_ENABLE_DIGITALFILTER)? PENFEATURE_DIGITAL_FILTER_ON: 0; dwMask = PENFEATURE_DIGITAL_FILTER_ON; Changed = CHANGED_DIGITAL_FILTER; break;
case IDC_ENABLE_GLITCHFILTER: dwFeature = IsDlgButtonChecked(hwnd, IDC_ENABLE_GLITCHFILTER)? PENFEATURE_GLITCH_FILTER_ON: 0; dwMask = PENFEATURE_GLITCH_FILTER_ON; Changed = CHANGED_GLITCH_FILTER; break;
case IDC_CALIBRATE: switch (HIWORD(wParam)) { case BN_CLICKED: { BOOL fCalLinear = ((GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState(VK_MENU) & 0x8000));
if (fCalLinear) { LONG cxScreen = GetSystemMetrics(SM_CXSCREEN); LONG cyScreen = GetSystemMetrics(SM_CYSCREEN);
if (cxScreen > cyScreen) { rc = CreateLinearCalWindow(hwnd); } else { MessageBeep(MB_ICONEXCLAMATION); } } else if (!CreatePenTiltCalWindow(hwnd)) { ErrorMsg(IDSERR_CALIBRATE_CREATEWINDOW); rc = FALSE; } break; } } break; }
if ((rc == TRUE) && (Changed != 0)) { if (Changed & CHANGED_FEATURES) { PenSettings.dwFeatures &= ~dwMask; PenSettings.dwFeatures |= dwFeature; } else if (Changed & CHANGED_SIDESW_MAP) { PenSettings.iSideSwitchMap = iSideSwitchMapping; }
gdwfChanged |= Changed; SendMessage(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0); } break; }
case WM_HSCROLL: { dwFeature = (ULONG)(PENFEATURE_RATE_MAX - SendDlgItemMessage(hwnd, IDC_SAMPLINGRATE, TBM_GETPOS, 0, 0)); if (dwFeature == 1) { dwFeature = 0; Rate = 100; } else if (dwFeature == 0) { dwFeature = 1; Rate = 133; } else { Rate = 133/dwFeature; }
if ((PenSettings.dwFeatures ^ dwFeature) & PENFEATURE_RATE_MASK) { gdwfChanged |= CHANGED_SAMPLINGRATE; PenSettings.dwFeatures &= ~PENFEATURE_RATE_MASK; PenSettings.dwFeatures |= dwFeature; wsprintf(tszRateText, gtszRateTextFormat, Rate); SetDlgItemText(hwnd, IDC_RATE_TEXT, tszRateText); SendMessage(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0); rc = TRUE; } break; }
case WM_PENTILTCAL_DONE: //
// wParam contains the user response of calibration.
// lParam contains the calibration window handle.
//
if (wParam == IDYES) { gdwfChanged |= CHANGED_PENTILTCAL; SendMessage(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0); } DestroyWindow((HWND)lParam); break;
case WM_LINEARCAL_DONE: //
// wParam contains the user response of calibration.
// lParam contains the calibration window handle.
//
if (wParam == IDYES) { gdwfChanged |= CHANGED_LINEARCAL; SendMessage(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0); } DestroyWindow((HWND)lParam); break;
case WM_HELP: WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, TEXT("tabletpc.hlp"), HELP_WM_HELP, (DWORD_PTR)gMutohPenHelpIDs); break;
case WM_CONTEXTMENU: WinHelp((HWND)wParam, TEXT("tabletpc.hlp"), HELP_CONTEXTMENU, (DWORD_PTR)gMutohPenHelpIDs); break; }
TRACEEXIT(("=%x\n", rc)); return rc; } //MutohPenDlgProc
/*****************************************************************************
* * @doc INTERNAL * * @func BOOL | InitMutohPenPage | * Initialize the Mutoh Pen property page. * * @parm IN HWND | hwnd | Window handle. * * @rvalue SUCCESS | Returns TRUE. * @rvalue FAILURE | Returns FALSE. * *****************************************************************************/
BOOL InitMutohPenPage( IN HWND hwnd ) { TRACEPROC("InitMutohPenPage", 2) BOOL rc; ULONG dwFeature, Rate; TCHAR tszRateText[32];
TRACEENTER(("(hwnd=%x)\n", hwnd));
LoadString(ghInstance, IDS_RATE_TEXT_FORMAT, gtszRateTextFormat, sizeof(gtszRateTextFormat)/sizeof(TCHAR));
SendDlgItemMessage(hwnd, IDC_SAMPLINGRATE, TBM_SETRANGE, TRUE, MAKELONG(PENFEATURE_RATE_MIN, PENFEATURE_RATE_MAX));
RPC_TRY("TabSrvGetPenFeatures", rc = TabSrvGetPenFeatures(ghBinding, PENFEATURE_REPORT_ID, PENFEATURE_USAGE_PAGE, PENFEATURE_USAGE, &PenSettings.dwFeatures)); if (rc == TRUE) { dwFeature = PenSettings.dwFeatures & PENFEATURE_RATE_MASK; if (dwFeature == 1) { //
// 1 actual means fastest (133 samples/sec)
//
dwFeature = 0; Rate = 133; } else if (dwFeature == 0) { //
// Custom rate (100 samples/sec)
//
dwFeature = 1; Rate = 100; } else { Rate = 133/dwFeature; }
SendDlgItemMessage(hwnd, IDC_SAMPLINGRATE, TBM_SETPOS, TRUE, PENFEATURE_RATE_MAX - dwFeature); wsprintf(tszRateText, gtszRateTextFormat, Rate); SetDlgItemText(hwnd, IDC_RATE_TEXT, tszRateText);
InsertComboBoxStrings(hwnd, IDC_SIDE_SWITCH, SwitchComboStringTable); SendDlgItemMessage(hwnd, IDC_SIDE_SWITCH, CB_SETCURSEL, PenSettings.iSideSwitchMap, 0);
CheckDlgButton(hwnd, IDC_ENABLE_DIGITALFILTER, (PenSettings.dwFeatures & PENFEATURE_DIGITAL_FILTER_ON) != 0);
CheckDlgButton(hwnd, IDC_ENABLE_GLITCHFILTER, (PenSettings.dwFeatures & PENFEATURE_GLITCH_FILTER_ON) != 0); } else { PenSettings.dwFeatures = 0; ErrorMsg(IDSERR_TABSRV_GETPENFEATURE); rc = FALSE; }
if (rc == TRUE) { //
// BUGBUG: Read and init side switch mapping.
//
}
TRACEEXIT(("=%x\n", rc)); return rc; } //InitMutohPenPage
#endif
|