summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2009-12-04 06:43:30 +0000
committerSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2009-12-04 06:43:30 +0000
commit41e7b60e2e6397c4f8ae91495eb74728b6f562c7 (patch)
tree5eef9e1efca8afd3db7de140aee70bbbe731e5f6 /plugins
parentaca57a03bd7fdb0e23ea4f6d979dfe7008648195 (diff)
downloadpcsxr-41e7b60e2e6397c4f8ae91495eb74728b6f562c7.tar.gz
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@38792 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'plugins')
-rw-r--r--plugins/dfinput/analog.c172
-rw-r--r--plugins/dfinput/cfg-gtk2.c174
-rw-r--r--plugins/dfinput/cfg.c77
-rw-r--r--plugins/dfinput/pad.c26
-rw-r--r--plugins/dfinput/pad.h11
-rw-r--r--plugins/dfinput/sdljoy.c1
-rw-r--r--plugins/dfinput/xkb.c4
7 files changed, 335 insertions, 130 deletions
diff --git a/plugins/dfinput/analog.c b/plugins/dfinput/analog.c
index 90285220..d736f6ce 100644
--- a/plugins/dfinput/analog.c
+++ b/plugins/dfinput/analog.c
@@ -19,28 +19,20 @@
#include "pad.h"
void InitAnalog() {
-#if 0
- g.PadState[0].AnalogStatus[ANALOG_LEFT][ANALOG_X] = 128;
- g.PadState[0].AnalogStatus[ANALOG_LEFT][ANALOG_Y] = 128;
- g.PadState[0].AnalogStatus[ANALOG_RIGHT][ANALOG_X] = 128;
- g.PadState[0].AnalogStatus[ANALOG_RIGHT][ANALOG_Y] = 128;
- g.PadState[1].AnalogStatus[ANALOG_LEFT][ANALOG_X] = 128;
- g.PadState[1].AnalogStatus[ANALOG_LEFT][ANALOG_Y] = 128;
- g.PadState[1].AnalogStatus[ANALOG_RIGHT][ANALOG_X] = 128;
- g.PadState[1].AnalogStatus[ANALOG_RIGHT][ANALOG_Y] = 128;
-#else
// use 127 instead of 128 fixes the FF8 "reverting" problem, but
// why ALL of the protocol docs I seen as well as psemu_plugin_defs.h
// say 128 is the center position?
- g.PadState[0].AnalogStatus[ANALOG_LEFT][ANALOG_X] = 127;
- g.PadState[0].AnalogStatus[ANALOG_LEFT][ANALOG_Y] = 127;
- g.PadState[0].AnalogStatus[ANALOG_RIGHT][ANALOG_X] = 127;
- g.PadState[0].AnalogStatus[ANALOG_RIGHT][ANALOG_Y] = 127;
- g.PadState[1].AnalogStatus[ANALOG_LEFT][ANALOG_X] = 127;
- g.PadState[1].AnalogStatus[ANALOG_LEFT][ANALOG_Y] = 127;
- g.PadState[1].AnalogStatus[ANALOG_RIGHT][ANALOG_X] = 127;
- g.PadState[1].AnalogStatus[ANALOG_RIGHT][ANALOG_Y] = 127;
-#endif
+ g.PadState[0].AnalogStatus[ANALOG_LEFT][0] = 127;
+ g.PadState[0].AnalogStatus[ANALOG_LEFT][1] = 127;
+ g.PadState[0].AnalogStatus[ANALOG_RIGHT][0] = 127;
+ g.PadState[0].AnalogStatus[ANALOG_RIGHT][1] = 127;
+ g.PadState[1].AnalogStatus[ANALOG_LEFT][0] = 127;
+ g.PadState[1].AnalogStatus[ANALOG_LEFT][1] = 127;
+ g.PadState[1].AnalogStatus[ANALOG_RIGHT][0] = 127;
+ g.PadState[1].AnalogStatus[ANALOG_RIGHT][1] = 127;
+
+ memset(g.PadState[0].AnalogKeyStatus, 0, sizeof(g.PadState[0].AnalogKeyStatus));
+ memset(g.PadState[1].AnalogKeyStatus, 0, sizeof(g.PadState[1].AnalogKeyStatus));
}
void CheckAnalog() {
@@ -53,28 +45,142 @@ void CheckAnalog() {
}
for (j = 0; j < ANALOG_TOTAL; j++) {
- for (k = 0; k < 2; k++) {
- if (g.cfg.PadDef[i].AnalogDef[j][k] == 0) {
+ for (k = 0; k < 4; k++) {
+ if (g.PadState[i].AnalogKeyStatus[j][k]) {
+ switch (k) {
+ case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 255; k++; break;
+ case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 0; break;
+ case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 255; k++; break;
+ case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 0; break;
+ }
continue;
}
- n = abs(g.cfg.PadDef[i].AnalogDef[j][k]) - 1;
+ switch (g.cfg.PadDef[i].AnalogDef[j][k].JoyEvType) {
+ case AXIS:
+ n = abs(g.cfg.PadDef[i].AnalogDef[j][k].J.Axis) - 1;
+
+ if (g.cfg.PadDef[i].AnalogDef[j][k].J.Axis > 0) {
+ val = SDL_JoystickGetAxis(g.PadState[i].JoyDev, n);
+ if (val >= 0) {
+ val += 32767;
+ val /= 256;
+
+ switch (k) {
+ case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = val; break;
+ case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 255 - val; break;
+ case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = val; break;
+ case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 255 - val; break;
+ }
+ }
+ } else if (g.cfg.PadDef[i].AnalogDef[j][k].J.Axis < 0) {
+ val = SDL_JoystickGetAxis(g.PadState[i].JoyDev, n);
+ if (val <= 0) {
+ val += 32767;
+ val /= 256;
+
+ switch (k) {
+ case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 255 - val; break;
+ case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = val; break;
+ case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 255 - val; break;
+ case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = val; break;
+ }
+ }
+ }
+ break;
+
+ case HAT:
+ n = (g.cfg.PadDef[i].AnalogDef[j][k].J.Hat >> 8);
+
+ g.PadState[i].AnalogStatus[j][0] = 0;
+
+ if (SDL_JoystickGetHat(g.PadState[i].JoyDev, n) & (g.cfg.PadDef[i].AnalogDef[j][k].J.Hat & 0xFF)) {
+ switch (k) {
+ case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 255; k++; break;
+ case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 0; break;
+ case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 255; k++; break;
+ case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 0; break;
+ }
+ } else {
+ switch (k) {
+ case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 127; break;
+ case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 127; break;
+ case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 127; break;
+ case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 127; break;
+ }
+ }
+ break;
+
+ case BUTTON:
+ if (SDL_JoystickGetButton(g.PadState[i].JoyDev, g.cfg.PadDef[i].AnalogDef[j][k].J.Button)) {
+ switch (k) {
+ case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 255; k++; break;
+ case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 0; break;
+ case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 255; k++; break;
+ case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 0; break;
+ }
+ } else {
+ switch (k) {
+ case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 127; break;
+ case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 127; break;
+ case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 127; break;
+ case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 127; break;
+ }
+ }
+ break;
+
+ default:
+ switch (k) {
+ case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 127; break;
+ case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 127; break;
+ case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 127; break;
+ case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 127; break;
+ }
+ break;
+ }
+ }
+ }
+ }
+}
+
+int AnalogKeyPressed(uint16_t Key) {
+ int i, j, k;
+
+ for (i = 0; i < 2; i++) {
+ if (g.cfg.PadDef[i].Type != PSE_PAD_TYPE_ANALOGPAD) {
+ continue;
+ }
+
+ for (j = 0; j < ANALOG_TOTAL; j++) {
+ for (k = 0; k < 4; k++) {
+ if (g.cfg.PadDef[i].AnalogDef[j][k].Key == Key) {
+ g.PadState[i].AnalogKeyStatus[j][k] = 1;
+ return 1;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
- val = SDL_JoystickGetAxis(g.PadState[i].JoyDev, n);
+int AnalogKeyReleased(uint16_t Key) {
+ int i, j, k;
-#if 0
- val += 32768;
-#else
- val += 32767;
-#endif
- val /= 256;
+ for (i = 0; i < 2; i++) {
+ if (g.cfg.PadDef[i].Type != PSE_PAD_TYPE_ANALOGPAD) {
+ continue;
+ }
- if (g.cfg.PadDef[i].AnalogDef[j][k] < 0) {
- g.PadState[i].AnalogStatus[j][k] = 255 - val;
- } else {
- g.PadState[i].AnalogStatus[j][k] = val;
+ for (j = 0; j < ANALOG_TOTAL; j++) {
+ for (k = 0; k < 4; k++) {
+ if (g.cfg.PadDef[i].AnalogDef[j][k].Key == Key) {
+ g.PadState[i].AnalogKeyStatus[j][k] = 0;
+ return 1;
}
}
}
}
+
+ return 0;
}
diff --git a/plugins/dfinput/cfg-gtk2.c b/plugins/dfinput/cfg-gtk2.c
index d51034df..644269ba 100644
--- a/plugins/dfinput/cfg-gtk2.c
+++ b/plugins/dfinput/cfg-gtk2.c
@@ -38,10 +38,10 @@ const int DPad[DKEY_TOTAL] = {
DKEY_R1,
DKEY_L2,
DKEY_R2,
- DKEY_L3,
- DKEY_R3,
DKEY_SELECT,
- DKEY_START
+ DKEY_START,
+ DKEY_L3,
+ DKEY_R3
};
const char *DPadText[DKEY_TOTAL] = {
@@ -57,17 +57,21 @@ const char *DPadText[DKEY_TOTAL] = {
N_("R1"),
N_("L2"),
N_("R2"),
- N_("L3"),
- N_("R3"),
N_("Select"),
- N_("Start")
+ N_("Start"),
+ N_("L3"),
+ N_("R3")
};
const char *AnalogText[] = {
- N_("L-Stick X"),
- N_("L-Stick Y"),
- N_("R-Stick X"),
- N_("R-Stick Y")
+ N_("L-Stick Right"),
+ N_("L-Stick Left"),
+ N_("L-Stick Down"),
+ N_("L-Stick Up"),
+ N_("R-Stick Right"),
+ N_("R-Stick Left"),
+ N_("R-Stick Down"),
+ N_("R-Stick Up")
};
static int GetSelectedKeyIndex(int padnum) {
@@ -134,13 +138,42 @@ static void GetKeyDescription(char *buf, int joynum, int key) {
}
}
-static void GetAnalogDescription(char *buf, int joynum, int analognum, int analogaxis) {
- int16_t v = g.cfg.PadDef[joynum].AnalogDef[analognum][analogaxis];
+static void GetAnalogDescription(char *buf, int joynum, int analognum, int dir) {
+ const char *hatname[16] = {_("Centered"), _("Up"), _("Right"), _("Rightup"),
+ _("Down"), "", _("Rightdown"), "", _("Left"), _("Leftup"), "", "",
+ _("Leftdown"), "", "", ""};
- if (v == 0) {
- sprintf(buf, _("(Not Set)"));
- } else {
- sprintf(buf, _("Joystick: Axis %d%s"), abs(v) - 1, (v < 0) ? _(" (Reversed)") : "");
+ switch (g.cfg.PadDef[joynum].AnalogDef[analognum][dir].JoyEvType) {
+ case BUTTON:
+ sprintf(buf, _("Joystick: Button %d"), g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Button);
+ break;
+
+ case AXIS:
+ sprintf(buf, _("Joystick: Axis %d%c"), abs(g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Axis) - 1,
+ g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Axis > 0 ? '+' : '-');
+ break;
+
+ case HAT:
+ sprintf(buf, _("Joystick: Hat %d %s"), (g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Hat >> 8),
+ hatname[g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Hat & 0x0F]);
+ break;
+
+ case NONE:
+ default:
+ buf[0] = '\0';
+ break;
+ }
+
+ if (g.cfg.PadDef[joynum].AnalogDef[analognum][dir].Key != 0) {
+ if (buf[0] != '\0') {
+ strcat(buf, " / ");
+ }
+
+ strcat(buf, _("Keyboard:"));
+ strcat(buf, " ");
+ strcat(buf, XKeysymToString(g.cfg.PadDef[joynum].AnalogDef[analognum][dir].Key));
+ } else if (buf[0] == '\0') {
+ strcpy(buf, _("(Not Set)"));
}
}
@@ -157,20 +190,28 @@ static void UpdateKeyList() {
xml = glade_get_widget_tree(MainWindow);
for (i = 0; i < 2; i++) {
+ int total;
+
+ if (g.cfg.PadDef[i].Type == PSE_PAD_TYPE_ANALOGPAD) {
+ total = DKEY_TOTAL;
+ } else {
+ total = DKEY_TOTAL - 2;
+ }
+
widget = glade_xml_get_widget(xml, widgetname[i]);
store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
- for (j = 0; j < DKEY_TOTAL; j++) {
+ for (j = 0; j < total; j++) {
gtk_list_store_append(store, &iter);
GetKeyDescription(buf, i, DPad[j]);
gtk_list_store_set(store, &iter, 0, _(DPadText[j]), 1, buf, -1);
}
if (g.cfg.PadDef[i].Type == PSE_PAD_TYPE_ANALOGPAD) {
- for (j = 0; j < 4; j++) {
+ for (j = 0; j < 8; j++) {
gtk_list_store_append(store, &iter);
- GetAnalogDescription(buf, i, j / 2, j % 2);
+ GetAnalogDescription(buf, i, j / 4, j % 4);
gtk_list_store_set(store, &iter, 0, _(AnalogText[j]), 1, buf, -1);
}
}
@@ -204,7 +245,7 @@ static void UpdateKey() {
if (index < DKEY_TOTAL) {
GetKeyDescription(buf, i, DPad[index]);
} else {
- GetAnalogDescription(buf, i, (index - DKEY_TOTAL) / 2, (index - DKEY_TOTAL) % 2);
+ GetAnalogDescription(buf, i, (index - DKEY_TOTAL) / 4, (index - DKEY_TOTAL) % 4);
}
g_value_init(&value, G_TYPE_STRING);
@@ -286,17 +327,6 @@ static void OnThreadedToggled(GtkWidget *widget, gpointer user_data) {
g.cfg.Threaded = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
}
-static void SysErrorMessage(gchar *primary, gchar *secondary) {
- GtkWidget *message_dialog;
-
- message_dialog = gtk_message_dialog_new(NULL,
- GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, primary, NULL);
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG (message_dialog), secondary);
-
- gtk_dialog_run(GTK_DIALOG(message_dialog));
- gtk_widget_destroy(message_dialog);
-}
-
static void ReadDKeyEvent(int padnum, int key) {
SDL_Joystick *js;
time_t t;
@@ -376,44 +406,72 @@ end:
}
}
-static void ReadAnalogEvent(int padnum, int analognum, int analogaxis) {
+static void ReadAnalogEvent(int padnum, int analognum, int analogdir) {
SDL_Joystick *js;
time_t t;
GdkEvent *ge;
int i;
Sint16 axis;
- if (g.cfg.PadDef[padnum].DevNum < 0) {
- SysErrorMessage(_("Device not set"), _("Please select a valid Joystick Device"));
- return;
- }
-
- js = SDL_JoystickOpen(g.cfg.PadDef[padnum].DevNum);
- if (js == NULL) {
- SysErrorMessage(_("Device open error"), _("Unable to open Joystick Device"));
- return;
+ if (g.cfg.PadDef[padnum].DevNum >= 0) {
+ js = SDL_JoystickOpen(g.cfg.PadDef[padnum].DevNum);
+ SDL_JoystickEventState(SDL_IGNORE);
+ } else {
+ js = NULL;
}
t = time(NULL);
while (time(NULL) < t + 10) {
// check joystick events
- SDL_JoystickUpdate();
- for (i = 0; i < SDL_JoystickNumAxes(js); i++) {
- axis = SDL_JoystickGetAxis(js, i);
- if (abs(axis) > 16383) {
- g.cfg.PadDef[padnum].AnalogDef[analognum][analogaxis] = (i + 1) * (axis > 0 ? 1 : -1);
- goto end1;
+ if (js != NULL) {
+ SDL_JoystickUpdate();
+
+ for (i = 0; i < SDL_JoystickNumButtons(js); i++) {
+ if (SDL_JoystickGetButton(js, i)) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].JoyEvType = BUTTON;
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Button = i;
+ goto end;
+ }
+ }
+
+ for (i = 0; i < SDL_JoystickNumAxes(js); i++) {
+ axis = SDL_JoystickGetAxis(js, i);
+ if (abs(axis) > 16383) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].JoyEvType = AXIS;
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Axis = (i + 1) * (axis > 0 ? 1 : -1);
+ goto end;
+ }
+ }
+
+ for (i = 0; i < SDL_JoystickNumHats(js); i++) {
+ axis = SDL_JoystickGetHat(js, i);
+ if (axis != SDL_HAT_CENTERED) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].JoyEvType = HAT;
+
+ if (axis & SDL_HAT_UP) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_UP);
+ } else if (axis & SDL_HAT_DOWN) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_DOWN);
+ } else if (axis & SDL_HAT_LEFT) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_LEFT);
+ } else if (axis & SDL_HAT_RIGHT) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_RIGHT);
+ }
+
+ goto end;
+ }
}
}
// check keyboard events
while ((ge = gdk_event_get()) != NULL) {
if (ge->type == GDK_KEY_PRESS) {
- if (ge->key.keyval == XK_Escape) {
- gdk_event_free(ge);
- goto end1;
+ if (ge->key.keyval != XK_Escape) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].Key = ge->key.keyval;
}
+ gdk_event_free(ge);
+ goto end;
}
gdk_event_free(ge);
}
@@ -421,8 +479,10 @@ static void ReadAnalogEvent(int padnum, int analognum, int analogaxis) {
usleep(5000);
}
-end1:
- SDL_JoystickClose(js);
+end:
+ if (js != NULL) {
+ SDL_JoystickClose(js);
+ }
}
static void OnChangeClicked(GtkWidget *widget, gpointer user_data) {
@@ -435,7 +495,7 @@ static void OnChangeClicked(GtkWidget *widget, gpointer user_data) {
ReadDKeyEvent(pad, DPad[index]);
} else {
index -= DKEY_TOTAL;
- ReadAnalogEvent(pad, index / 2, index % 2);
+ ReadAnalogEvent(pad, index / 4, index % 4);
}
UpdateKey();
@@ -453,7 +513,9 @@ static void OnResetClicked(GtkWidget *widget, gpointer user_data) {
g.cfg.PadDef[pad].KeyDef[DPad[index]].J.Button = 0;
} else {
index -= DKEY_TOTAL;
- g.cfg.PadDef[pad].AnalogDef[index / 2][index % 2] = 0;
+ g.cfg.PadDef[pad].AnalogDef[index / 4][index % 4].Key = 0;
+ g.cfg.PadDef[pad].AnalogDef[index / 4][index % 4].JoyEvType = NONE;
+ g.cfg.PadDef[pad].AnalogDef[index / 4][index % 4].J.Button = 0;
}
UpdateKey();
@@ -641,11 +703,7 @@ void PADabout() {
GtkWidget *widget;
widget = gtk_about_dialog_new();
-#ifdef EPSXE
- gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(widget), "Gamepad/Keyboard Input (ePSXe)");
-#else
gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(widget), "Gamepad/Keyboard Input");
-#endif
gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(widget), "1.1");
gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(widget), authors);
gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(widget), "http://www.codeplex.com/pcsxr/");
diff --git a/plugins/dfinput/cfg.c b/plugins/dfinput/cfg.c
index 00ace414..1da137ad 100644
--- a/plugins/dfinput/cfg.c
+++ b/plugins/dfinput/cfg.c
@@ -218,14 +218,46 @@ void LoadConfig() {
g.cfg.PadDef[current].KeyDef[DKEY_SQUARE].Key = a;
g.cfg.PadDef[current].KeyDef[DKEY_SQUARE].JoyEvType = b;
g.cfg.PadDef[current].KeyDef[DKEY_SQUARE].J.d = c;
- } else if (strncmp(buf, "LeftAnalogX=", 12) == 0) {
- g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_X] = atoi(&buf[12]);
- } else if (strncmp(buf, "LeftAnalogY=", 12) == 0) {
- g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_Y] = atoi(&buf[12]);
- } else if (strncmp(buf, "RightAnalogX=", 13) == 0) {
- g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_X] = atoi(&buf[13]);
- } else if (strncmp(buf, "RightAnalogY=", 13) == 0) {
- g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_Y] = atoi(&buf[13]);
+ } else if (strncmp(buf, "LeftAnalogXP=", 13) == 0) {
+ sscanf(buf, "LeftAnalogXP=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XP].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XP].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XP].J.d = c;
+ } else if (strncmp(buf, "LeftAnalogXM=", 13) == 0) {
+ sscanf(buf, "LeftAnalogXM=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XM].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XM].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XM].J.d = c;
+ } else if (strncmp(buf, "LeftAnalogYP=", 13) == 0) {
+ sscanf(buf, "LeftAnalogYP=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YP].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YP].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YP].J.d = c;
+ } else if (strncmp(buf, "LeftAnalogYM=", 13) == 0) {
+ sscanf(buf, "LeftAnalogYM=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YM].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YM].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YM].J.d = c;
+ } else if (strncmp(buf, "RightAnalogXP=", 14) == 0) {
+ sscanf(buf, "RightAnalogXP=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XP].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XP].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XP].J.d = c;
+ } else if (strncmp(buf, "RightAnalogXM=", 14) == 0) {
+ sscanf(buf, "RightAnalogXM=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XM].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XM].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XM].J.d = c;
+ } else if (strncmp(buf, "RightAnalogYP=", 14) == 0) {
+ sscanf(buf, "RightAnalogYP=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YP].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YP].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YP].J.d = c;
+ } else if (strncmp(buf, "RightAnalogYM=", 14) == 0) {
+ sscanf(buf, "RightAnalogYM=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YM].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YM].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YM].J.d = c;
}
}
@@ -282,11 +314,30 @@ void SaveConfig() {
g.cfg.PadDef[i].KeyDef[DKEY_CROSS].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_CROSS].J.d);
fprintf(fp, "Square=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_SQUARE].Key,
g.cfg.PadDef[i].KeyDef[DKEY_SQUARE].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_SQUARE].J.d);
-
- fprintf(fp, "LeftAnalogX=%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_X]);
- fprintf(fp, "LeftAnalogY=%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_Y]);
- fprintf(fp, "RightAnalogX=%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_X]);
- fprintf(fp, "RightAnalogY=%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_Y]);
+ fprintf(fp, "LeftAnalogXP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XP].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XP].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XP].J.d);
+ fprintf(fp, "LeftAnalogXM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XM].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XM].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XM].J.d);
+ fprintf(fp, "LeftAnalogYP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YP].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YP].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YP].J.d);
+ fprintf(fp, "LeftAnalogYM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YM].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YM].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YM].J.d);
+ fprintf(fp, "RightAnalogXP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XP].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XP].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XP].J.d);
+ fprintf(fp, "RightAnalogXM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XM].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XM].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XM].J.d);
+ fprintf(fp, "RightAnalogYP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YP].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YP].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YP].J.d);
+ fprintf(fp, "RightAnalogYM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YM].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YM].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YM].J.d);
fprintf(fp, "\n");
}
diff --git a/plugins/dfinput/pad.c b/plugins/dfinput/pad.c
index ca54ebca..1fdda103 100644
--- a/plugins/dfinput/pad.c
+++ b/plugins/dfinput/pad.c
@@ -19,11 +19,7 @@
#include "pad.h"
char *PSEgetLibName(void) {
-#ifdef EPSXE
- return _("Gamepad/Keyboard Input (ePSXe)");
-#else
return _("Gamepad/Keyboard Input");
-#endif
}
uint32_t PSEgetLibType(void) {
@@ -125,8 +121,6 @@ static void UpdateInput(void) {
CheckKeyboard();
}
-#ifndef EPSXE
-
static uint8_t stdpar[2][8] = {
{0xFF, 0x5A, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80},
{0xFF, 0x5A, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80}
@@ -255,10 +249,10 @@ unsigned char PADpoll(unsigned char value) {
if (g.PadState[CurPad].PadMode == 1) {
CmdLen = 8;
- stdpar[CurPad][4] = g.PadState[CurPad].AnalogStatus[ANALOG_RIGHT][ANALOG_X];
- stdpar[CurPad][5] = g.PadState[CurPad].AnalogStatus[ANALOG_RIGHT][ANALOG_Y];
- stdpar[CurPad][6] = g.PadState[CurPad].AnalogStatus[ANALOG_LEFT][ANALOG_X];
- stdpar[CurPad][7] = g.PadState[CurPad].AnalogStatus[ANALOG_LEFT][ANALOG_Y];
+ stdpar[CurPad][4] = g.PadState[CurPad].AnalogStatus[ANALOG_RIGHT][0];
+ stdpar[CurPad][5] = g.PadState[CurPad].AnalogStatus[ANALOG_RIGHT][1];
+ stdpar[CurPad][6] = g.PadState[CurPad].AnalogStatus[ANALOG_LEFT][0];
+ stdpar[CurPad][7] = g.PadState[CurPad].AnalogStatus[ANALOG_LEFT][1];
} else {
CmdLen = 4;
}
@@ -329,25 +323,21 @@ unsigned char PADpoll(unsigned char value) {
return buf[CurByte++];
}
-#endif
-
static long PADreadPort(int num, PadDataS *pad) {
UpdateInput();
pad->buttonStatus = (g.PadState[num].KeyStatus & g.PadState[num].JoyKeyStatus);
-#ifdef EPSXE
// ePSXe different from pcsx, swap bytes
pad->buttonStatus = (pad->buttonStatus >> 8) | (pad->buttonStatus << 8);
-#endif
switch (g.cfg.PadDef[num].Type) {
case PSE_PAD_TYPE_ANALOGPAD: // Analog Controller SCPH-1150
pad->controllerType = PSE_PAD_TYPE_ANALOGPAD;
- pad->rightJoyX = g.PadState[num].AnalogStatus[ANALOG_RIGHT][ANALOG_X];
- pad->rightJoyY = g.PadState[num].AnalogStatus[ANALOG_RIGHT][ANALOG_Y];
- pad->leftJoyX = g.PadState[num].AnalogStatus[ANALOG_LEFT][ANALOG_X];
- pad->leftJoyY = g.PadState[num].AnalogStatus[ANALOG_LEFT][ANALOG_Y];
+ pad->rightJoyX = g.PadState[num].AnalogStatus[ANALOG_RIGHT][0];
+ pad->rightJoyY = g.PadState[num].AnalogStatus[ANALOG_RIGHT][1];
+ pad->leftJoyX = g.PadState[num].AnalogStatus[ANALOG_LEFT][0];
+ pad->leftJoyY = g.PadState[num].AnalogStatus[ANALOG_LEFT][1];
break;
case PSE_PAD_TYPE_STANDARD: // Standard Pad SCPH-1080, SCPH-1150
diff --git a/plugins/dfinput/pad.h b/plugins/dfinput/pad.h
index de63db69..7989e69d 100644
--- a/plugins/dfinput/pad.h
+++ b/plugins/dfinput/pad.h
@@ -23,8 +23,6 @@
extern "C" {
#endif
-//#define EPSXE 1
-
#include "config.h"
#include <stdio.h>
@@ -93,13 +91,13 @@ typedef struct tagKeyDef {
uint16_t Key;
} KEYDEF;
-enum { ANALOG_X = 0, ANALOG_Y };
+enum { ANALOG_XP = 0, ANALOG_XM, ANALOG_YP, ANALOG_YM };
typedef struct tagPadDef {
int8_t DevNum;
uint16_t Type;
KEYDEF KeyDef[DKEY_TOTAL];
- int16_t AnalogDef[ANALOG_TOTAL][2]; // positive=axis+, negative=axis-, abs(Axis)-1=axis index
+ KEYDEF AnalogDef[ANALOG_TOTAL][4];
} PADDEF;
typedef struct tagConfig {
@@ -113,7 +111,8 @@ typedef struct tagPadState {
uint8_t PadID;
volatile uint16_t KeyStatus;
volatile uint16_t JoyKeyStatus;
- volatile uint8_t AnalogStatus[ANALOG_TOTAL][2]; // 0-255 where 128 is center position
+ volatile uint8_t AnalogStatus[ANALOG_TOTAL][2]; // 0-255 where 127 is center position
+ volatile uint8_t AnalogKeyStatus[ANALOG_TOTAL][4];
} PADSTATE;
typedef struct tagGlobalData {
@@ -156,6 +155,8 @@ void CheckKeyboard();
// analog.c functions...
void InitAnalog();
void CheckAnalog();
+int AnalogKeyPressed(uint16_t Key);
+int AnalogKeyReleased(uint16_t Key);
// pad.c functions...
char *PSEgetLibName(void);
diff --git a/plugins/dfinput/sdljoy.c b/plugins/dfinput/sdljoy.c
index 52d02d17..ff4ed467 100644
--- a/plugins/dfinput/sdljoy.c
+++ b/plugins/dfinput/sdljoy.c
@@ -55,7 +55,6 @@ void DestroySDLJoy() {
void CheckJoy() {
uint8_t i, j, n;
- int dx, dy;
SDL_JoystickUpdate();
diff --git a/plugins/dfinput/xkb.c b/plugins/dfinput/xkb.c
index 4ac6f868..bfadef10 100644
--- a/plugins/dfinput/xkb.c
+++ b/plugins/dfinput/xkb.c
@@ -54,7 +54,7 @@ void CheckKeyboard() {
}
}
}
- if (!found) {
+ if (!found && !AnalogKeyPressed(Key)) {
g.KeyLeftOver = Key;
}
return;
@@ -70,7 +70,7 @@ void CheckKeyboard() {
}
}
}
- if (!found) {
+ if (!found && !AnalogKeyReleased(Key)) {
g.KeyLeftOver = ((long)Key | 0x40000000);
}
break;