static inline void process_axismotion(arcan_evctx* ctx, const SDL_JoyAxisEvent* const ev) { int devid = ev->which; if (!iodev.joys || iodev.joys[devid].axis < ev->axis) return; struct axis_opts* daxis = &iodev.joys[devid].adata[ev->axis]; int16_t dstv; if (process_axis(ctx, daxis, ev->value, &dstv)){ arcan_event newevent = { .category = EVENT_IO, .io.kind = EVENT_IO_AXIS_MOVE, .io.devid = iodev.joys[devid].devnum, .io.subid = ev->axis, .io.datatype = EVENT_IDATATYPE_ANALOG, .io.devkind = EVENT_IDEVKIND_GAMEDEV, .io.input.analog.gotrel = false, .io.input.analog.nvalues = 1, .io.input.analog.axisval[0] = dstv }; arcan_event_enqueue(ctx, &newevent); } }
static inline void process_mousemotion(arcan_evctx* ctx, int16_t xv, int16_t xrel, int16_t yv, int16_t yrel) { int16_t dstv, dstv_r; arcan_event nev = { .label = "MOUSE\0", .category = EVENT_IO, .kind = EVENT_IO_AXIS_MOVE, .data.io.datatype = EVENT_IDATATYPE_ANALOG, .data.io.devkind = EVENT_IDEVKIND_MOUSE, .data.io.input.analog.devid = ARCAN_MOUSEIDBASE, .data.io.input.analog.gotrel = true, .data.io.input.analog.nvalues = 2 }; snprintf(nev.label, sizeof(nev.label) - 1, "mouse"); if (process_axis(ctx, &iodev.mx, xv, &dstv) && process_axis(ctx, &iodev.mx_r, xrel, &dstv_r)){ nev.data.io.input.analog.subid = 0; nev.data.io.input.analog.axisval[0] = dstv; nev.data.io.input.analog.axisval[1] = dstv_r; arcan_event_enqueue(ctx, &nev); } if (process_axis(ctx, &iodev.my, yv, &dstv) && process_axis(ctx, &iodev.my_r, yrel, &dstv_r)){ nev.data.io.input.analog.subid = 1; nev.data.io.input.analog.axisval[0] = dstv; nev.data.io.input.analog.axisval[1] = dstv_r; arcan_event_enqueue(ctx, &nev); } } static void set_analogstate(struct axis_opts* dst, int lower_bound, int upper_bound, int deadzone, int kernel_size, enum ARCAN_ANALOGFILTER_KIND mode) { dst->lower = lower_bound; dst->upper = upper_bound; dst->deadzone = deadzone; dst->kernel_sz = kernel_size; dst->mode = mode; dst->kernel_ofs = 0; }
bool dev::sixense::process_event(app::event *E) { switch (E->get_type()) { case E_POINT: if (process_point (E)) return true; else break; case E_AXIS: if (process_axis (E)) return true; else break; case E_BUTTON: if (process_button(E)) return true; else break; case E_TICK: if (process_tick (E)) return true; else break; } return dev::input::process_event(E); }