From f9582bef302ac9354c348bc88efb16fdf8b783a1 Mon Sep 17 00:00:00 2001
From: Laurence Muller <laurence.muller@gmail.com>
Date: Wed, 23 Jul 2008 00:49:20 +0000
Subject: [PATCH] nJoy: - Enabled Half press for shoulder buttons - Added a
 option to select controller type - Normal controllers should use the default
 joystick - Some joysticks dont have a real hat (POV) but fake this with
 buttons. In this case Joystick (no hat) should be selected. After this is
 selected, four new buttons will appear for the d-pad. - Next version will
 probably include keyboard support.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@60 8ced0084-cf51-0410-be5f-012b33b47a6e
---
 .../Plugin_nJoy_SDL/Res/Plugin_nJoy_SDL.rc    |  43 +++++++-
 Source/Plugins/Plugin_nJoy_SDL/Res/resource.h |  30 ++---
 Source/Plugins/Plugin_nJoy_SDL/Src/config.cpp | 103 +++++++++++++++++-
 Source/Plugins/Plugin_nJoy_SDL/Src/config.h   |   2 +
 Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp   |  67 +++++++++---
 Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h     |  22 +++-
 6 files changed, 227 insertions(+), 40 deletions(-)

diff --git a/Source/Plugins/Plugin_nJoy_SDL/Res/Plugin_nJoy_SDL.rc b/Source/Plugins/Plugin_nJoy_SDL/Res/Plugin_nJoy_SDL.rc
index 824e357d42..1939637d8b 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Res/Plugin_nJoy_SDL.rc
+++ b/Source/Plugins/Plugin_nJoy_SDL/Res/Plugin_nJoy_SDL.rc
@@ -56,7 +56,7 @@ IDD_CONFIG DIALOGEX 0, 0, 411, 282
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_SYSMENU
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
-    COMBOBOX        IDC_JOYNAME,8,18,317,30,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_JOYNAME,8,18,317,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     GROUPBOX        "Controller:",IDC_STATIC,3,7,405,28
     CONTROL         102,IDC_STATIC,"Static",SS_BITMAP | SS_REALSIZEIMAGE | SS_SUNKEN,65,46,281,187
     CONTROL         "Controller attached",IDC_JOYATTACH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,330,19,73,10
@@ -90,12 +90,25 @@ BEGIN
     LTEXT           "Y-axis",IDC_STATIC,368,229,20,8
     PUSHBUTTON      "",IDC_SY,351,240,15,10,0,WS_EX_STATICEDGE
     PUSHBUTTON      "",IDC_MY,46,158,15,10,0,WS_EX_STATICEDGE
-    GROUPBOX        "Extra settings",IDC_STATIC,3,236,95,43
-    LTEXT           "Deadzone",IDC_STATIC,11,248,33,8
-    LTEXT           "Half press",IDC_STATIC,11,263,33,8
-    COMBOBOX        IDC_DEADZONE,45,246,48,30,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_HALFPRESS,45,261,48,30,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX        "Extra settings:",IDC_STATIC,69,236,103,43
+    LTEXT           "Deadzone",IDC_STATIC,77,248,33,8
+    LTEXT           "Half press",IDC_STATIC,77,263,33,8
+    COMBOBOX        IDC_DEADZONE,111,246,40,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     LTEXT           "www.multigesture.net",IDC_STATIC,336,271,72,8
+    COMBOBOX        IDC_CONTROLTYPE,244,247,87,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX        "Controller type:",IDC_STATIC,239,236,95,27
+    PUSHBUTTON      "",IDC_DPAD_DOWN,46,205,15,10,0,WS_EX_STATICEDGE
+    CTEXT           "",IDTEXT_DPAD_DOWN,4,205,40,12,WS_BORDER
+    PUSHBUTTON      "",IDC_DPAD_LEFT,45,228,15,10,0,WS_EX_STATICEDGE
+    CTEXT           "",IDTEXT_DPAD_LEFT,3,227,40,12,WS_BORDER
+    PUSHBUTTON      "",IDC_DPAD_RIGHT,45,251,15,10,0,WS_EX_STATICEDGE
+    CTEXT           "",IDTEXT_DPAD_RIGHT,3,250,40,12,WS_BORDER
+    LTEXT           "Up",IDC_DPAD_TEXT1,4,172,10,8
+    LTEXT           "Down",IDC_DPAD_TEXT2,4,195,19,8
+    LTEXT           "Left",IDC_DPAD_TEXT3,4,217,14,8
+    LTEXT           "Right",IDC_DPAD_TEXT4,4,240,18,8
+    PUSHBUTTON      "",IDC_HALFPRESS,153,263,15,10,0,WS_EX_STATICEDGE
+    CTEXT           "",IDTEXT_HALFPRESS,111,261,40,12,WS_BORDER
 END
 
 IDD_ABOUT DIALOGEX 0, 0, 133, 227
@@ -141,6 +154,24 @@ END
 
 IDB_BITMAP1             BITMAP                  "controller.bmp"
 IDB_BITMAP2             BITMAP                  "njoy.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog Info
+//
+
+IDD_CONFIG DLGINIT
+BEGIN
+    IDC_CONTROLTYPE, 0x403, 9, 0
+0x6f4a, 0x7379, 0x6974, 0x6b63, "\000" 
+    IDC_CONTROLTYPE, 0x403, 18, 0
+0x6f4a, 0x7379, 0x6974, 0x6b63, 0x2820, 0x6f6e, 0x6820, 0x7461, 0x0029, 
+
+    IDC_CONTROLTYPE, 0x403, 9, 0
+0x654b, 0x6279, 0x616f, 0x6472, "\000" 
+    0
+END
+
 #endif    // Dutch (Netherlands) resources
 /////////////////////////////////////////////////////////////////////////////
 
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Res/resource.h b/Source/Plugins/Plugin_nJoy_SDL/Res/resource.h
index 02c72845d6..3a2d62b2c1 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Res/resource.h
+++ b/Source/Plugins/Plugin_nJoy_SDL/Res/resource.h
@@ -8,7 +8,6 @@
 #define IDB_BITMAP2                     104
 #define IDC_JOYNAME                     1001
 #define IDC_JOYATTACH                   1002
-
 #define IDC_SHOULDERL                   1010
 #define IDC_SHOULDERR                   1011
 #define IDC_A                           1012
@@ -17,16 +16,24 @@
 #define IDC_Y                           1015
 #define IDC_Z                           1016
 #define IDC_START                       1017
-
 #define IDC_DPAD                        1018
 #define IDC_MX                          1019
 #define IDC_MY                          1020
 #define IDC_SX                          1021
 #define IDC_SY                          1022
-
 #define IDC_DEADZONE                    1023
 #define IDC_HALFPRESS                   1024
-
+#define IDC_DPAD_DOWN                   1025
+#define IDC_DPAD_LEFT                   1026
+#define IDC_DPAD_RIGHT                  1027
+#define IDC_ABOUT_TEXT                  1032
+#define IDC_ABOUT_TEXT2                 1033
+#define IDC_ABOUT_TEXT3                 1034
+#define IDC_CONTROLTYPE                 1036
+#define IDC_DPAD_TEXT1                  1037
+#define IDC_DPAD_TEXT2                  1038
+#define IDC_DPAD_TEXT3                  1039
+#define IDC_DPAD_TEXT4                  1040
 #define IDTEXT_SHOULDERL                2010
 #define IDTEXT_SHOULDERR                2011
 #define IDTEXT_A                        2012
@@ -35,26 +42,23 @@
 #define IDTEXT_Y                        2015
 #define IDTEXT_Z                        2016
 #define IDTEXT_START                    2017
-
 #define IDTEXT_DPAD                     2018
 #define IDTEXT_MX                       2019
 #define IDTEXT_MY                       2020
 #define IDTEXT_SX                       2021
 #define IDTEXT_SY                       2022
-
-
-#define IDC_ABOUT_TEXT                  1032
-#define IDC_ABOUT_TEXT2                 1033
-#define IDC_ABOUT_TEXT3                 1034
-
+#define IDTEXT_HALFPRESS                2024
+#define IDTEXT_DPAD_DOWN                2025
+#define IDTEXT_DPAD_LEFT                2026
+#define IDTEXT_DPAD_RIGHT               2027
 
 // Next default values for new objects
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        105
+#define _APS_NEXT_RESOURCE_VALUE        106
 #define _APS_NEXT_COMMAND_VALUE         40001
-#define _APS_NEXT_CONTROL_VALUE         1036
+#define _APS_NEXT_CONTROL_VALUE         1041
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/config.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/config.cpp
index 24e2a9c121..acdfb5e4ef 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/config.cpp
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/config.cpp
@@ -35,6 +35,13 @@ extern CONTROLLER_INFO	*joyinfo;
 extern CONTROLLER_MAPPING joysticks[4];
 extern bool emulator_running;
 
+static const char* ControllerType[] =
+{
+	"Joystick (default)",
+	"Joystick (no hat)",
+	"Keyboard"
+};
+
 // Create dialog and pages
 // �����������������������
 int OpenConfig(HINSTANCE hInst, HWND _hParent)
@@ -128,11 +135,13 @@ BOOL ControllerTab(HWND hDlg, UINT message, UINT wParam, LONG lParam, int contro
 			{
 				ComboBox_Enable(GetDlgItem(hDlg, IDC_JOYNAME), FALSE);
 				Button_Enable(GetDlgItem(hDlg, IDC_JOYATTACH), FALSE);
+				ComboBox_Enable(GetDlgItem(hDlg, IDC_CONTROLTYPE), FALSE);
 			}
 			else
 			{
 				ComboBox_Enable(GetDlgItem(hDlg, IDC_JOYNAME), TRUE);
 				Button_Enable(GetDlgItem(hDlg, IDC_JOYATTACH), TRUE);
+				ComboBox_Enable(GetDlgItem(hDlg, IDC_CONTROLTYPE), TRUE);
 			}
 			
 			// Search for devices and add the to the device list
@@ -144,6 +153,11 @@ BOOL ControllerTab(HWND hDlg, UINT message, UINT wParam, LONG lParam, int contro
 					SendMessage(CB, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>((LPCTSTR)joyinfo[x].Name));
 				}
 				
+				CB = GetDlgItem(hDlg, IDC_CONTROLTYPE);
+				SendMessage(CB, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>((LPCTSTR)ControllerType[CTL_TYPE_JOYSTICK]));
+				SendMessage(CB, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>((LPCTSTR)ControllerType[CTL_TYPE_JOYSTICK_NO_HAT]));
+				//SendMessage(CB, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>((LPCTSTR)ControllerType[CTL_TYPE_KEYBOARD]));
+
 				char buffer [8];				
 				CB = GetDlgItem(hDlg, IDC_DEADZONE);
 				SendMessage(CB, CB_RESETCONTENT, 0, 0);
@@ -173,12 +187,24 @@ BOOL ControllerTab(HWND hDlg, UINT message, UINT wParam, LONG lParam, int contro
 					// Selected a different joystick
 					if(HIWORD(wParam) == CBN_SELCHANGE)
 					{
-						joysticks[controller].ID = (int)SendMessage(GetDlgItem(hDlg, IDC_JOYNAME), CB_GETCURSEL, 0, 0);
+						joysticks[controller].ID = (int)SendMessage(GetDlgItem(hDlg, IDC_JOYNAME), CB_GETCURSEL, 0, 0);						
 					}
 					return TRUE;
 				}
 				break;
 
+				case IDC_CONTROLTYPE:
+				{
+					// Selected a different joystick
+					if(HIWORD(wParam) == CBN_SELCHANGE)
+					{
+						joysticks[controller].controllertype = (int)SendMessage(GetDlgItem(hDlg, IDC_CONTROLTYPE), CB_GETCURSEL, 0, 0);
+						UpdateVisibleItems(hDlg, joysticks[controller].controllertype);
+					}
+					return TRUE;
+				}
+				break;
+				
 				case IDC_SHOULDERL:
 				case IDC_SHOULDERR:
 				case IDC_A:
@@ -187,6 +213,10 @@ BOOL ControllerTab(HWND hDlg, UINT message, UINT wParam, LONG lParam, int contro
 				case IDC_Y:
 				case IDC_Z:
 				case IDC_START:
+				case IDC_HALFPRESS:
+				case IDC_DPAD_DOWN:
+				case IDC_DPAD_LEFT:
+				case IDC_DPAD_RIGHT:
 				{
 					GetButtons(hDlg, LOWORD(wParam), controller);
 					return TRUE;
@@ -195,7 +225,10 @@ BOOL ControllerTab(HWND hDlg, UINT message, UINT wParam, LONG lParam, int contro
 				
 				case IDC_DPAD:
 				{
-					GetHats(hDlg, LOWORD(wParam), controller);
+					if(joysticks[controller].controllertype)
+						GetButtons(hDlg, LOWORD(wParam), controller);
+					else
+						GetHats(hDlg, LOWORD(wParam), controller);
 					return TRUE;
 				}
 				break;
@@ -422,7 +455,7 @@ void SetControllerAll(HWND hDlg, int controller)
 	SetButton(hDlg, IDTEXT_Z, joysticks[controller].buttons[CTL_Z_TRIGGER]);
 	SetButton(hDlg, IDTEXT_START, joysticks[controller].buttons[CTL_START]);
 	
-	SetButton(hDlg, IDTEXT_DPAD, joysticks[controller].dpad);
+	SetButton(hDlg, IDTEXT_HALFPRESS, joysticks[controller].halfpress);
 	
 	SetButton(hDlg, IDTEXT_MX, joysticks[controller].axis[CTL_MAIN_X]);
 	SetButton(hDlg, IDTEXT_MY, joysticks[controller].axis[CTL_MAIN_Y]);
@@ -431,7 +464,20 @@ void SetControllerAll(HWND hDlg, int controller)
 
 	SendDlgItemMessage(hDlg, IDC_JOYATTACH, BM_SETCHECK, joysticks[controller].enabled, 0);
 
+	SendMessage(GetDlgItem(hDlg, IDC_CONTROLTYPE), CB_SETCURSEL, joysticks[controller].controllertype, 0);	
 	SendMessage(GetDlgItem(hDlg, IDC_DEADZONE), CB_SETCURSEL, joysticks[controller].deadzone, 0);	
+
+	UpdateVisibleItems(hDlg, joysticks[controller].controllertype);
+
+	if(joysticks[controller].controllertype == CTL_TYPE_JOYSTICK)
+		SetButton(hDlg, IDTEXT_DPAD, joysticks[controller].dpad);
+	else
+	{
+		SetButton(hDlg, IDTEXT_DPAD, joysticks[controller].dpad2[CTL_D_PAD_UP]);
+		SetButton(hDlg, IDTEXT_DPAD_DOWN, joysticks[controller].dpad2[CTL_D_PAD_DOWN]);
+		SetButton(hDlg, IDTEXT_DPAD_LEFT, joysticks[controller].dpad2[CTL_D_PAD_LEFT]);
+		SetButton(hDlg, IDTEXT_DPAD_RIGHT, joysticks[controller].dpad2[CTL_D_PAD_RIGHT]);
+	}
 }
 
 // Get dialog items
@@ -448,8 +494,18 @@ void GetControllerAll(HWND hDlg, int controller)
 	joysticks[controller].buttons[CTL_Y_BUTTON] = GetButton(hDlg, IDTEXT_Y);
 	joysticks[controller].buttons[CTL_Z_TRIGGER] = GetButton(hDlg, IDTEXT_Z);
 	joysticks[controller].buttons[CTL_START] = GetButton(hDlg, IDTEXT_START);
-
-	joysticks[controller].dpad = GetButton(hDlg, IDTEXT_DPAD);
+	
+	joysticks[controller].halfpress = GetButton(hDlg, IDTEXT_HALFPRESS);
+	
+	if(joysticks[controller].controllertype == CTL_TYPE_JOYSTICK)
+		joysticks[controller].dpad = GetButton(hDlg, IDTEXT_DPAD);		
+	else
+	{
+		joysticks[controller].dpad2[CTL_D_PAD_UP] = GetButton(hDlg, IDTEXT_DPAD);
+		joysticks[controller].dpad2[CTL_D_PAD_DOWN] = GetButton(hDlg, IDTEXT_DPAD_DOWN);
+		joysticks[controller].dpad2[CTL_D_PAD_LEFT] = GetButton(hDlg, IDTEXT_DPAD_LEFT);
+		joysticks[controller].dpad2[CTL_D_PAD_RIGHT] = GetButton(hDlg, IDTEXT_DPAD_RIGHT);
+	}
 
 	joysticks[controller].axis[CTL_MAIN_X] = GetButton(hDlg, IDTEXT_MX);
 	joysticks[controller].axis[CTL_MAIN_Y] = GetButton(hDlg, IDTEXT_MY);
@@ -458,9 +514,46 @@ void GetControllerAll(HWND hDlg, int controller)
 
 	joysticks[controller].enabled = (int)SendMessage(GetDlgItem(hDlg, IDC_JOYATTACH), BM_GETCHECK, 0, 0);
 	
+	joysticks[controller].controllertype = (int)SendMessage(GetDlgItem(hDlg, IDC_CONTROLTYPE), CB_GETCURSEL, 0, 0); 
 	joysticks[controller].deadzone = (int)SendMessage(GetDlgItem(hDlg, IDC_DEADZONE), CB_GETCURSEL, 0, 0);
 }
 
+void UpdateVisibleItems(HWND hDlg, int controllertype)
+{	
+	if(controllertype == CTL_TYPE_KEYBOARD)	
+		ComboBox_Enable(GetDlgItem(hDlg, IDC_JOYNAME), FALSE);		
+	else
+		ComboBox_Enable(GetDlgItem(hDlg, IDC_JOYNAME), TRUE);
+	
+	if(controllertype)
+	{
+		// 4 extra buttons
+		ShowWindow(GetDlgItem(hDlg, IDTEXT_DPAD_DOWN), TRUE);
+		ShowWindow(GetDlgItem(hDlg, IDTEXT_DPAD_LEFT), TRUE);
+		ShowWindow(GetDlgItem(hDlg, IDTEXT_DPAD_RIGHT), TRUE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_DOWN), TRUE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_LEFT), TRUE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_RIGHT), TRUE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_TEXT1), TRUE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_TEXT2), TRUE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_TEXT3), TRUE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_TEXT4), TRUE);
+	}
+	else
+	{
+		ShowWindow(GetDlgItem(hDlg, IDTEXT_DPAD_DOWN), FALSE);	
+		ShowWindow(GetDlgItem(hDlg, IDTEXT_DPAD_LEFT), FALSE);
+		ShowWindow(GetDlgItem(hDlg, IDTEXT_DPAD_RIGHT), FALSE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_DOWN), FALSE);	
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_LEFT), FALSE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_RIGHT), FALSE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_TEXT1), FALSE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_TEXT2), FALSE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_TEXT3), FALSE);
+		ShowWindow(GetDlgItem(hDlg, IDC_DPAD_TEXT4), FALSE);
+	}
+}
+
 // Set text in static text item
 // ����������������������������
 void SetButton(HWND hDlg, int item, int value)
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/config.h b/Source/Plugins/Plugin_nJoy_SDL/Src/config.h
index 784d75e98e..0b6e8debc5 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/config.h
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/config.h
@@ -53,6 +53,8 @@ bool GetButtons(HWND hDlg, int buttonid, int controller);
 bool GetHats(HWND hDlg, int buttonid, int controller);
 bool GetAxis(HWND hDlg, int buttonid, int controller);
 
+void UpdateVisibleItems(HWND hDlg, int controllertype);
+
 void GetControllerAll(HWND hDlg, int controller);
 void SetControllerAll(HWND hDlg, int controller);
 
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp
index 59f61c8664..1506c8df05 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp
@@ -205,26 +205,31 @@ void PAD_GetStatus(BYTE _numPAD, SPADStatus* _pPADStatus)
 	if ((sub_stick_x < deadzone2)	|| (sub_stick_x > deadzone))	_pPADStatus->substickX += sub_stick_x;
 	if ((sub_stick_y < deadzone2)	|| (sub_stick_y > deadzone))	_pPADStatus->substickY += sub_stick_y;
 
+	int triggervalue = 255;
+	if (joystate[_numPAD].halfpress)
+		triggervalue = 100;
+
 	// Set buttons
 	if (joystate[_numPAD].buttons[CTL_L_SHOULDER])
 	{
 		_pPADStatus->button|=PAD_TRIGGER_L;
-		_pPADStatus->triggerLeft  = 255;	// Perhaps support halfpress/pressure
+		_pPADStatus->triggerLeft  = triggervalue;
 	}
 	if (joystate[_numPAD].buttons[CTL_R_SHOULDER])	
 	{
 		_pPADStatus->button|=PAD_TRIGGER_R;
-		_pPADStatus->triggerRight = 255;	// Perhaps support halfpress/pressure
+		_pPADStatus->triggerRight = triggervalue;
 	}
+
 	if (joystate[_numPAD].buttons[CTL_A_BUTTON])
 	{
 		_pPADStatus->button|=PAD_BUTTON_A;
-		_pPADStatus->analogA = 255;			// Perhaps support halfpress/pressure
+		_pPADStatus->analogA = 255;			// Perhaps support pressure?
 	}
 	if (joystate[_numPAD].buttons[CTL_B_BUTTON])
 	{
 		_pPADStatus->button|=PAD_BUTTON_B;
-		_pPADStatus->analogB = 255;			// Perhaps support halfpress/pressure
+		_pPADStatus->analogB = 255;			// Perhaps support pressure?
 	}
 	if (joystate[_numPAD].buttons[CTL_X_BUTTON])	_pPADStatus->button|=PAD_BUTTON_X;
 	if (joystate[_numPAD].buttons[CTL_Y_BUTTON])	_pPADStatus->button|=PAD_BUTTON_Y;
@@ -232,11 +237,25 @@ void PAD_GetStatus(BYTE _numPAD, SPADStatus* _pPADStatus)
 	if (joystate[_numPAD].buttons[CTL_START])		_pPADStatus->button|=PAD_BUTTON_START;
 
 	// Set D-pad
-	if(joystate[_numPAD].dpad == SDL_HAT_LEFTUP		|| joystate[_numPAD].dpad == SDL_HAT_UP		|| joystate[_numPAD].dpad == SDL_HAT_RIGHTUP )		_pPADStatus->button|=PAD_BUTTON_UP;
-	if(joystate[_numPAD].dpad == SDL_HAT_LEFTUP		|| joystate[_numPAD].dpad == SDL_HAT_LEFT	|| joystate[_numPAD].dpad == SDL_HAT_LEFTDOWN )		_pPADStatus->button|=PAD_BUTTON_LEFT;
-	if(joystate[_numPAD].dpad == SDL_HAT_LEFTDOWN	|| joystate[_numPAD].dpad == SDL_HAT_DOWN	|| joystate[_numPAD].dpad == SDL_HAT_RIGHTDOWN )	_pPADStatus->button|=PAD_BUTTON_DOWN;
-	if(joystate[_numPAD].dpad == SDL_HAT_RIGHTUP	|| joystate[_numPAD].dpad == SDL_HAT_RIGHT	|| joystate[_numPAD].dpad == SDL_HAT_RIGHTDOWN )	_pPADStatus->button|=PAD_BUTTON_RIGHT;
-
+	if(joysticks[_numPAD].controllertype == CTL_TYPE_JOYSTICK)
+	{
+		if(joystate[_numPAD].dpad == SDL_HAT_LEFTUP		|| joystate[_numPAD].dpad == SDL_HAT_UP		|| joystate[_numPAD].dpad == SDL_HAT_RIGHTUP )		_pPADStatus->button|=PAD_BUTTON_UP;
+		if(joystate[_numPAD].dpad == SDL_HAT_LEFTUP		|| joystate[_numPAD].dpad == SDL_HAT_LEFT	|| joystate[_numPAD].dpad == SDL_HAT_LEFTDOWN )		_pPADStatus->button|=PAD_BUTTON_LEFT;
+		if(joystate[_numPAD].dpad == SDL_HAT_LEFTDOWN	|| joystate[_numPAD].dpad == SDL_HAT_DOWN	|| joystate[_numPAD].dpad == SDL_HAT_RIGHTDOWN )	_pPADStatus->button|=PAD_BUTTON_DOWN;
+		if(joystate[_numPAD].dpad == SDL_HAT_RIGHTUP	|| joystate[_numPAD].dpad == SDL_HAT_RIGHT	|| joystate[_numPAD].dpad == SDL_HAT_RIGHTDOWN )	_pPADStatus->button|=PAD_BUTTON_RIGHT;
+	}
+	else
+	{
+		if(joystate[_numPAD].dpad2[CTL_D_PAD_UP])
+			_pPADStatus->button|=PAD_BUTTON_UP;
+		if(joystate[_numPAD].dpad2[CTL_D_PAD_DOWN])
+			_pPADStatus->button|=PAD_BUTTON_DOWN;
+		if(joystate[_numPAD].dpad2[CTL_D_PAD_LEFT])
+			_pPADStatus->button|=PAD_BUTTON_LEFT;
+		if(joystate[_numPAD].dpad2[CTL_D_PAD_RIGHT])
+			_pPADStatus->button|=PAD_BUTTON_RIGHT;
+	}
+	
 	_pPADStatus->err = PAD_ERR_NONE;
 }
 
@@ -299,7 +318,17 @@ void GetJoyState(int controller)
 	joystate[controller].buttons[CTL_Z_TRIGGER] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].buttons[CTL_Z_TRIGGER]);
 	joystate[controller].buttons[CTL_START] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].buttons[CTL_START]);
 
-	joystate[controller].dpad = SDL_JoystickGetHat(joystate[controller].joy, joysticks[controller].dpad);
+	joystate[controller].halfpress = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].halfpress);
+
+	if(joysticks[controller].controllertype == CTL_TYPE_JOYSTICK)
+		joystate[controller].dpad = SDL_JoystickGetHat(joystate[controller].joy, joysticks[controller].dpad);
+	else
+	{
+		joystate[controller].dpad2[CTL_D_PAD_UP] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_UP]);
+		joystate[controller].dpad2[CTL_D_PAD_DOWN] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_DOWN]);
+		joystate[controller].dpad2[CTL_D_PAD_LEFT] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_LEFT]);
+		joystate[controller].dpad2[CTL_D_PAD_RIGHT] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_RIGHT]);
+	}
 }
 
 // Search attached devices
@@ -399,7 +428,7 @@ void DEBUG_QUIT()
 void SaveConfig()
 {
 	IniFile file;
-	file.Load("nJoy");
+	file.Load("nJoy.ini");
 
 	for (int i=0; i<4; i++)
 	{
@@ -415,6 +444,10 @@ void SaveConfig()
 		file.Set(SectionName, "z_trigger", joysticks[i].buttons[CTL_Z_TRIGGER]);
 		file.Set(SectionName, "start_button", joysticks[i].buttons[CTL_START]);
 		file.Set(SectionName, "dpad", joysticks[i].dpad);	
+		file.Set(SectionName, "dpad_up", joysticks[i].dpad2[CTL_D_PAD_UP]);
+		file.Set(SectionName, "dpad_down", joysticks[i].dpad2[CTL_D_PAD_DOWN]);
+		file.Set(SectionName, "dpad_left", joysticks[i].dpad2[CTL_D_PAD_LEFT]);
+		file.Set(SectionName, "dpad_right", joysticks[i].dpad2[CTL_D_PAD_RIGHT]);
 		file.Set(SectionName, "main_x", joysticks[i].axis[CTL_MAIN_X]);
 		file.Set(SectionName, "main_y", joysticks[i].axis[CTL_MAIN_Y]);
 		file.Set(SectionName, "sub_x", joysticks[i].axis[CTL_SUB_X]);
@@ -423,9 +456,10 @@ void SaveConfig()
 		file.Set(SectionName, "deadzone", joysticks[i].deadzone);
 		file.Set(SectionName, "halfpress", joysticks[i].halfpress);
 		file.Set(SectionName, "joy_id", joysticks[i].ID);
+		file.Set(SectionName, "controllertype", joysticks[i].controllertype);
 	}
 
-	file.Save("nJoy");
+	file.Save("nJoy.ini");
 }
 
 // Load settings from file
@@ -433,7 +467,7 @@ void SaveConfig()
 void LoadConfig()
 {
 	IniFile file;
-	file.Load("nJoy");
+	file.Load("nJoy.ini");
 
 	for (int i=0; i<4; i++)
 	{
@@ -449,13 +483,18 @@ void LoadConfig()
 		file.Get(SectionName, "z_trigger", &joysticks[i].buttons[CTL_Z_TRIGGER], 7);
 		file.Get(SectionName, "start_button", &joysticks[i].buttons[CTL_START], 9);	
 		file.Get(SectionName, "dpad", &joysticks[i].dpad, 0);	
+		file.Get(SectionName, "dpad_up", &joysticks[i].dpad2[CTL_D_PAD_UP], 0);
+		file.Get(SectionName, "dpad_down", &joysticks[i].dpad2[CTL_D_PAD_DOWN], 0);
+		file.Get(SectionName, "dpad_left", &joysticks[i].dpad2[CTL_D_PAD_LEFT], 0);
+		file.Get(SectionName, "dpad_right", &joysticks[i].dpad2[CTL_D_PAD_RIGHT], 0);
 		file.Get(SectionName, "main_x", &joysticks[i].axis[CTL_MAIN_X], 0);	
 		file.Get(SectionName, "main_y", &joysticks[i].axis[CTL_MAIN_Y], 1);	
 		file.Get(SectionName, "sub_x", &joysticks[i].axis[CTL_SUB_X], 2);	
 		file.Get(SectionName, "sub_y", &joysticks[i].axis[CTL_SUB_Y], 3);	
 		file.Get(SectionName, "enabled", &joysticks[i].enabled, 1);	
 		file.Get(SectionName, "deadzone", &joysticks[i].deadzone, 9);	
-		file.Get(SectionName, "halfpress", &joysticks[i].halfpress, 0);	
+		file.Get(SectionName, "halfpress", &joysticks[i].halfpress, 6);	
 		file.Get(SectionName, "joy_id", &joysticks[i].ID, 0);
+		file.Get(SectionName, "controllertype", &joysticks[i].controllertype, 0);
 	}
 }
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h
index 532957dbb4..189ff55623 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h
@@ -59,18 +59,22 @@
 struct CONTROLLER_STATE{	// GC PAD INFO/STATE
 	int buttons[8];			// Amount of buttons (A B X Y Z, L-Trigger R-Trigger Start) might need to change the triggers buttons
 	int dpad;				// 1 HAT (8 directions + neutral)
+	int dpad2[4];			// d-pad using buttons
 	int axis[4];			// 2 x 2 Axes (Main & Sub)
+	int halfpress;			// ...
 	SDL_Joystick *joy;		// SDL joystick device
 };
 
 struct CONTROLLER_MAPPING{	// GC PAD MAPPING
 	int buttons[8];			// Amount of buttons (A B X Y Z, L-Trigger R-Trigger Start) might need to change the triggers buttons
 	int dpad;				// 1 HAT (8 directions + neutral)
+	int dpad2[4];			// d-pad using buttons
 	int axis[4];			// 2 x 2 Axes (Main & Sub)
 	int enabled;			// Pad attached?
 	int deadzone;			// Deadzone... what else?
-	int halfpress;			// Not implemented
+	int halfpress;			// Halfpress... you know, like not fully pressed ;)...
 	int ID;					// SDL joystick device ID
+	int controllertype;		// Joystick, Joystick no hat or a keyboard (perhaps a mouse later)
 };
 
 struct CONTROLLER_INFO{		// CONNECTED WINDOWS DEVICES INFO
@@ -100,9 +104,23 @@ enum
 	CTL_X_BUTTON,
 	CTL_Y_BUTTON,
 	CTL_Z_TRIGGER,	
-	CTL_START
+	CTL_START	
 };
 
+enum
+{
+	CTL_TYPE_JOYSTICK = 0,
+	CTL_TYPE_JOYSTICK_NO_HAT,
+	CTL_TYPE_KEYBOARD
+};
+
+enum
+{
+	CTL_D_PAD_UP = 0,
+	CTL_D_PAD_DOWN,
+	CTL_D_PAD_LEFT,
+	CTL_D_PAD_RIGHT
+};
 //////////////////////////////////////////////////////////////////////////////////////////
 // Custom Functions
 // ����������������