#include #include #include #include #include #include #include bool msPacketKeyDownGet(const struct msPacket *packet, int clientFd, struct msClientConnectionData *const data) { bool result = false; struct msPacketKeyDown *keyDown = NULL; int key = 0; char isPressed = 0; FILE *fp = fmemopen(packet->rawData, packet->size, "r"); if (1 != fread(&isPressed, sizeof isPressed, 1, fp)) { goto return_ms_packet_key_down_get; } if (1 != fread(&key, sizeof key, 1, fp)) { goto return_ms_packet_key_down_get; } key = be32toh(key); keyDown = malloc(sizeof *keyDown); keyDown->isPressed = isPressed; keyDown->key = key; result = true; return_ms_packet_key_down_get: fclose(fp); if (!result) { return false; } return msPacketKeyDownHandle(packet, keyDown, data); } bool msPacketKeyDownHandle(const struct msPacket *packet, struct msPacketKeyDown *keyDown, struct msClientConnectionData *const data) { bool result = false; struct msCoreController *coreController = data->coreController; if (!coreController || !coreController->threadContext.core) { goto return_ms_packet_key_down_handle; } struct mCore *core = coreController->threadContext.core; int gbaKey = 1 << mInputMapKey(&core->inputMap, 80, keyDown->key); printf("Keys received %d %x\n", keyDown->key, gbaKey); pthread_mutex_lock(data->mutexPressKey); if (keyDown->isPressed) { core->addKeys(core, gbaKey); } else { core->clearKeys(core, gbaKey); } pthread_mutex_unlock(data->mutexPressKey); result = true; return_ms_packet_key_down_handle: msPacketKeyDownDestroy(&keyDown); return result; } void msPacketKeyDownDestroy(struct msPacketKeyDown **keyDownPtr) { free(*keyDownPtr); *keyDownPtr = NULL; }