+
+void MainWin::keyPressEvent(QKeyEvent * e)
+{
+ // From jaguar.cpp
+ extern bool startM68KTracing;
+ // From joystick.cpp
+ extern int blit_start_log;
+ // From blitter.cpp
+ extern bool startConciseBlitLogging;
+
+
+ // We ignore the Alt key for now, since it causes problems with the GUI
+ if (e->key() == Qt::Key_Alt)
+ {
+ e->accept();
+ return;
+ }
+ else if (e->key() == Qt::Key_F11)
+ {
+ startM68KTracing = true;
+ e->accept();
+ return;
+ }
+ else if (e->key() == Qt::Key_F12)
+ {
+ blit_start_log = true;
+ e->accept();
+ return;
+ }
+ else if (e->key() == Qt::Key_F10)
+ {
+ startConciseBlitLogging = true;
+ e->accept();
+ return;
+ }
+
+/*
+This is done now by a QAction...
+ if (e->key() == Qt::Key_F9)
+ {
+ ToggleFullScreen();
+ return;
+ }
+*/
+ HandleKeys(e, true);
+}
+
+
+void MainWin::keyReleaseEvent(QKeyEvent * e)
+{
+ // We ignore the Alt key for now, since it causes problems with the GUI
+ if (e->key() == Qt::Key_Alt)
+ {
+ e->accept();
+ return;
+ }
+
+ HandleKeys(e, false);
+}
+
+
+void MainWin::HandleKeys(QKeyEvent * e, bool state)
+{
+ enum { P1LEFT = 0, P1RIGHT, P1UP, P1DOWN, P2LEFT, P2RIGHT, P2UP, P2DOWN };
+ // We kill bad key combos here, before they can get to the emulator...
+ // This also kills the illegal instruction problem that cropped up in Rayman!
+ // May want to do this by killing the old one instead of ignoring the new one...
+ // Seems to work better that way...
+
+// The problem with this approach is that it causes bad results because it doesn't do
+// any checking of previous states. Need to come up with something better because this
+// causes problems where the keyboard acts as if it were unresponsive. :-P
+#if 0
+ if ((e->key() == vjs.p1KeyBindings[BUTTON_L] && joypad_0_buttons[BUTTON_R])
+ || (e->key() == vjs.p1KeyBindings[BUTTON_R] && joypad_0_buttons[BUTTON_L])
+ || (e->key() == vjs.p1KeyBindings[BUTTON_U] && joypad_0_buttons[BUTTON_D])
+ || (e->key() == vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U]))
+ return;
+#else
+#if 0
+ if (e->key() == (int)vjs.p1KeyBindings[BUTTON_L] && joypad_0_buttons[BUTTON_R])
+ joypad_0_buttons[BUTTON_R] = 0;
+ if (e->key() == (int)vjs.p1KeyBindings[BUTTON_R] && joypad_0_buttons[BUTTON_L])
+ joypad_0_buttons[BUTTON_L] = 0;
+ if (e->key() == (int)vjs.p1KeyBindings[BUTTON_U] && joypad_0_buttons[BUTTON_D])
+ joypad_0_buttons[BUTTON_D] = 0;
+ if (e->key() == (int)vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U])
+ joypad_0_buttons[BUTTON_U] = 0;
+
+ if (e->key() == (int)vjs.p2KeyBindings[BUTTON_L] && joypad_1_buttons[BUTTON_R])
+ joypad_1_buttons[BUTTON_R] = 0;
+ if (e->key() == (int)vjs.p2KeyBindings[BUTTON_R] && joypad_1_buttons[BUTTON_L])
+ joypad_1_buttons[BUTTON_L] = 0;
+ if (e->key() == (int)vjs.p2KeyBindings[BUTTON_U] && joypad_1_buttons[BUTTON_D])
+ joypad_1_buttons[BUTTON_D] = 0;
+ if (e->key() == (int)vjs.p2KeyBindings[BUTTON_D] && joypad_1_buttons[BUTTON_U])
+ joypad_1_buttons[BUTTON_U] = 0;
+#else
+//hrm, this still has sticky state problems... Ugh!
+ // First, settle key states...
+ if (e->key() == (int)vjs.p1KeyBindings[BUTTON_L])
+ keyHeld[P1LEFT] = state;
+ else if (e->key() == (int)vjs.p1KeyBindings[BUTTON_R])
+ keyHeld[P1RIGHT] = state;
+ else if (e->key() == (int)vjs.p1KeyBindings[BUTTON_U])
+ keyHeld[P1UP] = state;
+ else if (e->key() == (int)vjs.p1KeyBindings[BUTTON_D])
+ keyHeld[P1DOWN] = state;
+ else if (e->key() == (int)vjs.p2KeyBindings[BUTTON_L])
+ keyHeld[P2LEFT] = state;
+ else if (e->key() == (int)vjs.p2KeyBindings[BUTTON_R])
+ keyHeld[P2RIGHT] = state;
+ else if (e->key() == (int)vjs.p2KeyBindings[BUTTON_U])
+ keyHeld[P2UP] = state;
+ else if (e->key() == (int)vjs.p2KeyBindings[BUTTON_D])
+ keyHeld[P2DOWN] = state;
+
+ // Next, check for conflicts and bail out if there are any...
+ if ((keyHeld[P1LEFT] && keyHeld[P1RIGHT])
+ || (keyHeld[P1UP] && keyHeld[P1DOWN])
+ || (keyHeld[P2LEFT] && keyHeld[P2RIGHT])
+ || (keyHeld[P2UP] && keyHeld[P2DOWN]))
+ return;
+#endif
+#endif
+
+ // No bad combos exist, let's stuff the emulator key buffers...!
+ for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++)
+ {
+ if (e->key() == (int)vjs.p1KeyBindings[i])
+// joypad_0_buttons[i] = (uint8)state;
+ joypad0Buttons[i] = (state ? 0x01 : 0x00);
+
+// Pad #2 is screwing up pad #1. Prolly a problem in joystick.cpp...
+// So let's try to fix it there. :-P [DONE]
+ if (e->key() == (int)vjs.p2KeyBindings[i])
+// joypad_1_buttons[i] = (uint8)state;
+ joypad1Buttons[i] = (state ? 0x01 : 0x00);
+ }
+}
+
+
+void MainWin::HandleGamepads(void)
+{
+ Gamepad::Update();
+
+ for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++)
+ {
+ if (vjs.p1KeyBindings[i] & (JOY_BUTTON | JOY_HAT | JOY_AXIS))
+ joypad0Buttons[i] = (Gamepad::GetState(0, vjs.p1KeyBindings[i]) ? 0x01 : 0x00);
+/*{
+if (vjs.p1KeyBindings[i] & JOY_AXIS)
+ printf("Axis state (HandleGamepads): %i\n", joypad0Buttons[i]);
+}*/
+ if (vjs.p2KeyBindings[i] & (JOY_BUTTON | JOY_HAT | JOY_AXIS))
+ joypad1Buttons[i] = (Gamepad::GetState(1, vjs.p2KeyBindings[i]) ? 0x01 : 0x00);
+ }
+}
+
+