diff --git a/src/app/editor/palette/palette_editor.cc b/src/app/editor/palette/palette_editor.cc index b9f09153..abc02f82 100644 --- a/src/app/editor/palette/palette_editor.cc +++ b/src/app/editor/palette/palette_editor.cc @@ -207,9 +207,9 @@ void PaletteEditor::Initialize() { .category = "Palette", .shortcut_hint = "Ctrl+Shift+P", .visibility_flag = &show_control_panel_, + .priority = 10, .enabled_condition = [this]() { return rom_ && rom_->is_loaded(); }, - .disabled_tooltip = "Load a ROM first", - .priority = 10}); + .disabled_tooltip = "Load a ROM first"}); panel_manager->RegisterPanel({.card_id = "palette.ow_main", .display_name = "Overworld Main", @@ -218,9 +218,9 @@ void PaletteEditor::Initialize() { .category = "Palette", .shortcut_hint = "Ctrl+Alt+1", .visibility_flag = &show_ow_main_panel_, + .priority = 20, .enabled_condition = [this]() { return rom_ && rom_->is_loaded(); }, - .disabled_tooltip = "Load a ROM first", - .priority = 20}); + .disabled_tooltip = "Load a ROM first"}); panel_manager->RegisterPanel({.card_id = "palette.ow_animated", .display_name = "Overworld Animated", @@ -229,9 +229,9 @@ void PaletteEditor::Initialize() { .category = "Palette", .shortcut_hint = "Ctrl+Alt+2", .visibility_flag = &show_ow_animated_panel_, + .priority = 30, .enabled_condition = [this]() { return rom_ && rom_->is_loaded(); }, - .disabled_tooltip = "Load a ROM first", - .priority = 30}); + .disabled_tooltip = "Load a ROM first"}); panel_manager->RegisterPanel({.card_id = "palette.dungeon_main", .display_name = "Dungeon Main", @@ -240,9 +240,9 @@ void PaletteEditor::Initialize() { .category = "Palette", .shortcut_hint = "Ctrl+Alt+3", .visibility_flag = &show_dungeon_main_panel_, + .priority = 40, .enabled_condition = [this]() { return rom_ && rom_->is_loaded(); }, - .disabled_tooltip = "Load a ROM first", - .priority = 40}); + .disabled_tooltip = "Load a ROM first"}); panel_manager->RegisterPanel({.card_id = "palette.sprites", .display_name = "Global Sprite Palettes", @@ -251,9 +251,9 @@ void PaletteEditor::Initialize() { .category = "Palette", .shortcut_hint = "Ctrl+Alt+4", .visibility_flag = &show_sprite_panel_, + .priority = 50, .enabled_condition = [this]() { return rom_ && rom_->is_loaded(); }, - .disabled_tooltip = "Load a ROM first", - .priority = 50}); + .disabled_tooltip = "Load a ROM first"}); panel_manager->RegisterPanel({.card_id = "palette.sprites_aux1", .display_name = "Sprites Aux 1", @@ -262,9 +262,9 @@ void PaletteEditor::Initialize() { .category = "Palette", .shortcut_hint = "Ctrl+Alt+7", .visibility_flag = &show_sprites_aux1_panel_, + .priority = 51, .enabled_condition = [this]() { return rom_ && rom_->is_loaded(); }, - .disabled_tooltip = "Load a ROM first", - .priority = 51}); + .disabled_tooltip = "Load a ROM first"}); panel_manager->RegisterPanel({.card_id = "palette.sprites_aux2", .display_name = "Sprites Aux 2", @@ -273,9 +273,9 @@ void PaletteEditor::Initialize() { .category = "Palette", .shortcut_hint = "Ctrl+Alt+8", .visibility_flag = &show_sprites_aux2_panel_, + .priority = 52, .enabled_condition = [this]() { return rom_ && rom_->is_loaded(); }, - .disabled_tooltip = "Load a ROM first", - .priority = 52}); + .disabled_tooltip = "Load a ROM first"}); panel_manager->RegisterPanel({.card_id = "palette.sprites_aux3", .display_name = "Sprites Aux 3", @@ -284,9 +284,9 @@ void PaletteEditor::Initialize() { .category = "Palette", .shortcut_hint = "Ctrl+Alt+9", .visibility_flag = &show_sprites_aux3_panel_, + .priority = 53, .enabled_condition = [this]() { return rom_ && rom_->is_loaded(); }, - .disabled_tooltip = "Load a ROM first", - .priority = 53}); + .disabled_tooltip = "Load a ROM first"}); panel_manager->RegisterPanel({.card_id = "palette.equipment", .display_name = "Equipment Palettes", @@ -295,9 +295,9 @@ void PaletteEditor::Initialize() { .category = "Palette", .shortcut_hint = "Ctrl+Alt+5", .visibility_flag = &show_equipment_panel_, + .priority = 60, .enabled_condition = [this]() { return rom_ && rom_->is_loaded(); }, - .disabled_tooltip = "Load a ROM first", - .priority = 60}); + .disabled_tooltip = "Load a ROM first"}); panel_manager->RegisterPanel({.card_id = "palette.quick_access", .display_name = "Quick Access", @@ -306,9 +306,9 @@ void PaletteEditor::Initialize() { .category = "Palette", .shortcut_hint = "Ctrl+Alt+Q", .visibility_flag = &show_quick_access_, + .priority = 70, .enabled_condition = [this]() { return rom_ && rom_->is_loaded(); }, - .disabled_tooltip = "Load a ROM first", - .priority = 70}); + .disabled_tooltip = "Load a ROM first"}); panel_manager->RegisterPanel({.card_id = "palette.custom", .display_name = "Custom Palette", @@ -317,9 +317,9 @@ void PaletteEditor::Initialize() { .category = "Palette", .shortcut_hint = "Ctrl+Alt+C", .visibility_flag = &show_custom_palette_, + .priority = 80, .enabled_condition = [this]() { return rom_ && rom_->is_loaded(); }, - .disabled_tooltip = "Load a ROM first", - .priority = 80}); + .disabled_tooltip = "Load a ROM first"}); // Show control panel by default when Palette Editor is activated panel_manager->ShowPanel(session_id, "palette.control_panel"); diff --git a/src/cli/handlers/tools/emulator_commands.cc b/src/cli/handlers/tools/emulator_commands.cc index 234ed691..593f6dd5 100644 --- a/src/cli/handlers/tools/emulator_commands.cc +++ b/src/cli/handlers/tools/emulator_commands.cc @@ -86,9 +86,10 @@ absl::Status EmulatorResetCommandHandler::Execute( Rom* rom, const resources::ArgumentParser& parser, resources::OutputFormatter& formatter) { EmulatorClient client; - agent::Empty request; + agent::ControlRequest request; + request.set_action("reset"); auto response_or = - client.CallRpc(&agent::EmulatorService::Stub::Reset, request); + client.CallRpc(&agent::EmulatorService::Stub::ControlEmulator, request); if (!response_or.ok()) { return response_or.status(); } diff --git a/src/cli/handlers/tools/test_cli_commands.cc b/src/cli/handlers/tools/test_cli_commands.cc index 9600e85d..ad0b462f 100644 --- a/src/cli/handlers/tools/test_cli_commands.cc +++ b/src/cli/handlers/tools/test_cli_commands.cc @@ -44,8 +44,13 @@ const TestSuite kTestSuites[] = { std::string ExecuteCommand(const std::string& cmd) { std::array buffer; std::string result; +#ifdef _WIN32 + std::unique_ptr pipe(_popen(cmd.c_str(), "r"), + _pclose); +#else std::unique_ptr pipe(popen(cmd.c_str(), "r"), - pclose); + pclose); +#endif if (!pipe) { return ""; } diff --git a/src/cli/service/agent/emulator_service_impl.cc b/src/cli/service/agent/emulator_service_impl.cc index 6ec72c26..bbfd2996 100644 --- a/src/cli/service/agent/emulator_service_impl.cc +++ b/src/cli/service/agent/emulator_service_impl.cc @@ -211,6 +211,18 @@ grpc::Status EmulatorServiceImpl::PressButtons(grpc::ServerContext* context, return grpc::Status::OK; } +grpc::Status EmulatorServiceImpl::ReleaseButtons(grpc::ServerContext* context, + const agent::ButtonRequest* request, + agent::CommandResponse* response) { + if (!emulator_) return grpc::Status(grpc::StatusCode::UNAVAILABLE, "Emulator not initialized."); + auto& input_manager = emulator_->input_manager(); + for (int i = 0; i < request->buttons_size(); i++) { + input_manager.ReleaseButton(ToSnesButton(static_cast(request->buttons(i)))); + } + response->set_success(true); + return grpc::Status::OK; +} + grpc::Status EmulatorServiceImpl::HoldButtons(grpc::ServerContext* context, const agent::ButtonHoldRequest* request, agent::CommandResponse* response) { @@ -451,4 +463,4 @@ void EmulatorServiceImpl::InitializeStepController() { step_controller_.SetPcGetter([&cpu]() -> uint32_t { return (cpu.PB << 16) | cpu.PC; }); } -} // namespace yaze::net \ No newline at end of file +} // namespace yaze::net diff --git a/src/cli/service/agent/emulator_service_impl.h b/src/cli/service/agent/emulator_service_impl.h index b229b2b7..6e010cb3 100644 --- a/src/cli/service/agent/emulator_service_impl.h +++ b/src/cli/service/agent/emulator_service_impl.h @@ -38,6 +38,9 @@ class EmulatorServiceImpl final : public agent::EmulatorService::Service { grpc::Status PressButtons(grpc::ServerContext* context, const agent::ButtonRequest* request, agent::CommandResponse* response) override; + grpc::Status ReleaseButtons(grpc::ServerContext* context, + const agent::ButtonRequest* request, + agent::CommandResponse* response) override; grpc::Status HoldButtons(grpc::ServerContext* context, const agent::ButtonHoldRequest* request, agent::CommandResponse* response) override; diff --git a/src/core/asar_wrapper.cc b/src/core/asar_wrapper.cc index 8cce86fc..f75209c8 100644 --- a/src/core/asar_wrapper.cc +++ b/src/core/asar_wrapper.cc @@ -1,6 +1,7 @@ #include "core/asar_wrapper.h" #include +#include #include #include #include @@ -411,7 +412,11 @@ absl::StatusOr AsarWrapper::ApplyPatchWithBinary( // Execute using popen to capture output std::array buffer; std::string output; +#ifdef _WIN32 + FILE* pipe = _popen(cmd.str().c_str(), "r"); +#else FILE* pipe = popen(cmd.str().c_str(), "r"); +#endif if (!pipe) { fs::remove(temp_rom, ec); fs::remove(temp_symbols, ec); @@ -421,9 +426,9 @@ absl::StatusOr AsarWrapper::ApplyPatchWithBinary( while (fgets(buffer.data(), buffer.size(), pipe) != nullptr) { output += buffer.data(); } +#ifndef _WIN32 int exit_status = pclose(pipe); int exit_code = exit_status; -#ifndef _WIN32 if (exit_status != -1) { if (WIFEXITED(exit_status)) { exit_code = WEXITSTATUS(exit_status); @@ -431,6 +436,8 @@ absl::StatusOr AsarWrapper::ApplyPatchWithBinary( exit_code = 128 + WTERMSIG(exit_status); } } +#else + int exit_code = _pclose(pipe); #endif if (!patch_dir.empty()) { diff --git a/src/core/version_manager.cc b/src/core/version_manager.cc index fe2fdd78..118fb04e 100644 --- a/src/core/version_manager.cc +++ b/src/core/version_manager.cc @@ -221,7 +221,13 @@ absl::StatusOr VersionManager::RunCommandOutput(const std::string& std::array buffer; std::string result; - std::unique_ptr pipe(popen(full_cmd.c_str(), "r"), pclose); +#ifdef _WIN32 + std::unique_ptr pipe(_popen(full_cmd.c_str(), "r"), + _pclose); +#else + std::unique_ptr pipe(popen(full_cmd.c_str(), "r"), + pclose); +#endif if (!pipe) { return absl::InternalError("popen() failed!"); } diff --git a/src/protos/emulator_service.proto b/src/protos/emulator_service.proto index c7ff5449..3615c7cd 100644 --- a/src/protos/emulator_service.proto +++ b/src/protos/emulator_service.proto @@ -15,6 +15,7 @@ service EmulatorService { // --- Input & State --- rpc PressButtons(ButtonRequest) returns (CommandResponse); + rpc ReleaseButtons(ButtonRequest) returns (CommandResponse); rpc HoldButtons(ButtonHoldRequest) returns (CommandResponse); rpc GetGameState(GameStateRequest) returns (GameStateResponse); rpc ReadMemory(MemoryRequest) returns (MemoryResponse); @@ -263,4 +264,4 @@ message TestRunResponse { string message = 2; CPUState final_cpu_state = 3; bool crashed = 4; -} \ No newline at end of file +}