#include "platform.h"
#include "snes9x.h"
-#include "display.h"
#include "sdlv.h" // Dispatching video-related events
+#if CONF_ZEEMOTE
+#include "zeemote.h"
+#endif
+
struct TouchButton {
unsigned short mask;
unsigned short x, y;
double fw, fh;
};
-#define TOUCH_BUTTON_INITIALIZER(name, x, y, w, h) \
- {SNES_##name##_MASK, 0, 0, 0, 0, x, y, w, h}
-
#define kCornerButtonWidth (0.375)
#define kCornerButtonHeight (0.0833333333334)
#define kBigButtonWidth (0.125)
#define kBigButtonHeight (0.2777777777778)
static TouchButton touchbuttons[] = {
- TOUCH_BUTTON_INITIALIZER(TL, 0.0, 0.0, kCornerButtonWidth, kCornerButtonHeight),
- TOUCH_BUTTON_INITIALIZER(TR, 0.625, 0.0, kCornerButtonWidth, kCornerButtonHeight),
- TOUCH_BUTTON_INITIALIZER(UP, kBigButtonWidth, kCornerButtonHeight, kBigButtonWidth, kBigButtonHeight),
- TOUCH_BUTTON_INITIALIZER(LEFT, 0.0, kCornerButtonHeight + kBigButtonHeight, kBigButtonWidth, kBigButtonHeight),
- TOUCH_BUTTON_INITIALIZER(RIGHT, 2.0 * kBigButtonWidth, kCornerButtonHeight + kBigButtonHeight, kBigButtonWidth, kBigButtonHeight),
- TOUCH_BUTTON_INITIALIZER(DOWN, kBigButtonWidth, 1.0 - (kCornerButtonHeight + kBigButtonHeight), kBigButtonWidth, kBigButtonHeight),
- TOUCH_BUTTON_INITIALIZER(SELECT, 0.0, 1.0 - kCornerButtonHeight, kCornerButtonWidth, kCornerButtonHeight),
- TOUCH_BUTTON_INITIALIZER(X, 1.0 - 2.0 * kBigButtonWidth, kCornerButtonHeight, kBigButtonWidth, kBigButtonHeight),
- TOUCH_BUTTON_INITIALIZER(Y, 1.0 - 3.0 * kBigButtonWidth, kCornerButtonHeight + kBigButtonHeight, kBigButtonWidth, kBigButtonHeight),
- TOUCH_BUTTON_INITIALIZER(A, 1.0 - kBigButtonWidth, kCornerButtonHeight + kBigButtonHeight, kBigButtonWidth, kBigButtonHeight),
- TOUCH_BUTTON_INITIALIZER(B, 1.0 - 2.0 * kBigButtonWidth, 1.0 - (kCornerButtonHeight + kBigButtonHeight), kBigButtonWidth, kBigButtonHeight),
- TOUCH_BUTTON_INITIALIZER(START, 1.0 - kCornerButtonWidth, 1.0 - kCornerButtonHeight, kCornerButtonWidth, kCornerButtonHeight),
+#define TB(actions, x, y, w, h) \
+ {actions, 0, 0, 0, 0, x, y, w, h}
+#define P(x) SNES_##x##_MASK
+ TB(P(TL), 0.0, 0.0, kCornerButtonWidth, kCornerButtonHeight),
+ TB(P(TR), 0.625, 0.0, kCornerButtonWidth, kCornerButtonHeight),
+ TB(P(LEFT) | P(UP), 0.0, kCornerButtonHeight, kBigButtonWidth, kBigButtonHeight),
+ TB(P(UP), kBigButtonWidth, kCornerButtonHeight, kBigButtonWidth, kBigButtonHeight),
+ TB(P(RIGHT) | P(UP), 2.0 * kBigButtonWidth, kCornerButtonHeight, kBigButtonWidth, kBigButtonHeight),
+ TB(P(LEFT), 0.0, kCornerButtonHeight + kBigButtonHeight, kBigButtonWidth, kBigButtonHeight),
+ TB(P(RIGHT), 2.0 * kBigButtonWidth, kCornerButtonHeight + kBigButtonHeight, kBigButtonWidth, kBigButtonHeight),
+ TB(P(LEFT) | P(DOWN), 0, 1.0 - (kCornerButtonHeight + kBigButtonHeight), kBigButtonWidth, kBigButtonHeight),
+ TB(P(DOWN), kBigButtonWidth, 1.0 - (kCornerButtonHeight + kBigButtonHeight), kBigButtonWidth, kBigButtonHeight),
+ TB(P(RIGHT) | P(DOWN), 2.0 * kBigButtonWidth, 1.0 - (kCornerButtonHeight + kBigButtonHeight), kBigButtonWidth, kBigButtonHeight),
+ TB(P(SELECT), 0.0, 1.0 - kCornerButtonHeight, kCornerButtonWidth, kCornerButtonHeight),
+ TB(P(X), 1.0 - 2.0 * kBigButtonWidth, kCornerButtonHeight, kBigButtonWidth, kBigButtonHeight),
+ TB(P(Y), 1.0 - 3.0 * kBigButtonWidth, kCornerButtonHeight + kBigButtonHeight, kBigButtonWidth, kBigButtonHeight),
+ TB(P(A), 1.0 - kBigButtonWidth, kCornerButtonHeight + kBigButtonHeight, kBigButtonWidth, kBigButtonHeight),
+ TB(P(B), 1.0 - 2.0 * kBigButtonWidth, 1.0 - (kCornerButtonHeight + kBigButtonHeight), kBigButtonWidth, kBigButtonHeight),
+ TB(P(START), 1.0 - kCornerButtonWidth, 1.0 - kCornerButtonHeight, kCornerButtonWidth, kCornerButtonHeight),
+#undef P
+#undef TB
};
static TouchButton* current = 0;
}
static inline void unpress(TouchButton* b) {
- joypads[0] &= ~b->mask;
+ joypads[Config.touchscreenInput - 1] &= ~b->mask;
}
static inline void press(TouchButton* b) {
- joypads[0] |= b->mask;
+ joypads[Config.touchscreenInput - 1] |= b->mask;
}
static void processMouse(unsigned int x, unsigned int y, int pressed = 0)
static void processEvent(const SDL_Event& event)
{
+ if (videoEventFilter(event)) return;
+
switch (event.type)
{
case SDL_KEYDOWN:
case SDL_QUIT:
Config.quitting = true;
break;
- case SDL_ACTIVEEVENT:
- case SDL_SYSWMEVENT:
- processVideoEvent(event);
- break;
}
}
@param buttons The buttons return value is a bit-wise mask of the two SNES
mouse buttons, bit 0 for button 1 (left) and bit 1 for button 2 (right).
*/
-bool8 S9xReadMousePosition(int which1, int& x, int& y, uint32& buttons)
+bool8 S9xReadMousePosition(int which, int *x, int *y, uint32 *buttons)
{
- if (which1 != 0) return FALSE;
+ if (which != 0) return FALSE;
- x = mouse.x;
- y = mouse.y;
- buttons = mouse.pressed ? 1 : 0;
+ *x = mouse.x;
+ *y = mouse.y;
+ *buttons = mouse.pressed ? 1 : 0;
return TRUE;
}
-bool8 S9xReadSuperScopePosition(int& x, int& y, uint32& buttons)
+bool8 S9xReadSuperScopePosition(int *x, int *y, uint32 *buttons)
{
- x = mouse.x;
- y = mouse.y;
- buttons = mouse.pressed ? 8 : 0;
+ *x = mouse.x;
+ *y = mouse.y;
+ *buttons = mouse.pressed ? 8 : 0;
return TRUE;
}
{
SDL_Event event;
+#if CONF_ZEEMOTE
+ // Wheter blocking or non blocking, poll zeemotes now.
+ ZeeRead(joypads);
+#endif
+
if (block) {
SDL_WaitEvent(&event);
processEvent(event);
mouse.enabled = false;
mouse.pressed = false;
+#if CONF_ZEEMOTE
+ ZeeInit();
+#endif
+
if (Config.joypad1Enabled) {
joypads[0] = 0x80000000UL;
}
}
printf("\n");
- // TODO Non-awful mouse support, Superscope
+ // TODO Non-awful mouse & superscope support
S9xInputScreenChanged();
}
void S9xDeinitInputDevices()
{
+#if CONF_ZEEMOTE
+ ZeeQuit();
+#endif
joypads[0] = 0;
joypads[1] = 0;
mouse.enabled = false;
}
}
-void S9xInputScreenDraw(int pixelSize, void * buffer, int pitch)
+void S9xInputScreenDraw(void * buffer, int pitch)
{
- switch (pixelSize)
- {
- case 1:
- drawControls(reinterpret_cast<uint8*>(buffer), pitch);
- break;
- case 2:
- drawControls(reinterpret_cast<uint16*>(buffer), pitch / 2);
- break;
- }
+ drawControls(reinterpret_cast<uint16*>(buffer), pitch / 2);
}