extern "C" void Trainer_NotifyEmulatorResume() { OnEmulatorResume(); }
/** RPCS3 emulator has functions it desires to call from the GUI at times. Initialize them in here. */ void rpcs3_app::InitializeCallbacks() { EmuCallbacks callbacks; callbacks.exit = [this]() { quit(); }; callbacks.call_after = [=](std::function<void()> func) { RequestCallAfter(std::move(func)); }; callbacks.process_events = [this]() { RPCS3MainWin->update(); processEvents(); }; callbacks.get_kb_handler = [=]() -> std::shared_ptr<KeyboardHandlerBase> { switch (keyboard_handler type = g_cfg.io.keyboard) { case keyboard_handler::null: return std::make_shared<NullKeyboardHandler>(); case keyboard_handler::basic: { basic_keyboard_handler* ret = new basic_keyboard_handler(); ret->moveToThread(thread()); ret->SetTargetWindow(gameWindow); return std::shared_ptr<KeyboardHandlerBase>(ret); } default: fmt::throw_exception("Invalid keyboard handler: %s", type); } }; callbacks.get_mouse_handler = [=]() -> std::shared_ptr<MouseHandlerBase> { switch (mouse_handler type = g_cfg.io.mouse) { case mouse_handler::null: return std::make_shared<NullMouseHandler>(); case mouse_handler::basic: { basic_mouse_handler* ret = new basic_mouse_handler(); ret->moveToThread(thread()); ret->SetTargetWindow(gameWindow); return std::shared_ptr<MouseHandlerBase>(ret); } default: fmt::throw_exception("Invalid mouse handler: %s", type); } }; callbacks.get_pad_handler = [this]() -> std::shared_ptr<pad_thread> { return std::make_shared<pad_thread>(thread(), gameWindow); }; callbacks.get_gs_frame = [this]() -> std::unique_ptr<GSFrameBase> { extern const std::unordered_map<video_resolution, std::pair<int, int>, value_hash<video_resolution>> g_video_out_resolution_map; const auto size = g_video_out_resolution_map.at(g_cfg.video.resolution); int w = size.first; int h = size.second; if (guiSettings->GetValue(gui::gs_resize).toBool()) { w = guiSettings->GetValue(gui::gs_width).toInt(); h = guiSettings->GetValue(gui::gs_height).toInt(); } bool disableMouse = guiSettings->GetValue(gui::gs_disableMouse).toBool(); auto frame_geometry = gui::utils::create_centered_window_geometry(RPCS3MainWin->geometry(), w, h); gs_frame* frame; switch (video_renderer type = g_cfg.video.renderer) { case video_renderer::null: { frame = new gs_frame("Null", frame_geometry, RPCS3MainWin->GetAppIcon(), disableMouse); break; } case video_renderer::opengl: { frame = new gl_gs_frame(frame_geometry, RPCS3MainWin->GetAppIcon(), disableMouse); break; } case video_renderer::vulkan: { frame = new gs_frame("Vulkan", frame_geometry, RPCS3MainWin->GetAppIcon(), disableMouse); break; } #ifdef _MSC_VER case video_renderer::dx12: { frame = new gs_frame("DirectX 12", frame_geometry, RPCS3MainWin->GetAppIcon(), disableMouse); break; } #endif default: fmt::throw_exception("Invalid video renderer: %s" HERE, type); } gameWindow = frame; return std::unique_ptr<gs_frame>(frame); }; callbacks.get_gs_render = []() -> std::shared_ptr<GSRender> { switch (video_renderer type = g_cfg.video.renderer) { case video_renderer::null: return std::make_shared<NullGSRender>(); case video_renderer::opengl: return std::make_shared<GLGSRender>(); #if defined(_WIN32) || defined(HAVE_VULKAN) case video_renderer::vulkan: return std::make_shared<VKGSRender>(); #endif #ifdef _MSC_VER case video_renderer::dx12: return std::make_shared<D3D12GSRender>(); #endif default: fmt::throw_exception("Invalid video renderer: %s" HERE, type); } }; callbacks.get_audio = []() -> std::shared_ptr<AudioThread> { switch (audio_renderer type = g_cfg.audio.renderer) { case audio_renderer::null: return std::make_shared<NullAudioThread>(); #ifdef _WIN32 case audio_renderer::xaudio: return std::make_shared<XAudio2Thread>(); #endif #ifdef HAVE_ALSA case audio_renderer::alsa: return std::make_shared<ALSAThread>(); #endif #ifdef HAVE_PULSE case audio_renderer::pulse: return std::make_shared<PulseThread>(); #endif case audio_renderer::openal: return std::make_shared<OpenALThread>(); default: fmt::throw_exception("Invalid audio renderer: %s" HERE, type); } }; callbacks.get_msg_dialog = [=]() -> std::shared_ptr<MsgDialogBase> { return std::make_shared<msg_dialog_frame>(RPCS3MainWin->windowHandle()); }; callbacks.get_save_dialog = [=]() -> std::unique_ptr<SaveDialogBase> { return std::make_unique<save_data_dialog>(); }; callbacks.get_trophy_notification_dialog = [=]() -> std::unique_ptr<TrophyNotificationBase> { return std::make_unique<trophy_notification_helper>(gameWindow); }; callbacks.on_run = [=]() { OnEmulatorRun(); }; callbacks.on_pause = [=]() { OnEmulatorPause(); }; callbacks.on_resume = [=]() { OnEmulatorResume(); }; callbacks.on_stop = [=]() { OnEmulatorStop(); }; callbacks.on_ready = [=]() { OnEmulatorReady(); }; Emu.SetCallbacks(std::move(callbacks)); }