Files
ProSystem-Core/Win/Input.cpp
T
clobber 6d1f51397e Initial port
Still needs sound. Note: won't run with optimizations so release build
is -O0
2013-07-30 02:31:40 -05:00

1351 lines
42 KiB
C++
Executable File

// ----------------------------------------------------------------------------
// ___ ___ ___ ___ ___ ____ ___ _ _
// /__/ /__/ / / /__ /__/ /__ / /_ / |/ /
// / / \ /__/ ___/ ___/ ___/ / /__ / / emulator
//
// ----------------------------------------------------------------------------
// Copyright 2005 Greg Stanton
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// ----------------------------------------------------------------------------
// Input.cpp
// ----------------------------------------------------------------------------
#include <dinput.h>
#include "Input.h"
#include "Console.h"
#define INPUT_KEY_SIZE 100
#define INPUT_JOY_SIZE 20
byte input_keys[17] = {DIK_RIGHT, DIK_LEFT, DIK_DOWN, DIK_UP, DIK_X, DIK_Z, DIK_L, DIK_J, DIK_K, DIK_I, DIK_M, DIK_N, DIK_F2, DIK_F3, DIK_F4, DIK_F5, DIK_F6};
byte input_values[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte input_devices[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte user_keys[2] = {DIK_ESCAPE, DIK_F4};
byte user_values[2] = {0,0};
byte user_devices[2] = {0,0};
byte user_modifiers[2] = {0,DIK_LALT};
static LPDIRECTINPUT input_dinput = NULL;
static LPDIRECTINPUTDEVICE2 input_joystick[128] = {NULL,NULL};
static LPDIRECTINPUTDEVICE input_keyboard = NULL;
extern const std::string input_keyTitles[ ];
extern const byte input_keyValues[ ];
extern const std::string input_joyTitles[ ];
extern const byte input_joyValues[ ];
HINSTANCE input_hInstance;
static int current_device;
BOOL CALLBACK InitJoysticksCallback(const DIDEVICEINSTANCE*
pdidInstance, VOID* pContext);
void input_GetJoystickPartState ( byte part, byte *state, DIJOYSTATE *js );
// ----------------------------------------------------------------------------
// InitializeKeys
// ----------------------------------------------------------------------------
static void input_InitializeKeys(HWND hCombo, int value) {
if ( !value ) {
for(int index = 0; index < INPUT_KEY_SIZE; index++) {
SendMessage(hCombo, CB_INSERTSTRING, index, (LPARAM)input_keyTitles[index].c_str( ));
SendMessage(hCombo, CB_SETITEMDATA, index, input_keyValues[index]);
}
}
else {
for(int index = 0; index < INPUT_JOY_SIZE; index++) {
SendMessage(hCombo, CB_INSERTSTRING, index, (LPARAM)input_joyTitles[index].c_str( ));
SendMessage(hCombo, CB_SETITEMDATA, index, input_joyValues[index]);
}
}
}
// ----------------------------------------------------------------------------
// SelectKey
// ----------------------------------------------------------------------------
static void input_SelectKey(HWND hCombo, int value) {
for(int index = 0; index < INPUT_KEY_SIZE; index++) {
if(SendMessage(hCombo, CB_GETITEMDATA, index, 0) == value) {
SendMessage(hCombo, CB_SETCURSEL, index, 0);
return;
}
}
}
// ----------------------------------------------------------------------------
// InitializeModifiers
// ----------------------------------------------------------------------------
static void input_InitializeModifiers(HWND hCombo, int value) {
if ( value ) {
SendMessage(hCombo, CB_SHOWDROPDOWN, false, 0);
SendMessage(hCombo, CB_RESETCONTENT, 0, 0);
}
else {
SendMessage(hCombo, CB_SHOWDROPDOWN, true, 0);
SendMessage(hCombo, CB_INSERTSTRING, 0, (LPARAM)"None");
SendMessage(hCombo, CB_SETITEMDATA, 0, 0);
SendMessage(hCombo, CB_INSERTSTRING, 1, (LPARAM)"Shift");
SendMessage(hCombo, CB_SETITEMDATA, 1, DIK_LSHIFT);
SendMessage(hCombo, CB_INSERTSTRING, 2, (LPARAM)"Alt");
SendMessage(hCombo, CB_SETITEMDATA, 2, DIK_LALT);
SendMessage(hCombo, CB_INSERTSTRING, 3, (LPARAM)"Ctrl");
SendMessage(hCombo, CB_SETITEMDATA, 3, DIK_LCONTROL);
}
}
// ----------------------------------------------------------------------------
// SelectModifier
// ----------------------------------------------------------------------------
static void input_SelectModifier(HWND hCombo, int value) {
for(int index = 0; index < 4; index++) {
if(SendMessage(hCombo, CB_GETITEMDATA, index, 0) == value) {
SendMessage(hCombo, CB_SETCURSEL, index, 0);
return;
}
}
}
// ----------------------------------------------------------------------------
// AddDevice
// ----------------------------------------------------------------------------
static void input_AddDevice(HWND hCombo, char *string, unsigned int value) {
int index;
index = SendMessage(hCombo, CB_INSERTSTRING, -1, (LPARAM)string);
SendMessage(hCombo, CB_SETITEMDATA, index, value);
}
// ----------------------------------------------------------------------------
// SelectDevice
// ----------------------------------------------------------------------------
static void input_SelectDevice(HWND hCombo, int value) {
int count = SendMessage(hCombo, CB_GETCOUNT, 0, 0);
for(int index = 0; index < count; index++) {
if(SendMessage(hCombo, CB_GETITEMDATA, index, 0) == value) {
SendMessage(hCombo, CB_SETCURSEL, index, 0);
return;
}
}
}
// ----------------------------------------------------------------------------
// HasKeyValue
// ----------------------------------------------------------------------------
static bool input_HasKeyValue(int value) {
for(int index = 0; index < 17; index++) {
if(input_keys[index] == value) {
return true;
}
}
return false;
}
// ----------------------------------------------------------------------------
// InitJoysticksListControl
// ----------------------------------------------------------------------------
BOOL CALLBACK InitJoysticksListControl(const DIDEVICEINSTANCE*
pdidInstance, VOID* pContext) {
// Add to Our Device List
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_UP),
(char *)pdidInstance->tszInstanceName, ++current_device );
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_DOWN),
(char *)pdidInstance->tszInstanceName, current_device );
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_LEFT),
(char *)pdidInstance->tszInstanceName, current_device );
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_RIGHT),
(char *)pdidInstance->tszInstanceName, current_device );
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_BUTTON1),
(char *)pdidInstance->tszInstanceName, current_device );
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_BUTTON2),
(char *)pdidInstance->tszInstanceName, current_device );
return DIENUM_CONTINUE;
}
// ----------------------------------------------------------------------------
// InitJoysticksListConsole
// ----------------------------------------------------------------------------
BOOL CALLBACK InitJoysticksListConsole(const DIDEVICEINSTANCE*
pdidInstance, VOID* pContext) {
// Add to Our Device List
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_RESET),
(char *)pdidInstance->tszInstanceName, ++current_device );
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_SELECT),
(char *)pdidInstance->tszInstanceName, current_device );
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_PAUSE),
(char *)pdidInstance->tszInstanceName, current_device );
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_LEFTD),
(char *)pdidInstance->tszInstanceName, current_device );
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_RIGHTD),
(char *)pdidInstance->tszInstanceName, current_device );
return DIENUM_CONTINUE;
}
// ----------------------------------------------------------------------------
// InitJoysticksListUser
// ----------------------------------------------------------------------------
BOOL CALLBACK InitJoysticksListUser(const DIDEVICEINSTANCE*
pdidInstance, VOID* pContext) {
// Add to Our Device List
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_MENU),
(char *)pdidInstance->tszInstanceName, ++current_device );
input_AddDevice (GetDlgItem((HWND)pContext, IDC_COMBO_DEVICE_EXIT),
(char *)pdidInstance->tszInstanceName, current_device );
return DIENUM_CONTINUE;
}
// ----------------------------------------------------------------------------
// InitializeControllerDialog
// ----------------------------------------------------------------------------
static input_InitializeControllerDialog(HWND hDialog, byte controller) {
std::string title = "Controller " + common_Format(controller);
HWND hCombo;
int i;
int value,index;
int id_key[] = {3,2,1,0,4,5};
int id[] = {IDC_COMBO_CONTROLLER_UP,IDC_COMBO_CONTROLLER_DOWN,
IDC_COMBO_CONTROLLER_LEFT,IDC_COMBO_CONTROLLER_RIGHT,
IDC_COMBO_CONTROLLER_BUTTON1,IDC_COMBO_CONTROLLER_BUTTON2};
int id_device[] = {IDC_COMBO_DEVICE_UP,IDC_COMBO_DEVICE_DOWN,
IDC_COMBO_DEVICE_LEFT,IDC_COMBO_DEVICE_RIGHT,
IDC_COMBO_DEVICE_BUTTON1,IDC_COMBO_DEVICE_BUTTON2};
SetWindowText(hDialog, title.c_str( ));
controller--;
// Add Keyboard to Device List
for ( i = 0; i < 6; ++i )
input_AddDevice(GetDlgItem(hDialog, id_device[i]), "Keyboard", 0);
// First find joysticks, if any, callback adds to list
current_device = 0;
if ( input_dinput != NULL )
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksListControl,
hDialog, DIEDFL_ATTACHEDONLY);
// Select Keyboard or Joystick Device
for ( i = 0; i < 6; ++i ) {
index = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_SETCURSEL, (LPARAM)input_devices[id_key[i] + (6 * controller)], 0);
if(index != CB_ERR) {
value = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_GETITEMDATA, index, 0);
input_devices[id_key[i] + (6 * controller)] = value;
}
else {
index = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_GETCOUNT, 0, 0 );
SendMessage(GetDlgItem(hDialog, id_device[i]), CB_SETCURSEL, index-1, 0 );
value = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_GETITEMDATA, index-1, 0);
input_devices[id_key[i] + (6 * controller)] = value;
}
}
// Initialize parts list based on selected device
for ( i = 0; i < 6; ++i ) {
input_InitializeKeys(hCombo = GetDlgItem(hDialog, id[i]), input_devices[id_key[i] + (6 * controller)]);
input_SelectKey(hCombo, input_keys[id_key[i] + (6 * controller)]);
}
}
// ----------------------------------------------------------------------------
// SetControllerValues
// ----------------------------------------------------------------------------
static void input_SetControllerValues(HWND hDialog, byte controller) {
int i,value,index;
int id_key[] = {3,2,1,0,4,5};
int id[] = {IDC_COMBO_CONTROLLER_UP,IDC_COMBO_CONTROLLER_DOWN,
IDC_COMBO_CONTROLLER_LEFT,IDC_COMBO_CONTROLLER_RIGHT,
IDC_COMBO_CONTROLLER_BUTTON1,IDC_COMBO_CONTROLLER_BUTTON2};
int id_device[] = {IDC_COMBO_DEVICE_UP,IDC_COMBO_DEVICE_DOWN,
IDC_COMBO_DEVICE_LEFT,IDC_COMBO_DEVICE_RIGHT,
IDC_COMBO_DEVICE_BUTTON1,IDC_COMBO_DEVICE_BUTTON2};
HWND hCombo;
controller--;
for ( i = 0; i < 17; ++i ) {
input_values[i] = 0;
}
for ( i = 0; i < 6; ++i ) {
hCombo = GetDlgItem(hDialog, id[i]);
index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
if(index != CB_ERR) {
value = SendMessage(hCombo, CB_GETITEMDATA, index, 0);
//if(!input_HasKeyValue(value)) {
input_keys[id_key[i] + (6 * controller)] = value;
//}
}
hCombo = GetDlgItem(hDialog, id_device[i]);
index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
if(index != CB_ERR) {
value = SendMessage(hCombo, CB_GETITEMDATA, index, 0);
input_devices[id_key[i] + (6 * controller)] = value;
}
}
}
// ----------------------------------------------------------------------------
// SetConsoleValues
// ----------------------------------------------------------------------------
static void input_SetConsoleValues(HWND hDialog) {
int i,value,index;
int id[] = {IDC_COMBO_CONSOLE_RESET,IDC_COMBO_CONSOLE_SELECT,
IDC_COMBO_CONSOLE_PAUSE,IDC_COMBO_CONSOLE_RIGHT,
IDC_COMBO_CONSOLE_LEFT};
int id_device[] = {IDC_COMBO_DEVICE_RESET,IDC_COMBO_DEVICE_SELECT,
IDC_COMBO_DEVICE_PAUSE,IDC_COMBO_DEVICE_RIGHTD,
IDC_COMBO_DEVICE_LEFTD};
HWND hCombo;
for ( i = 0; i < 17; ++i ) {
input_values[i] = 0;
}
for ( i = 0; i < 5; ++i ) {
hCombo = GetDlgItem(hDialog, id[i]);
index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
if(index != CB_ERR) {
value = SendMessage(hCombo, CB_GETITEMDATA, index, 0);
//if(!input_HasKeyValue(value)) {
input_keys[i+12] = value;
//}
}
hCombo = GetDlgItem(hDialog, id_device[i]);
index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
if(index != CB_ERR) {
value = SendMessage(hCombo, CB_GETITEMDATA, index, 0);
input_devices[i+12] = value;
}
}
}
// ----------------------------------------------------------------------------
// SetUserValues
// ----------------------------------------------------------------------------
static void input_SetUserValues(HWND hDialog) {
int i,value,index;
int id[] = {IDC_COMBO_PART_MENU,IDC_COMBO_PART_EXIT};
int id_device[] = {IDC_COMBO_DEVICE_MENU,IDC_COMBO_DEVICE_EXIT};
int id_modifier[] = {IDC_COMBO_MOD_MENU,IDC_COMBO_MOD_EXIT};
HWND hCombo;
for ( i = 0; i < 2; ++i ) {
user_values[i] = 0;
}
for ( i = 0; i < 2; ++i ) {
hCombo = GetDlgItem(hDialog, id[i]);
index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
if(index != CB_ERR) {
value = SendMessage(hCombo, CB_GETITEMDATA, index, 0);
//if(!input_HasKeyValue(value)) {
user_keys[i] = value;
//}
}
hCombo = GetDlgItem(hDialog, id_device[i]);
index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
if(index != CB_ERR) {
value = SendMessage(hCombo, CB_GETITEMDATA, index, 0);
user_devices[i] = value;
}
hCombo = GetDlgItem(hDialog, id_modifier[i]);
index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
if(index != CB_ERR) {
value = SendMessage(hCombo, CB_GETITEMDATA, index, 0);
user_modifiers[i] = value;
}
}
}
// ----------------------------------------------------------------------------
// InitializeConsoleDialog
// ----------------------------------------------------------------------------
static void input_InitializeConsoleDialog(HWND hDialog) {
HWND hCombo;
int i;
int value,index;
int id[] = {IDC_COMBO_CONSOLE_RESET,IDC_COMBO_CONSOLE_SELECT,
IDC_COMBO_CONSOLE_PAUSE,IDC_COMBO_CONSOLE_RIGHT,
IDC_COMBO_CONSOLE_LEFT};
int id_device[] = {IDC_COMBO_DEVICE_RESET,IDC_COMBO_DEVICE_SELECT,
IDC_COMBO_DEVICE_PAUSE,IDC_COMBO_DEVICE_RIGHTD,
IDC_COMBO_DEVICE_LEFTD};
// Add Keyboard to Device List
for ( i = 0; i < 5; ++i )
input_AddDevice(GetDlgItem(hDialog, id_device[i]), "Keyboard", 0);
// First find joysticks, if any, callback adds to list
current_device = 0;
if ( input_dinput != NULL )
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksListConsole,
hDialog, DIEDFL_ATTACHEDONLY);
// Select Keyboard or Joystick Device
for ( i = 0; i < 5; ++i ) {
index = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_SETCURSEL, (LPARAM)input_devices[i+12], 0);
if(index != CB_ERR) {
value = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_GETITEMDATA, index, 0);
input_devices[i+12] = value;
}
else {
index = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_GETCOUNT, 0, 0 );
SendMessage(GetDlgItem(hDialog, id_device[i]), CB_SETCURSEL, index-1, 0 );
value = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_GETITEMDATA, index-1, 0);
input_devices[i+12] = value;
}
}
// Initialize parts list based on selected device
for ( i = 0; i < 5; ++i ) {
input_InitializeKeys(hCombo = GetDlgItem(hDialog, id[i]), input_devices[i+12]);
input_SelectKey(hCombo, input_keys[i+12]);
}
}
// ----------------------------------------------------------------------------
// InitializeUserDialog
// ----------------------------------------------------------------------------
static void input_InitializeUserDialog(HWND hDialog) {
HWND hCombo;
int i;
int value,index;
int id[] = {IDC_COMBO_PART_MENU,IDC_COMBO_PART_EXIT};
int id_device[] = {IDC_COMBO_DEVICE_MENU,IDC_COMBO_DEVICE_EXIT};
int id_modifier[] = {IDC_COMBO_MOD_MENU,IDC_COMBO_MOD_EXIT};
// Add Keyboard to Device List
for ( i = 0; i < 2; ++i )
input_AddDevice(GetDlgItem(hDialog, id_device[i]), "Keyboard", 0);
// First find joysticks, if any, callback adds to list
current_device = 0;
if ( input_dinput != NULL )
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksListUser,
hDialog, DIEDFL_ATTACHEDONLY);
// Select Keyboard or Joystick Device
for ( i = 0; i < 2; ++i ) {
index = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_SETCURSEL, (LPARAM)user_devices[i], 0);
if(index != CB_ERR) {
value = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_GETITEMDATA, index, 0);
user_devices[i] = value;
}
else {
index = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_GETCOUNT, 0, 0 );
SendMessage(GetDlgItem(hDialog, id_device[i]), CB_SETCURSEL, index-1, 0 );
value = SendMessage(GetDlgItem(hDialog, id_device[i]), CB_GETITEMDATA, index-1, 0);
user_devices[i] = value;
}
}
// Initialize parts list based on selected device
for ( i = 0; i < 2; ++i ) {
input_InitializeKeys(hCombo = GetDlgItem(hDialog, id[i]), user_devices[i]);
input_SelectKey(hCombo, user_keys[i]);
}
// Initialize modifier keys
for ( i = 0; i < 2; ++i ) {
input_InitializeModifiers(hCombo = GetDlgItem(hDialog, id_modifier[i]), user_devices[i]);
input_SelectModifier(hCombo, user_modifiers[i]);
}
}
// ----------------------------------------------------------------------------
// Controller1Procedure
// ----------------------------------------------------------------------------
static BOOL CALLBACK input_Controller1Procedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
int value;
int index, id_index;
int id_key[] = {3,2,1,0,4,5};
int id[] = {IDC_COMBO_CONTROLLER_UP,IDC_COMBO_CONTROLLER_DOWN,
IDC_COMBO_CONTROLLER_LEFT,IDC_COMBO_CONTROLLER_RIGHT,
IDC_COMBO_CONTROLLER_BUTTON1,IDC_COMBO_CONTROLLER_BUTTON2};
switch(message) {
case WM_INITDIALOG:
input_InitializeControllerDialog(hWnd, 1);
break;
case WM_COMMAND:
if(LOWORD(wParam) == IDCANCEL || LOWORD(wParam) == IDC_BUTTON_CONTROLLER_CANCEL) {
input_ReleaseJoysticks();
current_device = 0;
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY);
EndDialog(hWnd, 0);
return 1;
}
else if(LOWORD(wParam) == IDC_BUTTON_CONTROLLER_OK) {
input_SetControllerValues(hWnd, 1);
input_ReleaseJoysticks();
current_device = 0;
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY);
EndDialog(hWnd, 0);
return 1;
}
// Check for device change - bberlin
else if ( HIWORD(wParam) == CBN_SELCHANGE) {
index = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0);
value = SendMessage((HWND)lParam, CB_GETITEMDATA, index, 0);
switch ( LOWORD(wParam) ) {
case IDC_COMBO_DEVICE_UP: id_index = 0; break;
case IDC_COMBO_DEVICE_DOWN: id_index = 1; break;
case IDC_COMBO_DEVICE_LEFT: id_index = 2; break;
case IDC_COMBO_DEVICE_RIGHT: id_index = 3; break;
case IDC_COMBO_DEVICE_BUTTON1: id_index = 4; break;
case IDC_COMBO_DEVICE_BUTTON2: id_index = 5; break;
default: return 0; break;
}
if ( input_devices[id_key[id_index]] != value ) {
input_devices[id_key[id_index]] = value;
index = SendMessage(GetDlgItem(hWnd, id[id_index]), CB_RESETCONTENT, 0, 0);
input_InitializeKeys(GetDlgItem(hWnd, id[id_index]), value);
}
}
break;
}
return 0;
}
// ----------------------------------------------------------------------------
// Controller2Procedure
// ----------------------------------------------------------------------------
static BOOL CALLBACK input_Controller2Procedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
int value;
int index, id_index;
int id_key[] = {3,2,1,0,4,5};
int id[] = {IDC_COMBO_CONTROLLER_UP,IDC_COMBO_CONTROLLER_DOWN,
IDC_COMBO_CONTROLLER_LEFT,IDC_COMBO_CONTROLLER_RIGHT,
IDC_COMBO_CONTROLLER_BUTTON1,IDC_COMBO_CONTROLLER_BUTTON2};
switch(message) {
case WM_INITDIALOG:
input_InitializeControllerDialog(hWnd, 2);
break;
case WM_COMMAND:
if(LOWORD(wParam) == IDCANCEL || LOWORD(wParam) == IDC_BUTTON_CONTROLLER_CANCEL) {
input_ReleaseJoysticks();
current_device = 0;
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY);
EndDialog(hWnd, 0);
return 1;
}
else if(LOWORD(wParam) == IDC_BUTTON_CONTROLLER_OK) {
input_SetControllerValues(hWnd, 2);
input_ReleaseJoysticks();
current_device = 0;
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY);
EndDialog(hWnd, 0);
return 1;
}
// Check for device change - bberlin
else if ( HIWORD(wParam) == CBN_SELCHANGE) {
index = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0);
value = SendMessage((HWND)lParam, CB_GETITEMDATA, index, 0);
switch ( LOWORD(wParam) ) {
case IDC_COMBO_DEVICE_UP: id_index = 0; break;
case IDC_COMBO_DEVICE_DOWN: id_index = 1; break;
case IDC_COMBO_DEVICE_LEFT: id_index = 2; break;
case IDC_COMBO_DEVICE_RIGHT: id_index = 3; break;
case IDC_COMBO_DEVICE_BUTTON1: id_index = 4; break;
case IDC_COMBO_DEVICE_BUTTON2: id_index = 5; break;
default: return 0; break;
}
if ( input_devices[id_key[id_index] + (6 * 1)] != value ) {
input_devices[id_key[id_index] + (6 * 1)] = value;
index = SendMessage(GetDlgItem(hWnd, id[id_index]), CB_RESETCONTENT, 0, 0);
input_InitializeKeys(GetDlgItem(hWnd, id[id_index]), value);
}
}
break;
}
return 0;
}
// ----------------------------------------------------------------------------
// ConsoleProcedure
// ----------------------------------------------------------------------------
static BOOL CALLBACK input_ConsoleProcedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
int value;
int index, id_index;
int id[] = {IDC_COMBO_CONSOLE_RESET,IDC_COMBO_CONSOLE_SELECT,
IDC_COMBO_CONSOLE_PAUSE,IDC_COMBO_CONSOLE_RIGHT,
IDC_COMBO_CONSOLE_LEFT};
switch(message) {
case WM_INITDIALOG:
input_InitializeConsoleDialog(hWnd);
break;
case WM_COMMAND:
if(LOWORD(wParam) == IDCANCEL || LOWORD(wParam) == IDC_BUTTON_CONSOLE_CANCEL) {
input_ReleaseJoysticks();
current_device = 0;
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY);
EndDialog(hWnd, 0);
return 1;
}
else if(LOWORD(wParam) == IDC_BUTTON_CONSOLE_OK) {
input_SetConsoleValues(hWnd);
input_ReleaseJoysticks();
current_device = 0;
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY);
EndDialog(hWnd, 0);
return 1;
}
// Check for device change - bberlin
else if ( HIWORD(wParam) == CBN_SELCHANGE) {
index = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0);
value = SendMessage((HWND)lParam, CB_GETITEMDATA, index, 0);
switch ( LOWORD(wParam) ) {
case IDC_COMBO_DEVICE_RESET: id_index = 0; break;
case IDC_COMBO_DEVICE_SELECT: id_index = 1; break;
case IDC_COMBO_DEVICE_PAUSE: id_index = 2; break;
case IDC_COMBO_DEVICE_RIGHTD: id_index = 3; break;
case IDC_COMBO_DEVICE_LEFTD: id_index = 4; break;
default: return 0; break;
}
if ( input_devices[id_index+12] != value ) {
input_devices[id_index+12] = value;
index = SendMessage(GetDlgItem(hWnd, id[id_index]), CB_RESETCONTENT, 0, 0);
input_InitializeKeys(GetDlgItem(hWnd, id[id_index]), value);
}
}
break;
}
return 0;
}
// ----------------------------------------------------------------------------
// UserProcedure
// ----------------------------------------------------------------------------
static BOOL CALLBACK input_UserProcedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
int value;
int index, id_index;
int id[] = {IDC_COMBO_PART_MENU,IDC_COMBO_PART_EXIT};
int id_modifier[] = {IDC_COMBO_MOD_MENU,IDC_COMBO_MOD_EXIT};
switch(message) {
case WM_INITDIALOG:
input_InitializeUserDialog(hWnd);
break;
case WM_COMMAND:
if(LOWORD(wParam) == IDCANCEL || LOWORD(wParam) == IDC_BUTTON_USER_CANCEL) {
input_ReleaseJoysticks();
current_device = 0;
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY);
EndDialog(hWnd, 0);
return 1;
}
else if(LOWORD(wParam) == IDC_BUTTON_USER_OK) {
input_SetUserValues(hWnd);
input_ReleaseJoysticks();
current_device = 0;
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY);
EndDialog(hWnd, 0);
return 1;
}
// Check for device change - bberlin
else if ( HIWORD(wParam) == CBN_SELCHANGE) {
index = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0);
value = SendMessage((HWND)lParam, CB_GETITEMDATA, index, 0);
switch ( LOWORD(wParam) ) {
case IDC_COMBO_DEVICE_MENU: id_index = 0; break;
case IDC_COMBO_DEVICE_EXIT: id_index = 1; break;
default: return 0; break;
}
if ( user_devices[id_index] != value ) {
user_devices[id_index] = value;
index = SendMessage(GetDlgItem(hWnd, id[id_index]), CB_RESETCONTENT, 0, 0);
input_InitializeKeys(GetDlgItem(hWnd, id[id_index]), value);
index = SendMessage(GetDlgItem(hWnd, id_modifier[id_index]), CB_RESETCONTENT, 0, 0);
input_InitializeModifiers(GetDlgItem(hWnd, id_modifier[id_index]), value);
}
}
break;
}
return 0;
}
// ----------------------------------------------------------------------------
// InitJoysticksCallback
// ----------------------------------------------------------------------------
BOOL CALLBACK InitJoysticksCallback(const DIDEVICEINSTANCE*
pdidInstance, VOID* pContext) {
int i, joy_index;
HRESULT hr;
bool needed = false;
LPDIRECTINPUTDEVICE2 *p_joystick;
LPDIRECTINPUTDEVICE p_dev;
DIPROPRANGE diprg;
joy_index = -1;
if ( input_joystick[++joy_index] == NULL )
p_joystick = &input_joystick[joy_index];
else if ( input_joystick[++joy_index] == NULL )
p_joystick = &input_joystick[joy_index];
else
return DIENUM_STOP;
++current_device;
// Check if we need this joystick
for ( i = 0; i < 17; ++i ) {
if ( input_devices[i] == current_device ) {
needed = true;
input_values[i] = joy_index;
}
}
// Check if we need this joystick
for ( i = 0; i < 2; ++i ) {
if ( user_devices[i] == current_device ) {
needed = true;
user_values[i] = joy_index;
}
}
// If not needed, continue to check joysticks
if ( !needed )
return DIENUM_CONTINUE;
// Obtain an interface to the enumerated joystick.
hr = input_dinput->CreateDevice(pdidInstance->guidInstance,
&p_dev, NULL);
if(FAILED(hr))
return DIENUM_CONTINUE;
/* Set joystick data format */
hr = (p_dev)->SetDataFormat( &c_dfDIJoystick );
if( FAILED(hr) )
{
(p_dev)->Release( );
p_dev = NULL;
return DIENUM_CONTINUE;
}
/* Set the cooperative level */
hr = (p_dev)->SetCooperativeLevel( (HWND)pContext, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND );
if( FAILED(hr) )
{
(p_dev)->Release( );
p_dev = NULL;
return DIENUM_CONTINUE;
}
/* Set X-axis range to (-1000 ... +1000)
This lets us test against 0 to see which way the s_anStick is pointed */
diprg.diph.dwSize = sizeof(diprg);
diprg.diph.dwHeaderSize = sizeof(diprg.diph);
diprg.diph.dwObj = DIJOFS_X;
diprg.diph.dwHow = DIPH_BYOFFSET;
diprg.lMin = -1000;
diprg.lMax = +1000;
hr= (p_dev)->SetProperty( DIPROP_RANGE, &diprg.diph );
if( FAILED(hr) )
{
(p_dev)->Release( );
p_dev = NULL;
return DIENUM_CONTINUE;
}
/* And again for Y-axis range */
diprg.diph.dwObj = DIJOFS_Y;
hr= (p_dev)->SetProperty( DIPROP_RANGE, &diprg.diph );
if( FAILED(hr) )
{
(p_dev)->Release( );
p_dev = NULL;
return DIENUM_CONTINUE;
}
hr = (p_dev)->QueryInterface (IID_IDirectInputDevice2, (LPVOID *)p_joystick );
if( FAILED(hr) )
{
(p_dev)->Release( );
p_dev = NULL;
return DIENUM_CONTINUE;
}
return DIENUM_CONTINUE;
}
// ----------------------------------------------------------------------------
// Initialize
// ----------------------------------------------------------------------------
bool input_Initialize(HWND hWnd, HINSTANCE hInstance) {
if(hWnd == NULL) {
logger_LogError(IDS_INPUT1,"");
}
if(hInstance == NULL) {
logger_LogError(IDS_INPUT2,"");
return false;
}
HRESULT hr = DirectInputCreate(hInstance, DIRECTINPUT_VERSION, &input_dinput, NULL);
if(FAILED(hr) || input_dinput == NULL) {
logger_LogError(IDS_INPUT3,"");
logger_LogError("",common_Format(hr));
return false;
}
hr = input_dinput->CreateDevice(GUID_SysKeyboard, &input_keyboard, NULL);
if(FAILED(hr) || input_keyboard == NULL) {
logger_LogError(IDS_INPUT4,"");
logger_LogError("",common_Format(hr));
return false;
}
hr = input_keyboard->SetDataFormat(&c_dfDIKeyboard);
if(FAILED(hr)) {
logger_LogError(IDS_INPUT5,"");
logger_LogError("",common_Format(hr));
return false;
}
hr = input_keyboard->SetCooperativeLevel(hWnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
if(FAILED(hr)) {
logger_LogError(IDS_INPUT6,"");
logger_LogError("",common_Format(hr));
return false;
}
hr = input_keyboard->Acquire( );
if(FAILED(hr)) {
logger_LogError(IDS_INPUT7,"");
logger_LogError("",common_Format(hr));
return false;
}
// Add JoyStick Input - bberlin
current_device = 0;
input_dinput->EnumDevices(DIDEVTYPE_JOYSTICK, InitJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY);
return true;
}
// ----------------------------------------------------------------------------
// GetKeyboardState
// ----------------------------------------------------------------------------
bool input_GetKeyboardState(byte* input) {
int i;
DIJOYSTATE js;
byte user_go[2];
user_go[0] = 0;
user_go[1] = 0;
if(input_dinput == NULL) {
logger_LogError(IDS_INPUT8,"");
return false;
}
if(input_keyboard == NULL) {
logger_LogError(IDS_INPUT9,"");
return false;
}
if(input == NULL) {
logger_LogError(IDS_INPUT10,"");
return false;
}
byte keyboard[256];
HRESULT hr = input_keyboard->GetDeviceState(256, keyboard);
if(FAILED(hr)) {
logger_LogError(IDS_INPUT11,"");
logger_LogError("",common_Format(hr));
return false;
}
// Check for User Keys
for(int index = 0; index < 2; index++) {
if ( !user_devices[index] ) {
if ( (keyboard[user_keys[index]]) ) {
if ( !user_modifiers[index] ) {
if ( !keyboard[DIK_LALT] && !keyboard[DIK_RALT] &&
!keyboard[DIK_LCONTROL] && !keyboard[DIK_RCONTROL] &&
!keyboard[DIK_LSHIFT] && !keyboard[DIK_RSHIFT] ) {
user_go[index] = 1;
}
}
else if ( (keyboard[user_modifiers[index]]) ) {
user_go[index] = 1;
}
else if ( (keyboard[user_modifiers[index]] == DIK_LALT) &&
keyboard[DIK_RALT] ) {
user_go[index] = 1;
}
else if ( (keyboard[user_modifiers[index]] == DIK_LSHIFT) &&
keyboard[DIK_RSHIFT] ) {
user_go[index] = 1;
}
else if ( (keyboard[user_modifiers[index]] == DIK_LCONTROL) &&
keyboard[DIK_RCONTROL] ) {
user_go[index] = 1;
}
}
console_SetUserInput ( user_go, index );
}
}
for(index = 0; index < 17; index++) {
if ( !input_devices[index] )
input[index] = (keyboard[input_keys[index]])? 1: 0;
}
for ( i = 0; i < 2; ++i ) {
// Get Joystick Input
if ( input_joystick[i] == NULL )
break;
hr = input_joystick[i]->Poll();
if(FAILED(hr)) {
hr = input_joystick[i]->Acquire();
}
hr = input_joystick[i]->GetDeviceState(sizeof(DIJOYSTATE), &js);
if(FAILED(hr)) {
logger_LogError(IDS_INPUT12,"");
logger_LogError("",common_Format(hr));
continue;
}
// Check if we need the info
for(int index = 0; index < 17; index++) {
if ( input_devices[index] && input_values[index] == i ) {
input_GetJoystickPartState ( input_keys[index], &input[index], &js );
}
}
// Check if we need the info for user keys
for(index = 0; index < 2; index++) {
if ( user_devices[index] && user_values[index] == i ) {
input_GetJoystickPartState ( user_keys[index], &user_go[index], &js );
console_SetUserInput ( user_go, index );
}
}
} /* end for PC joystick */
return true;
}
void input_GetJoystickPartState ( byte part, byte *state, DIJOYSTATE *js ) {
switch ( part ) {
case JOY_AXIS_UP:
*state = ( js->lY < -500 ) ? 1: 0;
break;
case JOY_AXIS_DOWN:
*state = ( js->lY > 500 ) ? 1: 0;
break;
case JOY_AXIS_LEFT:
*state = ( js->lX < -500 ) ? 1: 0;
break;
case JOY_AXIS_RIGHT:
*state = ( js->lX > 500 ) ? 1: 0;
break;
case JOY_PAD_UP:
*state = ( (js->rgdwPOV[0] > 32000 && js->rgdwPOV[0] < 37000) ||
(js->rgdwPOV[0] >= 0 && js->rgdwPOV[0] < 4600) ) ? 1: 0;
break;
case JOY_PAD_DOWN:
*state = (js->rgdwPOV[0] > 13400 && js->rgdwPOV[0] < 22600) ? 1: 0;
break;
case JOY_PAD_LEFT:
*state = (js->rgdwPOV[0] > 22400 && js->rgdwPOV[0] < 31600) ? 1: 0;
break;
case JOY_PAD_RIGHT:
*state = (js->rgdwPOV[0] > 4400 && js->rgdwPOV[0] < 13600) ? 1: 0;
break;
case JOY_BUTTON_1:
case JOY_BUTTON_2:
case JOY_BUTTON_3:
case JOY_BUTTON_4:
case JOY_BUTTON_5:
case JOY_BUTTON_6:
case JOY_BUTTON_7:
case JOY_BUTTON_8:
case JOY_BUTTON_9:
case JOY_BUTTON_10:
case JOY_BUTTON_11:
case JOY_BUTTON_12:
*state = ( js->rgbButtons[part-JOY_BUTTON_1] & 0x80 ) ? 1: 0;
break;
}
}
// ----------------------------------------------------------------------------
// Release
// ----------------------------------------------------------------------------
void input_Release( ) {
if(input_dinput != NULL) {
input_dinput->Release( );
input_dinput = NULL;
}
if(input_keyboard != NULL) {
input_keyboard->Release( );
input_keyboard = NULL;
}
input_ReleaseJoysticks();
}
void input_ReleaseJoysticks( ) {
int i;
for ( i = 0; i < 2; ++i ) {
if(input_joystick[i] != NULL) {
input_joystick[i]->Unacquire( );
input_joystick[i]->Release( );
input_joystick[i] = NULL;
}
}
}
// ----------------------------------------------------------------------------
// ShowController1Dialog
// ----------------------------------------------------------------------------
void input_ShowController1Dialog(HWND hWnd, HINSTANCE hInstance) {
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_CONTROLLER), hWnd, (DLGPROC)input_Controller1Procedure);
}
// ----------------------------------------------------------------------------
// ShowController2Dialog
// ----------------------------------------------------------------------------
void input_ShowController2Dialog(HWND hWnd, HINSTANCE hInstance) {
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_CONTROLLER), hWnd, (DLGPROC)input_Controller2Procedure);
}
// ----------------------------------------------------------------------------
// ShowConsoleDialog
// ----------------------------------------------------------------------------
void input_ShowConsoleDialog(HWND hWnd, HINSTANCE hInstance) {
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_CONSOLE), hWnd, (DLGPROC)input_ConsoleProcedure);
}
// ----------------------------------------------------------------------------
// ShowConsoleDialog
// ----------------------------------------------------------------------------
void input_ShowUserDialog(HWND hWnd, HINSTANCE hInstance) {
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_USER), hWnd, (DLGPROC)input_UserProcedure);
}
// ----------------------------------------------------------------------------
// Key Titles
// ----------------------------------------------------------------------------
const std::string input_keyTitles[ ] = {
"ESCAPE",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"0",
"MINUS",
"EQUALS",
"BACK",
"TAB",
"Q",
"W",
"E",
"R",
"T",
"Y",
"U",
"I",
"O",
"P",
"L BRACKET",
"R BRACKET",
"RETURN",
"L CONTROL",
"A",
"S",
"D",
"F",
"G",
"H",
"J",
"K",
"L",
"SEMICOLON",
"APOSTROPHE",
"GRAVE",
"L SHIFT",
"BACKSLASH",
"Z",
"X",
"C",
"V",
"B",
"N",
"M",
"COMMA",
"PERIOD",
"SLASH",
"R SHIFT",
"MULTIPLY",
"L ALT",
"SPACE",
"CAPS LOCK",
"F1",
"F2",
"F3",
"F4",
"F5",
"F6",
"F7",
"F8",
"F9",
"F10",
"NUMLOCK",
"SCROLL",
"NUMPAD 7",
"NUMPAD 8",
"NUMPAD 9",
"SUBTRACT",
"NUMPAD 4",
"NUMPAD 5",
"NUMPAD 6",
"ADD",
"NUMPAD 1",
"NUMPAD 2",
"NUMPAD 3",
"NUMPAD 0",
"DECIMAL",
"F11",
"F12",
"NUMPAD ENTER",
"R CONTROL",
"DIVIDE",
"R ALT",
"PAUSE",
"HOME",
"UP",
"PGUP",
"LEFT",
"RIGHT",
"END",
"DOWN",
"PGDN",
"INSERT",
"DELETE"
};
// ----------------------------------------------------------------------------
// Key Values
// ----------------------------------------------------------------------------
const byte input_keyValues[ ] = {
DIK_ESCAPE,
DIK_1,
DIK_2,
DIK_3,
DIK_4,
DIK_5,
DIK_6,
DIK_7,
DIK_8,
DIK_9,
DIK_0,
DIK_MINUS,
DIK_EQUALS,
DIK_BACK,
DIK_TAB,
DIK_Q,
DIK_W,
DIK_E,
DIK_R,
DIK_T,
DIK_Y,
DIK_U,
DIK_I,
DIK_O,
DIK_P,
DIK_LBRACKET,
DIK_RBRACKET,
DIK_RETURN,
DIK_LCONTROL,
DIK_A,
DIK_S,
DIK_D,
DIK_F,
DIK_G,
DIK_H,
DIK_J,
DIK_K,
DIK_L,
DIK_SEMICOLON,
DIK_APOSTROPHE,
DIK_GRAVE,
DIK_LSHIFT,
DIK_BACKSLASH,
DIK_Z,
DIK_X,
DIK_C,
DIK_V,
DIK_B,
DIK_N,
DIK_M,
DIK_COMMA,
DIK_PERIOD,
DIK_SLASH,
DIK_RSHIFT,
DIK_MULTIPLY,
DIK_LMENU,
DIK_SPACE,
DIK_CAPITAL,
DIK_F1,
DIK_F2,
DIK_F3,
DIK_F4,
DIK_F5,
DIK_F6,
DIK_F7,
DIK_F8,
DIK_F9,
DIK_F10,
DIK_NUMLOCK,
DIK_SCROLL,
DIK_NUMPAD7,
DIK_NUMPAD8,
DIK_NUMPAD9,
DIK_SUBTRACT,
DIK_NUMPAD4,
DIK_NUMPAD5,
DIK_NUMPAD6,
DIK_ADD,
DIK_NUMPAD1,
DIK_NUMPAD2,
DIK_NUMPAD3,
DIK_NUMPAD0,
DIK_DECIMAL,
DIK_F11,
DIK_F12,
DIK_NUMPADENTER,
DIK_RCONTROL,
DIK_DIVIDE,
DIK_RMENU,
DIK_PAUSE,
DIK_HOME,
DIK_UP,
DIK_PRIOR,
DIK_LEFT,
DIK_RIGHT,
DIK_END,
DIK_DOWN,
DIK_NEXT,
DIK_INSERT,
DIK_DELETE
};
// ----------------------------------------------------------------------------
// Joy Titles
// ----------------------------------------------------------------------------
const std::string input_joyTitles[ ] = {
"Axis Up",
"Axis Down",
"Axis Left",
"Axis Right",
"Pad Up",
"Pad Down",
"Pad Left",
"Pad Right",
"Button1",
"Button2",
"Button3",
"Button4",
"Button5",
"Button6",
"Button7",
"Button8",
"Button9",
"Button10",
"Button11",
"Button12"
};
// ----------------------------------------------------------------------------
// Joy Values
// ----------------------------------------------------------------------------
const byte input_joyValues[ ] = {
JOY_AXIS_UP,
JOY_AXIS_DOWN,
JOY_AXIS_LEFT,
JOY_AXIS_RIGHT,
JOY_PAD_UP,
JOY_PAD_DOWN,
JOY_PAD_LEFT,
JOY_PAD_RIGHT,
JOY_BUTTON_1,
JOY_BUTTON_2,
JOY_BUTTON_3,
JOY_BUTTON_4,
JOY_BUTTON_5,
JOY_BUTTON_6,
JOY_BUTTON_7,
JOY_BUTTON_8,
JOY_BUTTON_9,
JOY_BUTTON_10,
JOY_BUTTON_11,
JOY_BUTTON_12
};