|
|
/*****************************************************************************
* * diqmode.c * * "Mode" property sheet page. * *****************************************************************************/
#include "diquick.h"
/*****************************************************************************
* * Common_AcqSetDataFormat * * Common worker function that sets the data format. * *****************************************************************************/
STDMETHODIMP Common_AcqSetDataFormat(PDEVDLGINFO pddi) { return IDirectInputDevice8_SetDataFormat(pddi->pdid, pddi->pvtbl->pdf); }
/*****************************************************************************
* * Common_AcqDestroy * * Common worker function that doesn't do anything. * *****************************************************************************/
STDMETHODIMP_(void) Common_AcqDestroy(PDEVDLGINFO pddi) { }
/*****************************************************************************
* * Mode_SyncCheckButtons * * Sync the dialog buttons with the IDirectInputXxx object. * *****************************************************************************/
void INTERNAL Mode_SyncCheckButtons(PDEVDLGINFO pddi, HWND hdlg) { UINT idc; DWORD dw;
switch (pddi->discl) { default: case DISCL_BACKGROUND | DISCL_NONEXCLUSIVE: idc = IDC_DEV_PASSIVE; break;
case DISCL_FOREGROUND | DISCL_NONEXCLUSIVE: idc = IDC_DEV_PASSIVE_FOREGROUND; break;
case DISCL_BACKGROUND | DISCL_EXCLUSIVE: idc = IDC_DEV_ACTIVE_BACKGROUND; break;
case DISCL_FOREGROUND | DISCL_EXCLUSIVE: idc = IDC_DEV_ACTIVE; break;
}
CheckRadioButton(hdlg, IDC_DEV_PASSIVE, IDC_DEV_ACTIVE, idc);
CheckRadioButton(hdlg, IDC_DEV_POLLED, IDC_DEV_EVENT, pddi->fPoll ? IDC_DEV_POLLED : IDC_DEV_EVENT);
EnableWindow(GetDlgItem(hdlg, IDC_DEV_NOWINKEY), FALSE); if (pddi->pvtbl == &c_acqvtblDevMouse || pddi->pvtbl == &c_acqvtblDevMouse2 ) { idc = IDC_DEV_MOUSE; } else if (pddi->pvtbl == &c_acqvtblDevKbd) { idc = IDC_DEV_KEYBOARD; EnableWindow(GetDlgItem(hdlg, IDC_DEV_NOWINKEY), TRUE); } else if (pddi->pvtbl == &c_acqvtblDevJoy) { idc = IDC_DEV_JOYSTICK; } else if (pddi->pvtbl == &c_acqvtblDev) { idc = IDC_DEV_DEVICE; } else { idc = 0; }
CheckRadioButton(hdlg, IDC_DEV_MOUSE, IDC_DEV_DEVICE, idc);
if (SUCCEEDED(GetDwordProperty(pddi->pdid, DIPROP_AXISMODE, &dw))) { CheckRadioButton(hdlg, IDC_DEV_ABS, IDC_DEV_REL, dw == DIPROPAXISMODE_ABS ? IDC_DEV_ABS : IDC_DEV_REL); }
if (SUCCEEDED(GetDwordProperty(pddi->pdid, DIPROP_CALIBRATIONMODE, &dw))) { } else { dw = 0; } CheckDlgButton(hdlg, IDC_DEV_CAL, dw);
}
/*****************************************************************************
* * Mode_OnDataFormat * * Change the device data format. * *****************************************************************************/
BOOL INTERNAL Mode_OnDataFormat(PDEVDLGINFO pddi, HWND hdlg, UINT id) { DIDEVCAPS didc; HRESULT hres; UINT idDev;
/*
* Kill the old data format before setting the new one. */ if (pddi->pvtbl) { pddi->pvtbl->Destroy(pddi); }
if( id == 0 ) { //from On_InitDialog
didc.dwSize = cbX(DIDEVCAPS_DX3); hres = IDirectInputDevice8_GetCapabilities(pddi->pdid, &didc); if (SUCCEEDED(hres)) idDev = GET_DIDEVICE_TYPE(didc.dwDevType); } else idDev = id+0x100; // Hack, add 0x100 to make sure ranges do not overlap
switch (idDev) {
case DI8DEVTYPE_MOUSE: case IDC_DEV_MOUSE+0x100: #if DIRECTINPUT_VERSION >= 0x700
pddi->pvtbl = &c_acqvtblDevMouse2; #else
pddi->pvtbl = &c_acqvtblDevMouse; #endif
break;
case DI8DEVTYPE_KEYBOARD: case IDC_DEV_KEYBOARD+0x100: pddi->pvtbl = &c_acqvtblDevKbd; break;
case DI8DEVTYPE_JOYSTICK: case DI8DEVTYPE_GAMEPAD: case DI8DEVTYPE_DRIVING: case DI8DEVTYPE_FLIGHT: case DI8DEVTYPE_1STPERSON: case DI8DEVTYPE_DEVICECTRL: case DI8DEVTYPE_SCREENPOINTER: case DI8DEVTYPE_REMOTE: case DI8DEVTYPE_SUPPLEMENTAL: case IDC_DEV_JOYSTICK+0x100: pddi->pvtbl = &c_acqvtblDevJoy; break;
case DI8DEVTYPE_DEVICE: case IDC_DEV_DEVICE+0x100: pddi->pvtbl = &c_acqvtblDev; break; }
if (pddi->pvtbl) { HRESULT hres; hres = pddi->pvtbl->SetDataFormat(pddi); if (FAILED(hres)) { MessageBoxV(GetParent(hdlg), IDS_ERR_DATAFORMAT); } }
/* Always sync buttons, because the data format may change axis modes */ Mode_SyncCheckButtons(pddi, hdlg);
return 1; }
/*****************************************************************************
* * Mode_OnInitDialog * * Set up all the random switches. * * Notice that GetCapabilities is in the same location in all the * DirectInputXxx interfaces. * *****************************************************************************/
#pragma BEGIN_CONST_DATA
/*
* Acceleration info: Accelerate in steps of 32, then 128. */
UDACCEL c_uda[] = { { 0, 32 }, { 1, 128 }, };
#pragma END_CONST_DATA
BOOL INTERNAL Mode_OnInitDialog(HWND hdlg, LPARAM lp) { PDEVDLGINFO pddi = (PV)(((LPPROPSHEETPAGE)lp)->lParam);
SetDialogPtr(hdlg, pddi);
CheckRadioButton(hdlg, IDC_DEV_ABS, IDC_DEV_REL, IDC_DEV_ABS);
/*
* Note that we do not check any device format. * This lets us make sure that things work when nothing is selected. */
Mode_SyncCheckButtons(pddi, hdlg);
/*
* Configure the buffer size edit and its updown control. */ SetDlgItemInt(hdlg, IDC_DEV_BUFSIZE, 0, 0); SendDlgItemMessage(hdlg, IDC_DEV_BUFSIZEUD, UDM_SETACCEL, cA(c_uda), (LPARAM)&c_uda); SendDlgItemMessage(hdlg, IDC_DEV_BUFSIZEUD, UDM_SETRANGE, 0, MAKELONG(1025, 0)); /* 1025 is illegal */
Mode_OnDataFormat( pddi, hdlg, 0 );
return 1; }
/*****************************************************************************
* * Mode_OnCooperativity * *****************************************************************************/
BOOL INTERNAL Mode_OnCooperativity(PDEVDLGINFO pddi, HWND hdlg, int id) { HRESULT hres; DWORD discl = 0;
switch (id) { case IDC_DEV_ACTIVE_BACKGROUND: discl = DISCL_BACKGROUND | DISCL_EXCLUSIVE; break; case IDC_DEV_ACTIVE: discl = DISCL_FOREGROUND | DISCL_EXCLUSIVE; break; case IDC_DEV_PASSIVE_FOREGROUND: discl = DISCL_FOREGROUND | DISCL_NONEXCLUSIVE; break; case IDC_DEV_PASSIVE: discl = DISCL_BACKGROUND | DISCL_NONEXCLUSIVE; break; case IDC_DEV_NOWINKEY: if( IsDlgButtonChecked(hdlg, IDC_DEV_NOWINKEY) ) { discl = pddi->disclLastTry | DISCL_NOWINKEY; } else { discl = pddi->disclLastTry & ~DISCL_NOWINKEY; } }
if( id != IDC_DEV_NOWINKEY ) { if( IsDlgButtonChecked(hdlg, IDC_DEV_NOWINKEY) ) { discl = discl | DISCL_NOWINKEY; } else { discl = discl & ~DISCL_NOWINKEY; } }
if (discl != pddi->disclLastTry && discl != pddi->discl) { pddi->disclLastTry = discl; hres = IDirectInputDevice8_SetCooperativeLevel(pddi->pdid, GetParent(hdlg), discl); if (SUCCEEDED(hres)) { pddi->discl = discl; } else { CheckDlgButton( hdlg, IDC_DEV_NOWINKEY, BST_UNCHECKED ); Mode_SyncCheckButtons(pddi, hdlg); MessageBoxV(GetParent(hdlg), IDS_ERR_COOPERATIVITY); } }
return 1; }
/*****************************************************************************
* * Mode_OnDataMode * *****************************************************************************/
BOOL INTERNAL Mode_OnDataMode(PDEVDLGINFO pddi, HWND hdlg, int id) { pddi->fPoll = (id == IDC_DEV_POLLED); return 1; }
/*****************************************************************************
* * Mode_OnAxisMode * *****************************************************************************/
BOOL INTERNAL Mode_OnAxisMode(PDEVDLGINFO pddi, HWND hdlg, int id) { if (pddi && pddi->pdid) { DWORD dwMode; HRESULT hres; if (id == IDC_DEV_ABS) { dwMode = DIPROPAXISMODE_ABS; } else { dwMode = DIPROPAXISMODE_REL; } hres = SetDwordProperty(pddi->pdid, DIPROP_AXISMODE, dwMode); if (SUCCEEDED(hres)) { } else { MessageBoxV(GetParent(hdlg), IDS_ERR_AXISMODE); }
} return 1; }
/*****************************************************************************
* * Mode_OnCalMode * *****************************************************************************/
BOOL INTERNAL Mode_OnCalMode(PDEVDLGINFO pddi, HWND hdlg) { if (pddi && pddi->pdid) { DWORD dwMode; HRESULT hres;
dwMode = IsDlgButtonChecked(hdlg, IDC_DEV_CAL); hres = SetDwordProperty(pddi->pdid, DIPROP_CALIBRATIONMODE, dwMode); if (SUCCEEDED(hres)) { } else { MessageBoxV(GetParent(hdlg), IDS_ERR_CALMODE); }
} return 1; }
/*****************************************************************************
* * Mode_SyncBufferSize * *****************************************************************************/
BOOL INTERNAL Mode_SyncBufferSize(PDEVDLGINFO pddi, HWND hdlg) { if (pddi && pddi->pdid) { UINT ui = GetDlgItemInt(hdlg, IDC_DEV_BUFSIZE, 0, 0); HRESULT hres;
hres = SetDwordProperty(pddi->pdid, DIPROP_BUFFERSIZE, ui); if (SUCCEEDED(hres)) { } else { MessageBoxV(GetParent(hdlg), IDS_ERR_BUFFERSIZE); } }
return 1; }
/*****************************************************************************
* * Mode_OnCommand * *****************************************************************************/
BOOL INTERNAL Mode_OnCommand(HWND hdlg, int id, UINT cmd) { PDEVDLGINFO pddi = GetDialogPtr(hdlg);
if (cmd == BN_CLICKED) {
switch (id) {
case IDC_DEV_PASSIVE: case IDC_DEV_PASSIVE_FOREGROUND: case IDC_DEV_ACTIVE_BACKGROUND: case IDC_DEV_ACTIVE: case IDC_DEV_NOWINKEY: return Mode_OnCooperativity(pddi, hdlg, id);
case IDC_DEV_POLLED: case IDC_DEV_EVENT: return Mode_OnDataMode(pddi, hdlg, id);
case IDC_DEV_ABS: case IDC_DEV_REL: return Mode_OnAxisMode(pddi, hdlg, id);
case IDC_DEV_CAL: return Mode_OnCalMode(pddi, hdlg);
case IDC_DEV_MOUSE: case IDC_DEV_KEYBOARD: case IDC_DEV_JOYSTICK: case IDC_DEV_DEVICE: return Mode_OnDataFormat(pddi, hdlg, id);
} } else if (cmd == EN_UPDATE) { if (id == IDC_DEV_BUFSIZE) { return Mode_SyncBufferSize(pddi, hdlg); } } return 0; }
/*****************************************************************************
* * Mode_DlgProc * *****************************************************************************/
INT_PTR CALLBACK Mode_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp) { switch (wm) { case WM_INITDIALOG: return Mode_OnInitDialog(hdlg, lp);
case WM_COMMAND: return Mode_OnCommand(hdlg, (int)GET_WM_COMMAND_ID(wp, lp), (UINT)GET_WM_COMMAND_CMD(wp, lp)); } return 0; }
|