void arcan_event_deinit(arcan_evctx* ctx) { platform_event_deinit(ctx); if (record_out){ fclose(record_out); record_out = NULL; } if (playback_in.ptr){ arcan_release_map(playback_in); memset(&playback_in, '\0', sizeof(playback_in)); playback_ofs = 0; } eventfront = eventback = 0; }
void platform_event_reset(arcan_evctx* ctx) { platform_event_deinit(ctx); }
void platform_event_rescan_idev(arcan_evctx* ctx) { if (iodev.sticks_init) SDL_QuitSubSystem(SDL_INIT_JOYSTICK); SDL_Init(SDL_INIT_JOYSTICK); SDL_JoystickEventState(SDL_ENABLE); int n_joys = SDL_NumJoysticks(); iodev.sticks_init = true; if (n_joys == 0){ drop_joytbl(ctx); return; } /* * (Re) scan/open all joysticks, * look for matching / already present devices * and copy their settings. */ size_t jsz = sizeof(struct arcan_stick) * n_joys; struct arcan_stick* joys = malloc(jsz); memset(joys, '\0', jsz); for (int i = 0; i < n_joys; i++) { struct arcan_stick* dj = &joys[i]; struct arcan_stick* sj = NULL; unsigned long hashid = djb_hash(SDL_JoystickName(i)); /* find existing */ if (iodev.joys){ for (int j = 0; j < iodev.n_joy; j++){ if (iodev.joys[j].hashid == hashid){ sj = &iodev.joys[j]; break; } } /* if found, copy to new table */ if (sj){ memcpy(dj, sj, sizeof(struct arcan_stick)); if (dj->hats){ dj->hattbls = malloc(dj->hats * sizeof(unsigned)); memcpy(dj->hattbls, sj->hattbls, sizeof(unsigned) * sj->hats); } if (dj->axis){ dj->adata = malloc(dj->axis * sizeof(struct axis_opts)); memcpy(dj->adata, sj->adata, sizeof(struct axis_opts) * sj->axis); } dj->handle = SDL_JoystickOpen(i); continue; } } /* otherwise add as new entry */ strncpy(dj->label, SDL_JoystickName(i), 255); dj->hashid = djb_hash(SDL_JoystickName(i)); dj->handle = SDL_JoystickOpen(i); dj->devnum = gen_devid(dj->hashid); dj->axis = SDL_JoystickNumAxes(joys[i].handle); dj->buttons = SDL_JoystickNumButtons(joys[i].handle); dj->balls = SDL_JoystickNumBalls(joys[i].handle); dj->hats = SDL_JoystickNumHats(joys[i].handle); if (dj->hats > 0){ size_t dst_sz = joys[i].hats * sizeof(unsigned); dj->hattbls = malloc(dst_sz); memset(joys[i].hattbls, 0, dst_sz); } if (dj->axis > 0){ size_t ad_sz = sizeof(struct axis_opts) * dj->axis; dj->adata = malloc(ad_sz); memset(dj->adata, '\0', ad_sz); for (int i = 0; i < dj->axis; i++){ dj->adata[i].mode = ARCAN_ANALOGFILTER_AVG; /* these values are sortof set * based on the SixAxis (common enough, and noisy enough) */ dj->adata[i].lower = -32765; dj->adata[i].deadzone = 5000; dj->adata[i].upper = 32768; dj->adata[i].kernel_sz = 1; } } /* notify the rest of the system about the added device */ struct arcan_event addev = { .category = EVENT_IO, .io.kind = EVENT_IO_STATUS, .io.devkind = EVENT_IDEVKIND_STATUS, .io.devid = dj->devnum, .io.input.status.devkind = EVENT_IDEVKIND_GAMEDEV, .io.input.status.action = EVENT_IDEV_ADDED }; snprintf((char*) &addev.io.label, sizeof(addev.io.label) / sizeof(addev.io.label[0]), "%s", dj->label); arcan_event_enqueue(ctx, &addev); } iodev.n_joy = n_joys; iodev.joys = joys; } void platform_event_keyrepeat(arcan_evctx* ctx, int* rate, int* delay) { /* sdl repeat start disabled */ static int cur_rep, cur_del; bool upd = false; if (*rate < 0){ *rate = cur_rep; } else{ int tmp = *rate; *rate = cur_rep; cur_rep = tmp; upd = true; } if (*delay < 0){ *delay = cur_del; } else{ int tmp = *delay; *delay = cur_del; cur_del = tmp; upd = true; } if (upd) SDL_EnableKeyRepeat(cur_del, cur_rep); } void platform_event_deinit(arcan_evctx* ctx) { if (iodev.sticks_init){ SDL_QuitSubSystem(SDL_INIT_JOYSTICK); iodev.sticks_init = false; } } void platform_event_reset(arcan_evctx* ctx) { platform_event_deinit(ctx); }