From 16f006362ed4807c42e5ed05920647ba9806fd61 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 20 Apr 2024 12:38:14 +0200 Subject: [PATCH] Move freopen to console.h --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/main.cpp | 75 +++++++++---------------------- rpcs3/rpcs3.vcxproj | 2 + rpcs3/rpcs3.vcxproj.filters | 12 +++-- rpcs3/rpcs3qt/gui_application.cpp | 8 +--- rpcs3/util/console.cpp | 39 ++++++++++++++++ rpcs3/util/console.h | 13 ++++++ 7 files changed, 88 insertions(+), 62 deletions(-) create mode 100644 rpcs3/util/console.cpp create mode 100644 rpcs3/util/console.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 164e238754..d1ef5f4e81 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -42,6 +42,7 @@ target_include_directories(rpcs3_emu # Utilities target_sources(rpcs3_emu PRIVATE ../util/atomic.cpp + ../util/console.cpp ../util/media_utils.cpp ../util/video_provider.cpp ../util/logs.cpp diff --git a/rpcs3/main.cpp b/rpcs3/main.cpp index 1c8533826e..1f5340c123 100644 --- a/rpcs3/main.cpp +++ b/rpcs3/main.cpp @@ -28,6 +28,7 @@ #include "headless_application.h" #include "Utilities/sema.h" #include "Utilities/date_time.h" +#include "util/console.h" #include "Crypto/decrypt_binaries.h" #ifdef _WIN32 #include "module_verifier.hpp" @@ -151,10 +152,8 @@ LOG_CHANNEL(q_debug, "QDEBUG"); if (s_headless) { -#ifdef _WIN32 - if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) - [[maybe_unused]] const auto con_out = freopen("conout$", "w", stderr); -#endif + utils::attach_console(utils::console_stream::std_err, true); + std::cerr << fmt::format("RPCS3: %s\n", text); #ifdef __linux__ jit_announce(0, 0, ""); @@ -274,11 +273,9 @@ struct fatal_error_listener final : logs::listener _msg += text; _msg += '\n'; -#ifdef _WIN32 // If launched from CMD - if (AttachConsole(ATTACH_PARENT_PROCESS)) - [[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stderr); -#endif + utils::attach_console(utils::console_stream::std_err, false); + // Output to error stream as is std::cerr << _msg; @@ -727,13 +724,8 @@ int main(int argc, char** argv) if (parser.isSet(codec_option)) { -#ifdef _WIN32 - if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) - { - [[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stdout); - [[maybe_unused]] const auto con_err = freopen("CONOUT$", "w", stderr); - } -#endif + utils::attach_console(utils::console_stream::std_out | utils::console_stream::std_err, true); + for (const utils::ffmpeg_codec& codec : utils::list_ffmpeg_decoders()) { fprintf(stdout, "Found ffmpeg decoder: %s (%d, %s)\n", codec.name.c_str(), codec.codec_id, codec.long_name.c_str()); @@ -750,18 +742,16 @@ int main(int argc, char** argv) #ifdef _WIN32 if (parser.isSet(arg_stdout) || parser.isSet(arg_stderr)) { - if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) + int stream = 0; + if (parser.isSet(arg_stdout)) { - if (parser.isSet(arg_stdout)) - { - [[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stdout); - } - - if (parser.isSet(arg_stderr)) - { - [[maybe_unused]] const auto con_err = freopen("CONOUT$", "w", stderr); - } + stream |= utils::console_stream::std_out; } + if (parser.isSet(arg_stderr)) + { + stream |= utils::console_stream::std_err; + } + utils::attach_console(stream, true); } #endif @@ -770,13 +760,7 @@ int main(int argc, char** argv) if (rpcs3::curl::g_curl_verbose) { -#ifdef _WIN32 - if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) - { - [[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stdout); - [[maybe_unused]] const auto con_err = freopen("CONOUT$", "w", stderr); - } -#endif + utils::attach_console(utils::console_stream::std_out | utils::console_stream::std_err, true); fprintf(stdout, "Enabled Curl verbose logging.\n"); sys_log.always()("Enabled Curl verbose logging. Please look at your console output."); } @@ -784,13 +768,8 @@ int main(int argc, char** argv) // Handle update of commit database if (parser.isSet(arg_commit_db)) { + utils::attach_console(utils::console_stream::std_out | utils::console_stream::std_err, true); #ifdef _WIN32 - if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) - { - [[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stdout); - [[maybe_unused]] const auto con_err = freopen("CONOUT$", "w", stderr); - } - std::string path; #else std::string path = "bin/git/commits.lst"; @@ -1010,10 +989,8 @@ int main(int argc, char** argv) if (parser.isSet(arg_styles)) { -#ifdef _WIN32 - if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) - [[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stdout); -#endif + utils::attach_console(utils::console_stream::std_out, true); + for (const auto& style : QStyleFactory::keys()) std::cout << "\n" << style.toStdString(); @@ -1166,13 +1143,7 @@ int main(int argc, char** argv) if (parser.isSet(arg_decrypt)) { -#ifdef _WIN32 - if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) - { - [[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stdout); - [[maybe_unused]] const auto con_in = freopen("CONIN$", "r", stdin); - } -#endif + utils::attach_console(utils::console_stream::std_out | utils::console_stream::std_in, true); std::vector vec_modules; for (const QString& mod : parser.values(decrypt_option)) @@ -1400,11 +1371,9 @@ int main(int argc, char** argv) } else if (s_headless || s_no_gui) { -#ifdef _WIN32 // If launched from CMD - if (AttachConsole(ATTACH_PARENT_PROCESS)) - [[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stderr); -#endif + utils::attach_console(utils::console_stream::std_out | utils::console_stream::std_err, false); + sys_log.error("Cannot run %s mode without boot target. Terminating...", s_headless ? "headless" : "no-gui"); fprintf(stderr, "Cannot run %s mode without boot target. Terminating...\n", s_headless ? "headless" : "no-gui"); diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 3ce603d79b..db5d02dba4 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -817,6 +817,7 @@ + @@ -1736,6 +1737,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index b8bac8e3a4..0be69ee740 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1065,6 +1065,9 @@ Io + + rpcs3 + @@ -1241,9 +1244,6 @@ Gui\custom items - - Gui\settings - Io\Skateboard @@ -1253,6 +1253,9 @@ Io + + rpcs3 + @@ -1555,6 +1558,9 @@ Gui\settings + + Gui\settings + diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp index ee4bb469e7..5a9ae9aaf4 100644 --- a/rpcs3/rpcs3qt/gui_application.cpp +++ b/rpcs3/rpcs3qt/gui_application.cpp @@ -21,6 +21,7 @@ #include "Emu/Io/Null/null_music_handler.h" #include "Emu/vfs_config.h" #include "util/init_mutex.hpp" +#include "util/console.h" #include "Input/raw_mouse_handler.h" #include "trophy_notification_helper.h" #include "save_data_dialog.h" @@ -116,16 +117,11 @@ bool gui_application::Init() return false; } -#ifdef _WIN32 if (m_gui_settings->GetValue(gui::m_attachCommandLine).toBool()) { - if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) - { - [[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stderr); - } + utils::attach_console(utils::console_stream::std_err, true); } else -#endif { m_gui_settings->SetValue(gui::m_attachCommandLine, false); } diff --git a/rpcs3/util/console.cpp b/rpcs3/util/console.cpp new file mode 100644 index 0000000000..fb75875ea4 --- /dev/null +++ b/rpcs3/util/console.cpp @@ -0,0 +1,39 @@ +#include "console.h" + +#ifdef _WIN32 +#include "Windows.h" +#include +#endif + +namespace utils +{ + void attach_console([[maybe_unused]] int stream, [[maybe_unused]] bool open_console) + { +#ifdef _WIN32 + if (!stream) + { + return; + } + + if (!(AttachConsole(ATTACH_PARENT_PROCESS) || (open_console && AllocConsole()))) + { + return; + } + + if (stream & console_stream::std_out) + { + [[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stdout); + } + + if (stream & console_stream::std_err) + { + [[maybe_unused]] const auto con_err = freopen("CONOUT$", "w", stderr); + } + + if (stream & console_stream::std_in) + { + [[maybe_unused]] const auto con_in = freopen("CONIN$", "r", stdin); + } +#endif + } +} diff --git a/rpcs3/util/console.h b/rpcs3/util/console.h new file mode 100644 index 0000000000..92b169a98f --- /dev/null +++ b/rpcs3/util/console.h @@ -0,0 +1,13 @@ +#pragma once + +namespace utils +{ + enum console_stream + { + std_out = 0x01, + std_err = 0x02, + std_in = 0x04, + }; + + void attach_console(int stream, bool open_console); +}