diff --git a/plugins/GSdx/GSLinuxDialog.cpp b/plugins/GSdx/GSLinuxDialog.cpp
index 303fd12097..bf05c081a5 100644
--- a/plugins/GSdx/GSLinuxDialog.cpp
+++ b/plugins/GSdx/GSLinuxDialog.cpp
@@ -44,10 +44,8 @@ bool RunLinuxDialog()
{
GtkWidget *dialog;
GtkWidget *main_frame, *main_box;
- GtkWidget *res_label, *res_combo_box;
GtkWidget *render_label, *render_combo_box;
GtkWidget *interlace_label, *interlace_combo_box;
- GtkWidget *aspect_label, *aspect_combo_box;
GtkWidget *swthreads_label, *swthreads_text;
GtkWidget *filter_check, *logz_check, *paltex_check, *fba_check, *aa_check, *win_check;
int return_value;
@@ -67,30 +65,6 @@ bool RunLinuxDialog()
main_frame = gtk_frame_new ("GSdx Config");
gtk_container_add (GTK_CONTAINER(main_frame), main_box);
- res_label = gtk_label_new ("Interpolation:");
- res_combo_box = gtk_combo_box_new_text ();
- gtk_combo_box_append_text(GTK_COMBO_BOX(res_combo_box), "640x480@60");
- gtk_combo_box_append_text(GTK_COMBO_BOX(res_combo_box), "800x600@60");
- gtk_combo_box_append_text(GTK_COMBO_BOX(res_combo_box), "1024x768@60");
- gtk_combo_box_append_text(GTK_COMBO_BOX(res_combo_box), "1280x960@60");
- gtk_combo_box_append_text(GTK_COMBO_BOX(res_combo_box), "And a few other values like that.");
-
- // A little hackish but enough for the moment.
- // Better drop this setting and lets the user resize the windows like any applications
- // You need only to constrain it with the aspect ratio -- greg
- int width = theApp.GetConfig("ModeWidth", 640);
- switch(width) {
- case 1280: gtk_combo_box_set_active(GTK_COMBO_BOX(res_combo_box), 3); break;
- case 1024: gtk_combo_box_set_active(GTK_COMBO_BOX(res_combo_box), 2); break;
- case 800: gtk_combo_box_set_active(GTK_COMBO_BOX(res_combo_box), 1); break;
- case 640: gtk_combo_box_set_active(GTK_COMBO_BOX(res_combo_box), 0); break;
- default: gtk_combo_box_set_active(GTK_COMBO_BOX(res_combo_box), 0); break;
- }
-
- gtk_container_add(GTK_CONTAINER(main_box), res_label);
- gtk_container_add(GTK_CONTAINER(main_box), res_combo_box);
-
-
render_label = gtk_label_new ("Renderer:");
render_combo_box = gtk_combo_box_new_text ();
@@ -128,25 +102,6 @@ bool RunLinuxDialog()
gtk_container_add(GTK_CONTAINER(main_box), interlace_label);
gtk_container_add(GTK_CONTAINER(main_box), interlace_combo_box);
- aspect_label = gtk_label_new ("Aspect Ratio:");
- aspect_combo_box = gtk_combo_box_new_text ();
-
- for(size_t i = 0; i < theApp.m_gs_aspectratio.size(); i++)
- {
- const GSSetting& s = theApp.m_gs_aspectratio[i];
-
- string label = s.name;
-
- if(!s.note.empty()) label += format(" (%s)", s.note.c_str());
-
- gtk_combo_box_append_text(GTK_COMBO_BOX(aspect_combo_box), label.c_str());
- }
-
-
- gtk_combo_box_set_active(GTK_COMBO_BOX(aspect_combo_box), 0);
- gtk_container_add(GTK_CONTAINER(main_box), aspect_label);
- gtk_container_add(GTK_CONTAINER(main_box), aspect_combo_box);
-
swthreads_label = gtk_label_new("Software renderer threads:");
swthreads_text = gtk_entry_new();
char buf[5];
@@ -157,7 +112,6 @@ bool RunLinuxDialog()
gtk_container_add(GTK_CONTAINER(main_box), swthreads_text);
-
filter_check = gtk_check_button_new_with_label("Texture Filtering");
logz_check = gtk_check_button_new_with_label("Logarithmic Z");
paltex_check = gtk_check_button_new_with_label("Allow 8 bit textures");
@@ -190,9 +144,6 @@ bool RunLinuxDialog()
// Get all the settings from the dialog box.
#if 0 // I'll put the right variable names in later.
- if (gtk_combo_box_get_active(GTK_COMBO_BOX(res_combo_box)) != -1)
- resolution = gtk_combo_box_get_active(GTK_COMBO_BOX(res_combo_box));
-
if (gtk_combo_box_get_active(GTK_COMBO_BOX(render_combo_box)) != -1)
renderer = gtk_combo_box_get_active(GTK_COMBO_BOX(render_combo_box));
@@ -202,17 +153,6 @@ bool RunLinuxDialog()
if (gtk_combo_box_get_active(GTK_COMBO_BOX(aspect_combo_box)) != -1)
aspect = gtk_combo_box_get_active(GTK_COMBO_BOX(aspect_combo_box));
#endif
- if (gtk_combo_box_get_active(GTK_COMBO_BOX(res_combo_box)) != -1) {
- int resolution = gtk_combo_box_get_active(GTK_COMBO_BOX(res_combo_box));
- switch (resolution) {
- case 0: theApp.SetConfig("ModeWidth", 640); theApp.SetConfig("ModeHeight", 480); break;
- case 1: theApp.SetConfig("ModeWidth", 800); theApp.SetConfig("ModeHeight", 600); break;
- case 2: theApp.SetConfig("ModeWidth", 1024); theApp.SetConfig("ModeHeight", 768); break;
- case 3: theApp.SetConfig("ModeWidth", 1280); theApp.SetConfig("ModeHeight", 960); break;
- default: theApp.SetConfig("ModeWidth", 640); theApp.SetConfig("ModeHeight", 480);
- }
-
- }
theApp.SetConfig("swthreads", atoi((char*)gtk_entry_get_text(GTK_ENTRY(swthreads_text))) );
diff --git a/plugins/onepad/CMakeLists.txt b/plugins/onepad/CMakeLists.txt
index 6009df5511..831e8f01ab 100644
--- a/plugins/onepad/CMakeLists.txt
+++ b/plugins/onepad/CMakeLists.txt
@@ -39,19 +39,19 @@ endif(CMAKE_BUILD_TYPE STREQUAL Release)
# onepad sources
set(onepadSources
- analog.cpp
controller.cpp
joystick.cpp
keyboard.cpp
+ KeyStatus.cpp
onepad.cpp)
# onepad headers
set(onepadHeaders
- analog.h
bitwise.h
controller.h
joystick.h
keyboard.h
+ KeyStatus.h
onepad.h)
# onepad Linux sources
diff --git a/plugins/onepad/KeyStatus.cpp b/plugins/onepad/KeyStatus.cpp
new file mode 100644
index 0000000000..afed3544d8
--- /dev/null
+++ b/plugins/onepad/KeyStatus.cpp
@@ -0,0 +1,192 @@
+/* OnePAD - author: arcum42(@gmail.com)
+ * Copyright (C) 2011
+ *
+ * Based on ZeroPAD, author zerofrog@gmail.com
+ * Copyright (C) 2006-2007
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "KeyStatus.h"
+
+void KeyStatus::Init()
+{
+ for (int pad = 0; pad < 2; pad++) {
+ m_button[pad] = 0xFFFF;
+ m_internal_button_kbd[pad] = 0xFFFF;
+ m_internal_button_joy[pad] = 0xFFFF;
+
+ for (int index = 0; index < MAX_KEYS; index++) {
+ m_button_pressure[pad][index] = 0xFF;
+ m_internal_button_pressure[pad][index] = 0xFF;
+ }
+
+ analog[pad].lx = 0x80;
+ analog[pad].ly = 0x80;
+ analog[pad].rx = 0x80;
+ analog[pad].ry = 0x80;
+ m_internal_analog_kbd[pad].lx = 0x80;
+ m_internal_analog_kbd[pad].ly = 0x80;
+ m_internal_analog_kbd[pad].rx = 0x80;
+ m_internal_analog_kbd[pad].ry = 0x80;
+ m_internal_analog_joy[pad].lx = 0x80;
+ m_internal_analog_joy[pad].ly = 0x80;
+ m_internal_analog_joy[pad].rx = 0x80;
+ m_internal_analog_joy[pad].ry = 0x80;
+ }
+}
+
+void KeyStatus::press(u32 pad, u32 index, s32 value)
+{
+ if (!IsAnalogKey(index)) {
+ if (m_state_acces[pad])
+ clear_bit(m_internal_button_kbd[pad], index);
+ else
+ clear_bit(m_internal_button_joy[pad], index);
+ } else {
+ // clamp value
+ if (value > MAX_ANALOG_VALUE)
+ value = MAX_ANALOG_VALUE;
+ else if (value < -MAX_ANALOG_VALUE)
+ value = -MAX_ANALOG_VALUE;
+
+ // Left -> -- -> Right
+ // Value range : FFFF8002 -> 0 -> 7FFE
+ // Force range : 80 -> 0 -> 7F
+ // Normal mode : expect value 0 -> 80 -> FF
+ // Reverse mode: expect value FF -> 7F -> 0
+ u8 force = (value / 256);
+ if (analog_is_reversed(index)) analog_set(pad, index, 0x7F - force);
+ else analog_set(pad, index, 0x80 + force);
+ }
+}
+
+void KeyStatus::release(u32 pad, u32 index)
+{
+ if (!IsAnalogKey(index)) {
+ if (m_state_acces[pad])
+ set_bit(m_internal_button_kbd[pad], index);
+ else
+ set_bit(m_internal_button_joy[pad], index);
+ } else {
+ analog_set(pad, index, 0x80);
+ }
+}
+
+u16 KeyStatus::get(u32 pad)
+{
+ return m_button[pad];
+}
+
+void KeyStatus::set_pressure(u32 pad, u32 index, u32 value)
+{
+ m_internal_button_pressure[pad][index] = value;
+}
+
+u8 KeyStatus::get_pressure(u32 pad, u32 index)
+{
+ return m_button_pressure[pad][index];
+}
+
+void KeyStatus::analog_set(u32 pad, u32 index, u8 value)
+{
+ PADAnalog* m_internal_analog_ref;
+ if (m_state_acces[pad])
+ m_internal_analog_ref = &m_internal_analog_kbd[pad];
+ else
+ m_internal_analog_ref = &m_internal_analog_joy[pad];
+
+ switch (index)
+ {
+ case PAD_R_LEFT:
+ case PAD_R_RIGHT: m_internal_analog_ref->rx = value; break;
+
+ case PAD_R_DOWN:
+ case PAD_R_UP: m_internal_analog_ref->ry = value; break;
+
+ case PAD_L_LEFT:
+ case PAD_L_RIGHT: m_internal_analog_ref->lx = value; break;
+
+ case PAD_L_DOWN:
+ case PAD_L_UP: m_internal_analog_ref->ly = value; break;
+
+ default: break;
+ }
+}
+
+bool KeyStatus::analog_is_reversed(u32 index)
+{
+ switch (index)
+ {
+ case PAD_L_RIGHT:
+ case PAD_L_LEFT:
+ return ((conf->options & PADOPTION_REVERSELX) != 0);
+
+ case PAD_R_LEFT:
+ case PAD_R_RIGHT:
+ return ((conf->options & PADOPTION_REVERSERX) != 0);
+
+ case PAD_L_UP:
+ case PAD_L_DOWN:
+ return ((conf->options & PADOPTION_REVERSELY) != 0);
+
+ case PAD_R_DOWN:
+ case PAD_R_UP:
+ return ((conf->options & PADOPTION_REVERSERY) != 0);
+
+ default: return false;
+ }
+}
+
+u8 KeyStatus::analog_get(u32 pad, u32 index)
+{
+ switch (index)
+ {
+ case PAD_R_LEFT:
+ case PAD_R_RIGHT: return analog[pad].rx;
+
+ case PAD_R_DOWN:
+ case PAD_R_UP: return analog[pad].ry;
+
+ case PAD_L_LEFT:
+ case PAD_L_RIGHT: return analog[pad].lx;
+
+ case PAD_L_DOWN:
+ case PAD_L_UP: return analog[pad].ly;
+
+ default: return 0;
+ }
+}
+
+u8 KeyStatus::analog_merge(u8 kbd, u8 joy)
+{
+ if (kbd != 0x80)
+ return kbd;
+ else
+ return joy;
+}
+
+void KeyStatus::commit_status(u32 pad)
+{
+ m_button[pad] = m_internal_button_kbd[pad] & m_internal_button_joy[pad];
+
+ for (int index = 0; index < MAX_KEYS; index++)
+ m_button_pressure[pad][index] = m_internal_button_pressure[pad][index];
+
+ analog[pad].lx = analog_merge(m_internal_analog_kbd[pad].lx, m_internal_analog_joy[pad].lx);
+ analog[pad].ly = analog_merge(m_internal_analog_kbd[pad].ly, m_internal_analog_joy[pad].ly);
+ analog[pad].rx = analog_merge(m_internal_analog_kbd[pad].rx, m_internal_analog_joy[pad].rx);
+ analog[pad].ry = analog_merge(m_internal_analog_kbd[pad].ry, m_internal_analog_joy[pad].ry);
+}
diff --git a/plugins/onepad/KeyStatus.h b/plugins/onepad/KeyStatus.h
new file mode 100644
index 0000000000..21392e6169
--- /dev/null
+++ b/plugins/onepad/KeyStatus.h
@@ -0,0 +1,76 @@
+/* OnePAD - author: arcum42(@gmail.com)
+ * Copyright (C) 2011
+ *
+ * Based on ZeroPAD, author zerofrog@gmail.com
+ * Copyright (C) 2006-2007
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __KEYSTATUS_H__
+#define __KEYSTATUS_H__
+
+#include "onepad.h"
+
+typedef struct
+{
+ u8 lx, ly;
+ u8 rx, ry;
+} PADAnalog;
+
+#define MAX_ANALOG_VALUE 32766
+
+class KeyStatus
+{
+ private:
+ u16 m_button[2];
+ u16 m_internal_button_kbd[2];
+ u16 m_internal_button_joy[2];
+
+ u8 m_button_pressure[2][MAX_KEYS];
+ u8 m_internal_button_pressure[2][MAX_KEYS];
+
+ bool m_state_acces[2];
+
+ PADAnalog analog[2];
+ PADAnalog m_internal_analog_kbd[2];
+ PADAnalog m_internal_analog_joy[2];
+
+ void analog_set(u32 pad, u32 index, u8 value);
+ bool analog_is_reversed(u32 index);
+ u8 analog_merge(u8 kbd, u8 joy);
+
+ public:
+ KeyStatus() { Init(); }
+ void Init();
+
+ void keyboard_state_acces(u32 pad) { m_state_acces[pad] = true; }
+ void joystick_state_acces(u32 pad) { m_state_acces[pad] = false; }
+
+ void press(u32 pad, u32 index, s32 value = 0);
+ void release(u32 pad, u32 index);
+ u16 get(u32 pad);
+
+ void set_pressure(u32 pad, u32 index, u32 value);
+ u8 get_pressure(u32 pad, u32 index);
+
+ u8 analog_get(u32 pad, u32 index);
+
+ void commit_status(u32 pad);
+};
+
+extern KeyStatus* key_status;
+
+#endif
diff --git a/plugins/onepad/Linux/OnePad.cbp b/plugins/onepad/Linux/OnePad.cbp
index 572f4f6e61..7c6a5bd9c6 100644
--- a/plugins/onepad/Linux/OnePad.cbp
+++ b/plugins/onepad/Linux/OnePad.cbp
@@ -57,8 +57,8 @@
-
-
+
+
diff --git a/plugins/onepad/Linux/linux.cpp b/plugins/onepad/Linux/linux.cpp
index bc3b606bac..fda7396eae 100644
--- a/plugins/onepad/Linux/linux.cpp
+++ b/plugins/onepad/Linux/linux.cpp
@@ -87,108 +87,100 @@ void _PADclose()
s_vjoysticks.clear();
}
-static bool used_by_keyboard = false;
-EXPORT_C_(void) PADupdate(int pad)
+void PollForJoystickInput(int cpad)
{
- // FIXME joystick directly update the status variable
- // Keyboard does a nice roadtrip (with semaphore in the middle)
- // s_keyRelease (by UpdateKeys) -> status (by _PADupdate -> by _PADpoll)
- // If we need semaphore, joy part must be updated
+ int joyid = conf->get_joyid(cpad);
+ if (!JoystickIdWithinBounds(joyid)) return;
- // Actually PADupdate is always call with pad == 0. So you need to update both
- // pads -- Gregory
- for (int cpad = 0; cpad < 2; cpad++) {
- int keyPress = 0, keyRelease = 0;
+ SDL_JoystickUpdate();
+ for (int i = 0; i < MAX_KEYS; i++)
+ {
+ JoystickInfo* pjoy = s_vjoysticks[joyid];
- // Poll keyboard.
- PollForX11KeyboardInput(cpad, keyPress, keyRelease, used_by_keyboard);
-
- UpdateKeys(pad, keyPress, keyRelease);
-
- // joystick info
- SDL_JoystickUpdate();
-
- int joyid = conf->get_joyid(cpad);
-
- if (JoystickIdWithinBounds(joyid)) {
- for (int i = 0; i < MAX_KEYS; i++)
- {
- JoystickInfo* pjoy = s_vjoysticks[joyid];
-
- switch (type_of_joykey(cpad, i))
+ switch (type_of_joykey(cpad, i))
+ {
+ case PAD_JOYBUTTONS:
{
- case PAD_JOYBUTTONS:
- {
- int value = SDL_JoystickGetButton((pjoy)->GetJoy(), key_to_button(cpad, i));
- if (value)
- clear_bit(status[cpad], i); // released
- else
- set_bit(status[cpad], i); // pressed
+ int value = SDL_JoystickGetButton((pjoy)->GetJoy(), key_to_button(cpad, i));
+ if (value)
+ key_status->press(cpad, i);
+ else
+ key_status->release(cpad, i);
- break;
- }
- case PAD_HAT:
- {
- int value = SDL_JoystickGetHat((pjoy)->GetJoy(), key_to_axis(cpad, i));
+ break;
+ }
+ case PAD_HAT:
+ {
+ int value = SDL_JoystickGetHat((pjoy)->GetJoy(), key_to_axis(cpad, i));
- // key_to_hat_dir and value are a 4 bits bitmap, one for each directions. Only 1 bit can be high for
- // key_to_hat_dir. Value handles diagonal too (2 bits) so you must check the intersection
- // '&' not only equality '=='. -- Gregory
- if (key_to_hat_dir(cpad, i) & value)
- clear_bit(status[cpad], i);
- else
- set_bit(status[cpad], i);
+ // key_to_hat_dir and SDL_JoystickGetHat are a 4 bits bitmap, one for each directions. Only 1 bit can be high for
+ // key_to_hat_dir. SDL_JoystickGetHat handles diagonal too (2 bits) so you must check the intersection
+ // '&' not only equality '=='. -- Gregory
+ if (key_to_hat_dir(cpad, i) & value)
+ key_status->press(cpad, i);
+ else
+ key_status->release(cpad, i);
- break;
- }
- case PAD_AXIS:
- {
- int value = pjoy->GetAxisFromKey(cpad, i);
- bool sign = key_to_axis_sign(cpad, i);
- bool full_axis = key_to_axis_type(cpad, i);
+ break;
+ }
+ case PAD_AXIS:
+ {
+ int value = pjoy->GetAxisFromKey(cpad, i);
+ bool sign = key_to_axis_sign(cpad, i);
+ bool full_axis = key_to_axis_type(cpad, i);
- if (IsAnalogKey(i)) {
- if (abs(value) > (pjoy)->GetDeadzone())
- Analog::ConfigurePad(cpad, i, value);
- else if (! (conf->options & ((PADOPTION_MOUSE_R|PADOPTION_MOUSE_L) << 16 * cpad ))
- && !(used_by_keyboard) )
- // There is a conflict between keyboard/mouse and joystick configuration.
- // Do nothing when either the mouse or the keyboad is pressed/enabled.
- // It avoid to be stuck in reset mode --Gregory
- Analog::ResetPad(cpad, i);
+ if (IsAnalogKey(i)) {
+ if (abs(value) > pjoy->GetDeadzone())
+ key_status->press(cpad, i, value);
+ else
+ key_status->release(cpad, i);
+ } else {
+ if (full_axis) {
+ value += 0x8000;
+ if (value > pjoy->GetDeadzone()) {
+ key_status->press(cpad, i);
+ key_status->set_pressure(cpad, i, min(value/256 , 0xFF));
} else {
- if (full_axis) {
- value += 0x8000;
- if (value > 2048) {
- clear_bit(status[cpad], i);
- status_pressure[cpad][i] = min(value/256 , 0xFF); // Max pressure is 255
- } else {
- set_bit(status[cpad], i);
- status_pressure[cpad][i] = 0; // no pressure
- }
- } else {
- if (sign && (value < -2048)) {
- clear_bit(status[cpad], i);
- status_pressure[cpad][i] = min(-value /128, 0xFF); // Max pressure is 255
- } else if (!sign && (value > 2048)) {
- clear_bit(status[cpad], i);
- status_pressure[cpad][i] = min(value /128, 0xFF); // Max pressure is 255
- } else {
- set_bit(status[cpad], i);
- status_pressure[cpad][i] = 0; // no pressure
- }
- }
+ key_status->release(cpad, i);
+ }
+
+ } else {
+ if (sign && (-value > pjoy->GetDeadzone())) {
+ key_status->press(cpad, i);
+ key_status->set_pressure(cpad, i, min(-value /128, 0xFF));
+ } else if (!sign && (value > pjoy->GetDeadzone())) {
+ key_status->press(cpad, i);
+ key_status->set_pressure(cpad, i, min(value /128, 0xFF));
+ } else {
+ key_status->release(cpad, i);
}
}
- default: break;
+ }
}
- }
+ default: break;
}
}
}
+EXPORT_C_(void) PADupdate(int pad)
+{
+ // Actually PADupdate is always call with pad == 0. So you need to update both
+ // pads -- Gregory
+ for (int cpad = 0; cpad < 2; cpad++) {
+ // Poll keyboard/mouse event
+ key_status->keyboard_state_acces(cpad);
+ PollForX11KeyboardInput(cpad);
+
+ // Get joystick state
+ key_status->joystick_state_acces(cpad);
+ PollForJoystickInput(cpad);
+
+ key_status->commit_status(cpad);
+ }
+}
+
EXPORT_C_(void) PADconfigure()
{
LoadConfig();
diff --git a/plugins/onepad/analog.cpp b/plugins/onepad/analog.cpp
deleted file mode 100644
index fed4673f80..0000000000
--- a/plugins/onepad/analog.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-/* OnePAD - author: arcum42(@gmail.com)
- * Copyright (C) 2009
- *
- * Based on ZeroPAD, author zerofrog@gmail.com
- * Copyright (C) 2006-2007
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "analog.h"
-static PADAnalog g_lanalog[NUM_OF_PADS], g_ranalog[NUM_OF_PADS];
-
-namespace Analog
-{
- u8 Pad(int pad, u8 index)
- {
- switch (index)
- {
- case PAD_R_LEFT:
- case PAD_R_RIGHT: return g_ranalog[pad].x;
-
- case PAD_R_DOWN:
- case PAD_R_UP: return g_ranalog[pad].y;
-
- case PAD_L_LEFT:
- case PAD_L_RIGHT: return g_lanalog[pad].x;
-
- case PAD_L_DOWN:
- case PAD_L_UP: return g_lanalog[pad].y;
-
- default: return 0;
- }
- }
-
- static void SetPad(u8 pad, int index, u8 value)
- {
- switch (index)
- {
- case PAD_R_LEFT:
- case PAD_R_RIGHT: g_ranalog[pad].x = value; break;
-
- case PAD_R_DOWN:
- case PAD_R_UP: g_ranalog[pad].y = value; break;
-
- case PAD_L_LEFT:
- case PAD_L_RIGHT: g_lanalog[pad].x = value; break;
-
- case PAD_L_DOWN:
- case PAD_L_UP: g_lanalog[pad].y = value; break;
-
- default: break;
- }
- }
-
- void ResetPad( u8 pad, int key)
- {
- SetPad(pad, key, 0x80);
- }
-
- void Init()
- {
- for (u8 pad = 0; pad < 2; ++pad)
- {
- // no need to put the 2 part of the axis
- ResetPad(pad, PAD_R_LEFT);
- ResetPad(pad, PAD_R_DOWN);
- ResetPad(pad, PAD_L_LEFT);
- ResetPad(pad, PAD_L_DOWN);
- }
- }
-
- static bool ReversePad(u8 index)
- {
- switch (index)
- {
- case PAD_L_RIGHT:
- case PAD_L_LEFT:
- return ((conf->options & PADOPTION_REVERSELX) != 0);
-
- case PAD_R_LEFT:
- case PAD_R_RIGHT:
- return ((conf->options & PADOPTION_REVERSERX) != 0);
-
- case PAD_L_UP:
- case PAD_L_DOWN:
- return ((conf->options & PADOPTION_REVERSELY) != 0);
-
- case PAD_R_DOWN:
- case PAD_R_UP:
- return ((conf->options & PADOPTION_REVERSERY) != 0);
-
- default: return false;
- }
- }
-
- void ConfigurePad( u8 pad, int index, int value)
- {
- // Left -> -- -> Right
- // Value range : FFFF8002 -> 0 -> 7FFE
- // Force range : 80 -> 0 -> 7F
- // Normal mode : expect value 0 -> 80 -> FF
- // Reverse mode: expect value FF -> 7F -> 0
- u8 force = (value / 256);
- if (ReversePad(index)) SetPad(pad, index, 0x7F - force);
- else SetPad(pad, index, 0x80 + force);
- }
-}
diff --git a/plugins/onepad/analog.h b/plugins/onepad/analog.h
deleted file mode 100644
index 0810de8b3f..0000000000
--- a/plugins/onepad/analog.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* OnePAD - author: arcum42(@gmail.com)
- * Copyright (C) 2009
- *
- * Based on ZeroPAD, author zerofrog@gmail.com
- * Copyright (C) 2006-2007
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#define NUM_OF_PADS 2
-
-#include "onepad.h"
-
-namespace Analog
-{
- extern void Init();
- extern u8 Pad(int pad, u8 index);
- extern void ResetPad( u8 pad, int key);
- extern void ConfigurePad( u8 pad, int index, int value);
-}
diff --git a/plugins/onepad/controller.h b/plugins/onepad/controller.h
index b78f16b018..fbbdd20324 100644
--- a/plugins/onepad/controller.h
+++ b/plugins/onepad/controller.h
@@ -136,9 +136,4 @@ struct PADconf
}
};
extern PADconf *conf;
-
-typedef struct
-{
- u8 x, y;
-} PADAnalog;
#endif
diff --git a/plugins/onepad/keyboard.cpp b/plugins/onepad/keyboard.cpp
index d36a398ba0..25631933a9 100644
--- a/plugins/onepad/keyboard.cpp
+++ b/plugins/onepad/keyboard.cpp
@@ -56,10 +56,10 @@ static bool s_grab_input = false;
static bool s_Shift = false;
static unsigned int s_previous_mouse_x = 0;
static unsigned int s_previous_mouse_y = 0;
-void AnalyzeKeyEvent(int pad, keyEvent &evt, int& keyPress, int& keyRelease, bool& used_by_keyboard)
+void AnalyzeKeyEvent(int pad, keyEvent &evt)
{
- int i;
KeySym key = (KeySym)evt.key;
+ int index = get_keyboard_key(pad, key);
switch (evt.evt)
{
@@ -82,36 +82,28 @@ void AnalyzeKeyEvent(int pad, keyEvent &evt, int& keyPress, int& keyRelease, boo
}
}
- i = get_keyboard_key(pad, key);
-
// Analog controls.
- if (IsAnalogKey(i))
+ if (IsAnalogKey(index))
{
- used_by_keyboard = true; // avoid the joystick to reset the analog pad...
- switch (i)
+ switch (index)
{
case PAD_R_LEFT:
case PAD_R_UP:
case PAD_L_LEFT:
case PAD_L_UP:
- Analog::ConfigurePad(pad, i, -DEF_VALUE);
+ key_status->press(pad, index, -MAX_ANALOG_VALUE);
break;
case PAD_R_RIGHT:
case PAD_R_DOWN:
case PAD_L_RIGHT:
case PAD_L_DOWN:
- Analog::ConfigurePad(pad, i, DEF_VALUE);
+ key_status->press(pad, index, MAX_ANALOG_VALUE);
break;
}
- i += 0xff00;
- }
+ } else if (index != -1)
+ key_status->press(pad, index);
- if (i != -1)
- {
- clear_bit(keyRelease, i);
- set_bit(keyPress, i);
- }
- //PAD_LOG("Key pressed:%d\n", i);
+ //PAD_LOG("Key pressed:%d\n", index);
event.evt = KEYPRESS;
event.key = key;
@@ -120,21 +112,8 @@ void AnalyzeKeyEvent(int pad, keyEvent &evt, int& keyPress, int& keyRelease, boo
case KeyRelease:
if (key == XK_Shift_R || key == XK_Shift_L) s_Shift = false;
- i = get_keyboard_key(pad, key);
-
- // Analog Controls.
- if (IsAnalogKey(i))
- {
- used_by_keyboard = false; // allow the joystick to reset the analog pad...
- Analog::ResetPad(pad, i);
- i += 0xff00;
- }
-
- if (i != -1)
- {
- clear_bit(keyPress, i);
- set_bit(keyRelease, i);
- }
+ if (index != -1)
+ key_status->release(pad, index);
event.evt = KEYRELEASE;
event.key = key;
@@ -149,21 +128,13 @@ void AnalyzeKeyEvent(int pad, keyEvent &evt, int& keyPress, int& keyRelease, boo
break;
case ButtonPress:
- i = get_keyboard_key(pad, evt.key);
- if (i != -1)
- {
- clear_bit(keyRelease, i);
- set_bit(keyPress, i);
- }
+ if (index != -1)
+ key_status->press(pad, index);
break;
case ButtonRelease:
- i = get_keyboard_key(pad, evt.key);
- if (i != -1)
- {
- clear_bit(keyPress, i);
- set_bit(keyRelease, i);
- }
+ if (index != -1)
+ key_status->release(pad, index);
break;
case MotionNotify:
@@ -185,34 +156,32 @@ void AnalyzeKeyEvent(int pad, keyEvent &evt, int& keyPress, int& keyRelease, boo
unsigned x = evt.key & 0xFFFF;
unsigned int value = abs(s_previous_mouse_x - x) * conf->sensibility;
- value = max(value, (unsigned int)DEF_VALUE);
if (x == 0)
- Analog::ConfigurePad(pad, pad_x, -DEF_VALUE);
+ key_status->press(pad, pad_x, -MAX_ANALOG_VALUE);
else if (x == 0xFFFF)
- Analog::ConfigurePad(pad, pad_x, DEF_VALUE);
+ key_status->press(pad, pad_x, MAX_ANALOG_VALUE);
else if (x < (s_previous_mouse_x -2))
- Analog::ConfigurePad(pad, pad_x, -value);
+ key_status->press(pad, pad_x, -value);
else if (x > (s_previous_mouse_x +2))
- Analog::ConfigurePad(pad, pad_x, value);
+ key_status->press(pad, pad_x, value);
else
- Analog::ResetPad(pad, pad_x);
+ key_status->release(pad, pad_x);
unsigned y = evt.key >> 16;
value = abs(s_previous_mouse_y - y) * conf->sensibility;
- value = max(value, (unsigned int)DEF_VALUE);
if (y == 0)
- Analog::ConfigurePad(pad, pad_y, -DEF_VALUE);
+ key_status->press(pad, pad_y, -MAX_ANALOG_VALUE);
else if (y == 0xFFFF)
- Analog::ConfigurePad(pad, pad_y, DEF_VALUE);
+ key_status->press(pad, pad_y, MAX_ANALOG_VALUE);
else if (y < (s_previous_mouse_y -2))
- Analog::ConfigurePad(pad, pad_y, -value);
+ key_status->press(pad, pad_y, -value);
else if (y > (s_previous_mouse_y +2))
- Analog::ConfigurePad(pad, pad_y, value);
+ key_status->press(pad, pad_y, value);
else
- Analog::ResetPad(pad, pad_y);
+ key_status->release(pad, pad_y);
s_previous_mouse_x = x;
s_previous_mouse_y = y;
@@ -222,7 +191,7 @@ void AnalyzeKeyEvent(int pad, keyEvent &evt, int& keyPress, int& keyRelease, boo
}
}
-void PollForX11KeyboardInput(int pad, int& keyPress, int& keyRelease, bool& used_by_keyboard)
+void PollForX11KeyboardInput(int pad)
{
keyEvent evt;
XEvent E;
@@ -230,10 +199,10 @@ void PollForX11KeyboardInput(int pad, int& keyPress, int& keyRelease, bool& used
// Keyboard input send by PCSX2
while (!ev_fifo.empty()) {
- AnalyzeKeyEvent(pad, ev_fifo.front(), keyPress, keyRelease, used_by_keyboard);
- pthread_mutex_lock(&mutex_KeyEvent);
+ AnalyzeKeyEvent(pad, ev_fifo.front());
+ pthread_spin_lock(&mutex_KeyEvent);
ev_fifo.pop();
- pthread_mutex_unlock(&mutex_KeyEvent);
+ pthread_spin_unlock(&mutex_KeyEvent);
}
// keyboard input
@@ -251,7 +220,7 @@ void PollForX11KeyboardInput(int pad, int& keyPress, int& keyRelease, bool& used
case ButtonPress: evt.key = BE->button; break;
default: break;
}
- AnalyzeKeyEvent(pad, evt, keyPress, keyRelease, used_by_keyboard);
+ AnalyzeKeyEvent(pad, evt);
}
}
diff --git a/plugins/onepad/keyboard.h b/plugins/onepad/keyboard.h
index 6cc9466bc6..9f3eea2253 100644
--- a/plugins/onepad/keyboard.h
+++ b/plugins/onepad/keyboard.h
@@ -29,7 +29,7 @@
#include "Linux/linux.h"
extern Display *GSdsp;
-extern void PollForX11KeyboardInput(int pad, int& keyPress, int& keyRelease, bool& used_by_keyboard);
+extern void PollForX11KeyboardInput(int pad);
extern bool PollX11KeyboardMouseEvent(u32 &pkey);
extern Window GSwin;
diff --git a/plugins/onepad/onepad.cpp b/plugins/onepad/onepad.cpp
index ac3121fa60..1a6468fee2 100644
--- a/plugins/onepad/onepad.cpp
+++ b/plugins/onepad/onepad.cpp
@@ -39,8 +39,6 @@ char libraryName[256];
keyEvent event;
-u16 status[2];
-int status_pressure[2][MAX_KEYS];
static keyEvent s_event;
std::string s_strIniPath("inis/");
std::string s_strLogPath("logs/");
@@ -52,7 +50,6 @@ const u32 build = 1; // increase that with each version
int PadEnum[2][2] = {{0, 2}, {1, 3}};
-u32 pads = 0;
u8 stdpar[2][20] = {
{0xff, 0x5a, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -123,9 +120,8 @@ int curPad, curByte, curCmd, cmdLen;
int ds2mode = 0; // DS Mode at start
FILE *padLog = NULL;
-pthread_spinlock_t s_mutexStatus;
-pthread_mutex_t mutex_KeyEvent;
-static u32 s_keyPress[2], s_keyRelease[2];
+pthread_spinlock_t mutex_KeyEvent;
+KeyStatus* key_status = NULL;
queue ev_fifo;
@@ -257,19 +253,12 @@ EXPORT_C_(s32) PADinit(u32 flags)
{
initLogging();
- pads |= flags;
- for (int i = 0 ; i < 2 ; i++) {
- status[i] = 0xffff;
- for (int j = 0 ; j < MAX_KEYS ; j++)
- status_pressure[i][j] = 255;
- }
-
LoadConfig();
PADsetMode(0, 0);
PADsetMode(1, 0);
- Analog::Init();
+ key_status = new KeyStatus();
return 0;
}
@@ -278,17 +267,16 @@ EXPORT_C_(void) PADshutdown()
{
CloseLogging();
if (conf) delete conf;
+ if (key_status) delete key_status;
}
EXPORT_C_(s32) PADopen(void *pDsp)
{
memset(&event, 0, sizeof(event));
+ key_status->Init();
while (!ev_fifo.empty()) ev_fifo.pop();
- pthread_spin_init(&s_mutexStatus, PTHREAD_PROCESS_PRIVATE);
- pthread_mutex_init(&mutex_KeyEvent, NULL);
- s_keyPress[0] = s_keyPress[1] = 0;
- s_keyRelease[0] = s_keyRelease[1] = 0;
+ pthread_spin_init(&mutex_KeyEvent, PTHREAD_PROCESS_PRIVATE);
#ifdef __LINUX__
JoystickInfo::EnumerateJoysticks(s_vjoysticks);
@@ -315,31 +303,10 @@ EXPORT_C_(void) PADsetLogDir(const char* dir)
EXPORT_C_(void) PADclose()
{
while (!ev_fifo.empty()) ev_fifo.pop();
- pthread_spin_destroy(&s_mutexStatus);
- pthread_mutex_destroy(&mutex_KeyEvent);
+ pthread_spin_destroy(&mutex_KeyEvent);
_PADclose();
}
-void _PADupdate(int pad)
-{
- pthread_spin_lock(&s_mutexStatus);
- status[pad] |= s_keyRelease[pad];
- status[pad] &= ~s_keyPress[pad];
- s_keyRelease[pad] = 0;
- s_keyPress[pad] = 0;
- pthread_spin_unlock(&s_mutexStatus);
-}
-
-void UpdateKeys(int pad, int keyPress, int keyRelease)
-{
- pthread_spin_lock(&s_mutexStatus);
- s_keyPress[pad] |= keyPress;
- s_keyPress[pad] &= ~keyRelease;
- s_keyRelease[pad] |= keyRelease;
- s_keyRelease[pad] &= ~keyPress;
- pthread_spin_unlock(&s_mutexStatus);
-}
-
EXPORT_C_(u32) PADquery()
{
return 3; // both
@@ -420,14 +387,12 @@ u8 _PADpoll(u8 value)
case CMD_READ_DATA_AND_VIBRATE: // READ_DATA
- _PADupdate(curPad);
-
- stdpar[curPad][2] = status[curPad] >> 8;
- stdpar[curPad][3] = status[curPad] & 0xff;
- stdpar[curPad][4] = Analog::Pad(curPad, PAD_R_RIGHT);
- stdpar[curPad][5] = Analog::Pad(curPad, PAD_R_UP);
- stdpar[curPad][6] = Analog::Pad(curPad, PAD_L_RIGHT);
- stdpar[curPad][7] = Analog::Pad(curPad, PAD_L_UP);
+ stdpar[curPad][2] = key_status->get(curPad) >> 8;
+ stdpar[curPad][3] = key_status->get(curPad) & 0xff;
+ stdpar[curPad][4] = key_status->analog_get(curPad, PAD_R_RIGHT);
+ stdpar[curPad][5] = key_status->analog_get(curPad, PAD_R_UP);
+ stdpar[curPad][6] = key_status->analog_get(curPad, PAD_L_RIGHT);
+ stdpar[curPad][7] = key_status->analog_get(curPad, PAD_L_UP);
if (padMode[curPad] == 1)
cmdLen = 20;
@@ -438,35 +403,35 @@ u8 _PADpoll(u8 value)
switch (stdpar[curPad][3])
{
case 0xBF: // X
- stdpar[curPad][14] = status_pressure[curPad][PAD_CROSS];
+ stdpar[curPad][14] = key_status->get_pressure(curPad, PAD_CROSS);
break;
case 0xDF: // Circle
- stdpar[curPad][13] = status_pressure[curPad][PAD_CIRCLE];
+ stdpar[curPad][13] = key_status->get_pressure(curPad, PAD_CIRCLE);
break;
case 0xEF: // Triangle
- stdpar[curPad][12] = status_pressure[curPad][PAD_TRIANGLE];
+ stdpar[curPad][12] = key_status->get_pressure(curPad, PAD_TRIANGLE);
break;
case 0x7F: // Square
- stdpar[curPad][15] = status_pressure[curPad][PAD_SQUARE];
+ stdpar[curPad][15] = key_status->get_pressure(curPad, PAD_SQUARE);
break;
case 0xFB: // L1
- stdpar[curPad][16] = status_pressure[curPad][PAD_L1];
+ stdpar[curPad][16] = key_status->get_pressure(curPad, PAD_L1);
break;
case 0xF7: // R1
- stdpar[curPad][17] = status_pressure[curPad][PAD_R1];
+ stdpar[curPad][17] = key_status->get_pressure(curPad, PAD_R1);
break;
case 0xFE: // L2
- stdpar[curPad][18] = status_pressure[curPad][PAD_L2];
+ stdpar[curPad][18] = key_status->get_pressure(curPad, PAD_L2);
break;
case 0xFD: // R2
- stdpar[curPad][19] = status_pressure[curPad][PAD_R2];
+ stdpar[curPad][19] = key_status->get_pressure(curPad, PAD_R2);
break;
default:
@@ -483,19 +448,19 @@ u8 _PADpoll(u8 value)
switch (button_check)
{
case 0xE: // UP
- stdpar[curPad][10] = status_pressure[curPad][PAD_UP];
+ stdpar[curPad][10] = key_status->get_pressure(curPad, PAD_UP);
break;
case 0xB: // DOWN
- stdpar[curPad][11] =status_pressure[curPad][PAD_DOWN];
+ stdpar[curPad][11] =key_status->get_pressure(curPad, PAD_DOWN);
break;
case 0x7: // LEFT
- stdpar[curPad][9] = status_pressure[curPad][PAD_LEFT];
+ stdpar[curPad][9] = key_status->get_pressure(curPad, PAD_LEFT);
break;
case 0xD: // RIGHT
- stdpar[curPad][8] = status_pressure[curPad][PAD_RIGHT];
+ stdpar[curPad][8] = key_status->get_pressure(curPad, PAD_RIGHT);
break;
default:
@@ -701,8 +666,8 @@ EXPORT_C_(keyEvent*) PADkeyEvent()
#ifdef __LINUX__
EXPORT_C_(void) PADWriteEvent(keyEvent &evt)
{
- pthread_mutex_lock(&mutex_KeyEvent);
+ pthread_spin_lock(&mutex_KeyEvent);
ev_fifo.push(evt);
- pthread_mutex_unlock(&mutex_KeyEvent);
+ pthread_spin_unlock(&mutex_KeyEvent);
}
#endif
diff --git a/plugins/onepad/onepad.h b/plugins/onepad/onepad.h
index 4ac1a5469a..916415bc73 100644
--- a/plugins/onepad/onepad.h
+++ b/plugins/onepad/onepad.h
@@ -50,9 +50,9 @@ using namespace std;
#ifdef __LINUX__
#include "joystick.h"
#endif
-#include "analog.h"
#include "bitwise.h"
#include "controller.h"
+#include "KeyStatus.h"
#ifdef _MSC_VER
#define EXPORT_C_(type) extern "C" __declspec(dllexport) type CALLBACK
@@ -124,31 +124,14 @@ enum gamePadValues
PAD_R_LEFT
};
-// Activate bolche's analog controls hack
-// DEF_VALUE is the strength you press the control.
-// Code taken from http://forums.pcsx2.net/thread-4699.html
-
-#define DEF_VALUE 32766
-
-/* end of pad.h */
-
extern keyEvent event;
-
extern queue ev_fifo;
-extern pthread_mutex_t mutex_KeyEvent;
-
-extern u16 status[2];
-extern int status_pressure[2][MAX_KEYS];
-extern u32 pads;
+extern pthread_spinlock_t mutex_KeyEvent;
void clearPAD(int pad);
-int POV(u32 direction, u32 angle);
s32 _PADopen(void *pDsp);
void _PADclose();
-void _KeyPress(int pad, u32 key);
-void _KeyRelease(int pad, u32 key);
void PADsetMode(int pad, int mode);
-void _PADupdate(int pad);
void __Log(const char *fmt, ...);
void __LogToConsole(const char *fmt, ...);
@@ -156,7 +139,5 @@ void LoadConfig();
void SaveConfig();
void SysMessage(char *fmt, ...);
-void UpdateKeys(int pad, int keyPress, int keyRelease);
-
#endif
diff --git a/plugins/spu2-x/src/CMakeLists.txt b/plugins/spu2-x/src/CMakeLists.txt
index 483c19a4ed..f2e54569cb 100644
--- a/plugins/spu2-x/src/CMakeLists.txt
+++ b/plugins/spu2-x/src/CMakeLists.txt
@@ -7,7 +7,7 @@ endif(NOT TOP_CMAKE_WAS_SOURCED)
# plugin name
-set(Output spu2x-1.5.0)
+set(Output spu2x-2.0.0)
set(CommonFlags
-fvisibility=hidden
@@ -113,7 +113,7 @@ set_target_properties(${Output} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin/plugins)
# link target with project internal libraries
-target_link_libraries(${Output} Utilities x86emitter Utilities)
+target_link_libraries(${Output} Utilities Utilities)
# link target with ALSA
target_link_libraries(${Output} ${ALSA_LIBRARIES})