Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

512 lines
13 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
tabletpc.c
Abstract: Tablet PC Control Panel applet main module.
Environment:
User mode
Author:
Michael Tsang (MikeTs) 20-Apr-2000
Revision History:
--*/
#include "pch.h"
HINSTANCE ghInstance = NULL;
RPC_BINDING_HANDLE ghBinding = NULL;
#ifdef SYSACC
HANDLE ghSysAcc = INVALID_HANDLE_VALUE;
HFONT ghFont = NULL;
#endif
TCHAR gtszTitle[64] = {0};
UINT uHelpMessage = 0;
TABLETPC_PROPPAGE TabletPCPropPages[] =
{
#ifdef PENPAGE
MAKEINTRESOURCE(IDD_MUTOHPEN), MutohPenDlgProc, 0,
#endif
#ifdef BUTTONPAGE
MAKEINTRESOURCE(IDD_BUTTONS), ButtonsDlgProc, 0,
#endif
MAKEINTRESOURCE(IDD_DISPLAY), DisplayDlgProc, 0,
MAKEINTRESOURCE(IDD_GESTURE), GestureDlgProc, 0,
#ifdef DEBUG
MAKEINTRESOURCE(IDD_TUNING), TuningDlgProc, 0,
#endif
#ifdef BATTINFO
MAKEINTRESOURCE(IDD_BATTERY), BatteryDlgProc, 0,
#endif
#ifdef CHGRINFO
MAKEINTRESOURCE(IDD_CHARGER), ChargerDlgProc, 0,
#endif
#ifdef TMPINFO
MAKEINTRESOURCE(IDD_TEMPERATURE), TemperatureDlgProc, 0,
#endif
0, NULL, 0
};
#define MAX_PAGES (sizeof(TabletPCPropPages)/sizeof(TABLETPC_PROPPAGE))
/*++
@doc EXTERNAL
@func BOOL | DllInitialize |
Library entry point.
@parm IN HINSTANCE | hDLLInstance | Instance handle.
@parm IN DWORD | dwReason | Reason being called.
@parm IN LPVOID | lpvReserved | Reserved (Unused).
@rvalue SUCCESS | always returns TRUE
--*/
BOOL WINAPI
DllInitialize(
IN HINSTANCE hDLLInstance,
IN DWORD dwReason,
IN LPVOID lpvReserved OPTIONAL
)
{
UNREFERENCED_PARAMETER(lpvReserved);
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
ghInstance = hDLLInstance;
LoadString(ghInstance,
IDS_TITLE,
gtszTitle,
sizeof(gtszTitle)/sizeof(TCHAR));
DisableThreadLibraryCalls(ghInstance);
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
} //DllInitialize
/*++
@doc EXTERNAL
@func LONG | CPlApplet |
Library-defined callback function that serves as the entry point
for a Control Panel application.
@parm IN HHWN | hwnd | Main window handle.
@parm IN UINT | uMsg | Message.
@parm IN LONG | lParam1 | Message specific parameter 1.
@parm IN LONG | lParam2 | Message specific parameter 2.
@rvalue Return value depends on the message.
--*/
LONG APIENTRY
CPlApplet(
IN HWND hwnd,
IN UINT uMsg,
IN LONG lParam1,
IN LONG lParam2
)
{
TRACEPROC("CPlApplet", 1)
LONG rc = 0;
TRACEENTER(("(hwnd=%p,Msg=%s,Param1=%x,Param2=%x)\n",
hwnd, LookupName(uMsg, CPLMsgNames), lParam1, lParam2));
switch (uMsg)
{
case CPL_INIT:
TRACEINIT(MODNAME, 0, 0);
uHelpMessage = RegisterWindowMessage(TEXT("ShellHelp"));
rc = (LONG)TRUE;
break;
case CPL_GETCOUNT:
rc = 1;
break;
case CPL_INQUIRE:
{
LPCPLINFO CPLInfo = (LPCPLINFO)lParam2;
CPLInfo->idIcon = IDI_TABLETPC;
CPLInfo->idName = IDS_NAME;
CPLInfo->idInfo = IDS_INFO;
CPLInfo->lData = 0;
rc = (LONG)TRUE;
break;
}
case CPL_NEWINQUIRE:
{
LPNEWCPLINFO NewCPLInfo = (LPNEWCPLINFO)lParam2;
memset(NewCPLInfo, 0, sizeof(NEWCPLINFO));
NewCPLInfo->dwSize = sizeof(NEWCPLINFO);
NewCPLInfo->hIcon = LoadIcon(ghInstance,
MAKEINTRESOURCE(IDI_TABLETPC));
LoadString(ghInstance,
IDS_NAME,
NewCPLInfo->szName,
sizeof(NewCPLInfo->szName)/sizeof(TCHAR));
LoadString(ghInstance,
IDS_INFO,
NewCPLInfo->szInfo,
sizeof(NewCPLInfo->szInfo)/sizeof(TCHAR));
lstrcpy(NewCPLInfo->szHelpFile, TEXT(""));
rc = (LONG)TRUE;
break;
}
case CPL_DBLCLK:
lParam2 = 0L;
//
// Fall through ...
//
case CPL_STARTWPARMS:
{
HWND hwndMe;
if (!(gtszTitle[0]))
{
LoadString(ghInstance,
IDS_TITLE,
gtszTitle,
sizeof(gtszTitle)/sizeof(TCHAR));
}
hwndMe = FindWindow(TEXT("#32770"), gtszTitle);
if (hwndMe != NULL)
{
//
// We found another copy running, let's just switch focus to it.
//
SetForegroundWindow(hwndMe);
}
else
{
rc = RunApplet(hwnd, (LPTSTR)lParam2);
}
break;
}
case CPL_STOP:
break;
case CPL_EXIT:
#ifdef SYSACC
if (ghSysAcc != INVALID_HANDLE_VALUE)
{
CloseHandle(ghSysAcc);
ghSysAcc = INVALID_HANDLE_VALUE;
}
#endif
TRACETERMINATE();
break;
}
TRACEEXIT(("=%d\n", rc));
return rc;
} //CPlApplet
/*++
@doc INTERNAL
@func VOID | RunApplet |
The applet has been invoked.
@parm IN HHWN | hwnd | Main window handle.
@parm IN LPTSTR | CmdLine | Supplies the command line used to
invoke the applet.
@rvalue SUCCESS | Returns TRUE.
@rvalue FAILURE | Returns FALSE.
--*/
BOOL
RunApplet(
IN HWND hwnd,
IN LPTSTR CmdLine OPTIONAL
)
{
TRACEPROC("RunApplet", 1)
BOOL rc = FALSE;
RPC_STATUS status;
unsigned char *StringBinding;
TRACEENTER(("(hwnd=%p,CmdLine=%s)\n", hwnd, CmdLine? CmdLine: "NULL"));
if ((status = RpcStringBindingCompose(NULL,
TEXT("ncalrpc"),
NULL,
NULL,
NULL,
&StringBinding)) != RPC_S_OK)
{
ErrorMsg(IDSERR_STRING_BINDING, status);
}
else if ((status = RpcBindingFromStringBinding(StringBinding, &ghBinding))
!= RPC_S_OK)
{
ErrorMsg(IDSERR_BINDING_HANDLE, status);
}
else if ((status = RpcBindingSetAuthInfo(ghBinding,
NULL,
RPC_C_AUTHN_LEVEL_NONE,
RPC_C_AUTHN_WINNT,
NULL,
0)) != RPC_S_OK)
{
ErrorMsg(IDSERR_SETAUTHO_INFO, status);
}
else
{
INITCOMMONCONTROLSEX ComCtrl;
#ifdef SYSACC
ghSysAcc = CreateFile(SMBLITE_IOCTL_DEVNAME,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (ghSysAcc == INVALID_HANDLE_VALUE)
{
ErrorMsg(IDSERR_SYSACC_OPENDEV, GetLastError());
}
ghFont = GetStockObject(SYSTEM_FIXED_FONT);
#endif
ComCtrl.dwSize = sizeof(ComCtrl);
ComCtrl.dwICC = ICC_BAR_CLASSES | ICC_USEREX_CLASSES;
if (InitCommonControlsEx(&ComCtrl))
{
HPROPSHEETPAGE hPages[MAX_PAGES];
PROPSHEETHEADER psh;
psh.dwSize = sizeof(psh);
psh.dwFlags = 0;
psh.hwndParent = hwnd;
psh.hInstance = ghInstance;
psh.pszCaption = MAKEINTRESOURCE(IDS_TITLE);
psh.phpage = hPages;
psh.nStartPage = 0;
psh.nPages = CreatePropertyPages(TabletPCPropPages, hPages);
if (PropertySheet(&psh) >= 0)
{
rc = TRUE;
}
else
{
ErrorMsg(IDSERR_PROP_SHEET, GetLastError());
}
}
else
{
ErrorMsg(IDSERR_COMMCTRL);
}
}
TRACEEXIT(("=%x\n", rc));
return rc;
} //RunApplet
/*++
@doc INTERNAL
@func VOID | CreatePropertyPages |
Create all the property sheet pages according to the property
page table.
@parm IN PTABLETPC_PROPPAGE | TabletPCPages | Points to the property page
table.
@parm OUT HPROPSHEETPAGE * | hPages | Points to the array to hold all
the created property sheet handles.
@rvalue Returns number of property page handles created.
--*/
UINT
CreatePropertyPages(
IN PTABLETPC_PROPPAGE TabletPCPages,
OUT HPROPSHEETPAGE *hPages
)
{
TRACEPROC("CreatePropertyPages", 3)
UINT nPages = 0;
PROPSHEETPAGE psp;
TRACEENTER(("(TabletPCPages=%p,hPages=%p)\n", TabletPCPages, hPages));
psp.dwSize = sizeof(psp);
psp.dwFlags = 0;
psp.hInstance = ghInstance;
psp.pszTitle = NULL;
psp.lParam = 0;
while (TabletPCPages->DlgTemplate != NULL)
{
psp.pszTemplate = TabletPCPages->DlgTemplate;
psp.pfnDlgProc = TabletPCPages->DlgProc;
TabletPCPages->hPropSheetPage = CreatePropertySheetPage(&psp);
if (TabletPCPages->hPropSheetPage != NULL)
{
hPages[nPages] = TabletPCPages->hPropSheetPage;
nPages++;
}
TabletPCPages++;
}
TRACEEXIT(("=%d\n", nPages));
return nPages;
} //CreatePropertyPages
/*++
@doc INTERNAL
@func VOID | InsertComboBoxStrings |
Insert the strings into the given combo box.
@parm IN HWND | hwnd | Dialog handle.
@parm IN UINT | ComboBoxID | The ID of the combo box.
@parm IN PCOMBOBOX_STRING | ComboString | Points to the combo box
string table.
@rvalue None.
--*/
VOID
InsertComboBoxStrings(
IN HWND hwnd,
IN UINT ComboBoxID,
IN PCOMBOBOX_STRING ComboString
)
{
TRACEPROC("InsertComboBoxStrings", 3)
TCHAR tszStringText[64];
TRACEENTER(("(hwnd=%x,ComboBoxID=%x,ComboStringTable=%p)\n",
hwnd, ComboBoxID, ComboString));
SendDlgItemMessage(hwnd, ComboBoxID, CB_RESETCONTENT, 0, 0);
while (ComboString->StringID != 0)
{
LoadString(ghInstance,
ComboString->StringID,
tszStringText,
sizeof(tszStringText)/sizeof(TCHAR));
SendDlgItemMessage(hwnd,
ComboBoxID,
CB_INSERTSTRING,
ComboString->StringIndex,
(LPARAM)tszStringText);
ComboString++;
}
TRACEEXIT(("!\n"));
return;
} //InsertComboBoxStrings
/*****************************************************************************
*
* @doc INTERNAL
*
* @func VOID | EnableDlgControls | Enable dialog controls.
*
* @parm IN HWND | hwnd | Window handle.
* @parm IN int * | piControls | Points to the dialog control array.
* @parm IN BOOL | fEnable | TRUE if enable.
*
* @rvalue None.
*
*****************************************************************************/
VOID
EnableDlgControls(
IN HWND hwnd,
IN int *piControls,
IN BOOL fEnable
)
{
TRACEPROC("EnableDlgControls", 2)
TRACEENTER(("(hwnd=%x,piControls=%p,fEnable=%x)\n",
hwnd, piControls, fEnable));
while (*piControls != 0)
{
EnableWindow(GetDlgItem(hwnd, *piControls), fEnable);
piControls++;
}
TRACEEXIT(("!\n"));
return;
} //EnableDlgControls
/*++
@doc EXTERNAL
@func void __RPC_FAR * | MIDL_user_allocate | MIDL allocate.
@parm IN size_t | len | size of allocation.
@rvalue SUCCESS | Returns the pointer to the memory allocated.
@rvalue FAILURE | Returns NULL.
--*/
void __RPC_FAR * __RPC_USER
MIDL_user_allocate(
IN size_t len
)
{
TRACEPROC("MIDL_user_allocate", 5)
void __RPC_FAR *ptr;
TRACEENTER(("(len=%d)\n", len));
ptr = malloc(len);
TRACEEXIT(("=%p\n", ptr));
return ptr;
} //MIDL_user_allocate
/*++
@doc EXTERNAL
@func void | MIDL_user_free | MIDL free.
@parm IN void __PRC_FAR * | ptr | Points to the memory to be freed.
@rvalue None.
--*/
void __RPC_USER
MIDL_user_free(
IN void __RPC_FAR *ptr
)
{
TRACEPROC("MIDL_user_free", 5)
TRACEENTER(("(ptr=%p)\n", ptr));
free(ptr);
TRACEEXIT(("!\n"));
return;
} //MIDL_user_free