F_Thread() { m_hMutex = F_MUTEX_NULL; m_pszThreadName = NULL; m_pszThreadStatus = NULL; m_uiStatusBufLen = 0; m_uiThreadGroup = F_INVALID_THREAD_GROUP; m_pPrev = NULL; m_pNext = NULL; cleanupThread(); }
UIGDetailsElementInterface::~UIGDetailsElementInterface() { cleanupThread(); }
virtual ~F_Thread() { stopThread(); cleanupThread(); }
void Hook::loop(Hook::Hid::HidControllerDevice &realD, Hook::Scp::VirtualDevice &vjd) { auto mapper(Remapper::create(Remapper::DEFAULT_PATH)); bool hasProcList(Config::get()->hasProcessList()); const auto &procList(Config::get()->getProcessList()); bool suicide(hasProcList ? Config::get()->shouldEndOnGameProcDeath() : false); std::thread worker; HOOK_TCHARSTR activeProc(HOOK_TCHARIFY(Remapper::DEFAULT_PATH)); if (!hasProcList) { std::cout << "\nSetup successful! Beginning controller translation. Press CTRL + END to quit. Press CTRL + HOME to re-read button mappings." << std::endl; } else { std::cout << "\nSetup successful! Awaiting game startup... Press CTRL + SHIFT + END to quit." << std::endl; auto procIter(procWaitLoop(procList)); if (procIter == procList.cend()) { return; } activeProc = *procIter; HOOK_TCHAROUT << "Detected startup of " << activeProc << "." << std::endl; mapper = Remapper::create(activeProc); std::wcout << "Beginning controller translation. Press CTRL + END to quit. Press CTRL + HOME to re-read button mappings." << std::endl; worker = std::thread(processCheckerThreadLoop, activeProc); } for (;;) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); realD.pullData(); auto state(realD.parseData()); mapper.remap(state); vjd.feed(state); if (GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_HOME)) { std::cout << "Re-reading button mappings from file...\n"; Remapper::reread(activeProc, mapper); } if (GetAsyncKeyState(VK_END) && GetAsyncKeyState(VK_CONTROL)) { earlyDie.store(true); cleanupThread(worker); if (hasProcList) { goto rewait; } break; } else if (hasProcList && earlyDie.load()) { if (suicide) { cleanupThread(worker); std::cout << "Game process ended. Terminating controller translation and quitting." << std::endl; break; } std::cout << "Game process ended. Terminating controller translation." << std::endl; rewait: cleanupThread(worker); std::cout << "Awaiting game startup... Press CTRL + SHIFT + END to quit." << std::endl; auto procIter(procWaitLoop(procList)); if (procIter == procList.cend()) { break; } activeProc = *procIter; mapper = Remapper::create(activeProc); earlyDie.store(false); worker = std::thread(processCheckerThreadLoop, *procIter); } } }