#define IN_PREFIX "gp2x:"
#define IN_GP2X_NBUTTONS 32
+/* note: in_gp2x hadles combos (if 2 btns have the same bind,
+ * both must be pressed for action to happen) */
+static int in_gp2x_combo_keys = 0;
+static int in_gp2x_combo_acts = 0;
+
extern volatile unsigned short *gp2x_memregs; /* from minimal library rlyeh */
enum { BTN_UP = 0, BTN_LEFT = 2, BTN_DOWN = 4, BTN_RIGHT = 6,
static void in_gp2x_probe(void)
{
- in_register(IN_PREFIX "GP2X pad", IN_DRVID_GP2X, -1, (void *)1);
+ in_register(IN_PREFIX "GP2X pad", IN_DRVID_GP2X, -1, (void *)1, 1);
}
static int in_gp2x_get_bind_count(void)
/* returns bitfield of binds of pressed buttons */
int in_gp2x_update(void *drv_data, int *binds)
{
- int i, value, ret = 0;
+ int i, keys, ret = 0;
+
+ keys = in_gp2x_get_gpio_bits();
- value = in_gp2x_get_gpio_bits();
+ if (keys & in_gp2x_combo_keys)
+ return in_combos_do(keys, binds, BTN_PUSH, in_gp2x_combo_keys, in_gp2x_combo_acts);
- for (i = 0; value; i++) {
- if (value & 1)
+ for (i = 0; keys; i++) {
+ if (keys & 1)
ret |= binds[i];
- value >>= 1;
+ keys >>= 1;
}
return ret;
count++;
}
+ in_combos_find(binds, BTN_PUSH, &in_gp2x_combo_keys, &in_gp2x_combo_acts);
+
return count;
}
{
in_drv_t *drv = vdrv;
+ in_gp2x_combo_keys = in_gp2x_combo_acts = 0;
+
drv->prefix = in_gp2x_prefix;
drv->probe = in_gp2x_probe;
drv->get_bind_count = in_gp2x_get_bind_count;