Move freopen to console.h

This commit is contained in:
Megamouse 2024-04-20 12:38:14 +02:00 committed by Elad Ashkenazi
parent dfec577417
commit 16f006362e
7 changed files with 88 additions and 62 deletions

View file

@ -42,6 +42,7 @@ target_include_directories(rpcs3_emu
# Utilities # Utilities
target_sources(rpcs3_emu PRIVATE target_sources(rpcs3_emu PRIVATE
../util/atomic.cpp ../util/atomic.cpp
../util/console.cpp
../util/media_utils.cpp ../util/media_utils.cpp
../util/video_provider.cpp ../util/video_provider.cpp
../util/logs.cpp ../util/logs.cpp

View file

@ -28,6 +28,7 @@
#include "headless_application.h" #include "headless_application.h"
#include "Utilities/sema.h" #include "Utilities/sema.h"
#include "Utilities/date_time.h" #include "Utilities/date_time.h"
#include "util/console.h"
#include "Crypto/decrypt_binaries.h" #include "Crypto/decrypt_binaries.h"
#ifdef _WIN32 #ifdef _WIN32
#include "module_verifier.hpp" #include "module_verifier.hpp"
@ -151,10 +152,8 @@ LOG_CHANNEL(q_debug, "QDEBUG");
if (s_headless) if (s_headless)
{ {
#ifdef _WIN32 utils::attach_console(utils::console_stream::std_err, true);
if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole())
[[maybe_unused]] const auto con_out = freopen("conout$", "w", stderr);
#endif
std::cerr << fmt::format("RPCS3: %s\n", text); std::cerr << fmt::format("RPCS3: %s\n", text);
#ifdef __linux__ #ifdef __linux__
jit_announce(0, 0, ""); jit_announce(0, 0, "");
@ -274,11 +273,9 @@ struct fatal_error_listener final : logs::listener
_msg += text; _msg += text;
_msg += '\n'; _msg += '\n';
#ifdef _WIN32
// If launched from CMD // If launched from CMD
if (AttachConsole(ATTACH_PARENT_PROCESS)) utils::attach_console(utils::console_stream::std_err, false);
[[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stderr);
#endif
// Output to error stream as is // Output to error stream as is
std::cerr << _msg; std::cerr << _msg;
@ -727,13 +724,8 @@ int main(int argc, char** argv)
if (parser.isSet(codec_option)) if (parser.isSet(codec_option))
{ {
#ifdef _WIN32 utils::attach_console(utils::console_stream::std_out | utils::console_stream::std_err, true);
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
for (const utils::ffmpeg_codec& codec : utils::list_ffmpeg_decoders()) 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()); 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 #ifdef _WIN32
if (parser.isSet(arg_stdout) || parser.isSet(arg_stderr)) 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); stream |= utils::console_stream::std_out;
} }
if (parser.isSet(arg_stderr)) if (parser.isSet(arg_stderr))
{ {
[[maybe_unused]] const auto con_err = freopen("CONOUT$", "w", stderr); stream |= utils::console_stream::std_err;
}
} }
utils::attach_console(stream, true);
} }
#endif #endif
@ -770,13 +760,7 @@ int main(int argc, char** argv)
if (rpcs3::curl::g_curl_verbose) if (rpcs3::curl::g_curl_verbose)
{ {
#ifdef _WIN32 utils::attach_console(utils::console_stream::std_out | utils::console_stream::std_err, true);
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
fprintf(stdout, "Enabled Curl verbose logging.\n"); fprintf(stdout, "Enabled Curl verbose logging.\n");
sys_log.always()("Enabled Curl verbose logging. Please look at your console output."); 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 // Handle update of commit database
if (parser.isSet(arg_commit_db)) if (parser.isSet(arg_commit_db))
{ {
utils::attach_console(utils::console_stream::std_out | utils::console_stream::std_err, true);
#ifdef _WIN32 #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; std::string path;
#else #else
std::string path = "bin/git/commits.lst"; std::string path = "bin/git/commits.lst";
@ -1010,10 +989,8 @@ int main(int argc, char** argv)
if (parser.isSet(arg_styles)) if (parser.isSet(arg_styles))
{ {
#ifdef _WIN32 utils::attach_console(utils::console_stream::std_out, true);
if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole())
[[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stdout);
#endif
for (const auto& style : QStyleFactory::keys()) for (const auto& style : QStyleFactory::keys())
std::cout << "\n" << style.toStdString(); std::cout << "\n" << style.toStdString();
@ -1166,13 +1143,7 @@ int main(int argc, char** argv)
if (parser.isSet(arg_decrypt)) if (parser.isSet(arg_decrypt))
{ {
#ifdef _WIN32 utils::attach_console(utils::console_stream::std_out | utils::console_stream::std_in, true);
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
std::vector<std::string> vec_modules; std::vector<std::string> vec_modules;
for (const QString& mod : parser.values(decrypt_option)) 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) else if (s_headless || s_no_gui)
{ {
#ifdef _WIN32
// If launched from CMD // If launched from CMD
if (AttachConsole(ATTACH_PARENT_PROCESS)) utils::attach_console(utils::console_stream::std_out | utils::console_stream::std_err, false);
[[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stderr);
#endif
sys_log.error("Cannot run %s mode without boot target. Terminating...", s_headless ? "headless" : "no-gui"); 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"); fprintf(stderr, "Cannot run %s mode without boot target. Terminating...\n", s_headless ? "headless" : "no-gui");

View file

@ -817,6 +817,7 @@
<ClCompile Include="rpcs3qt\save_data_list_dialog.cpp" /> <ClCompile Include="rpcs3qt\save_data_list_dialog.cpp" />
<ClCompile Include="rpcs3qt\settings_dialog.cpp" /> <ClCompile Include="rpcs3qt\settings_dialog.cpp" />
<ClCompile Include="Input\xinput_pad_handler.cpp" /> <ClCompile Include="Input\xinput_pad_handler.cpp" />
<ClCompile Include="util\console.cpp" />
<ClCompile Include="\rpcs3qt\*.cpp" /> <ClCompile Include="\rpcs3qt\*.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -1736,6 +1737,7 @@
<ClInclude Include="rpcs3qt\trophy_notification_helper.h" /> <ClInclude Include="rpcs3qt\trophy_notification_helper.h" />
<ClInclude Include="rpcs3qt\user_account.h" /> <ClInclude Include="rpcs3qt\user_account.h" />
<ClInclude Include="Input\xinput_pad_handler.h" /> <ClInclude Include="Input\xinput_pad_handler.h" />
<ClInclude Include="util\console.h" />
<ClInclude Include="\rpcs3qt\*.h" /> <ClInclude Include="\rpcs3qt\*.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -1065,6 +1065,9 @@
<ClCompile Include="Input\gui_pad_thread.cpp"> <ClCompile Include="Input\gui_pad_thread.cpp">
<Filter>Io</Filter> <Filter>Io</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="util\console.cpp">
<Filter>rpcs3</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Input\ds4_pad_handler.h"> <ClInclude Include="Input\ds4_pad_handler.h">
@ -1241,9 +1244,6 @@
<ClInclude Include="rpcs3qt\movie_item_base.h"> <ClInclude Include="rpcs3qt\movie_item_base.h">
<Filter>Gui\custom items</Filter> <Filter>Gui\custom items</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="rpcs3qt\midi_creator.h">
<Filter>Gui\settings</Filter>
</ClInclude>
<ClInclude Include="Input\skateboard_pad_handler.h"> <ClInclude Include="Input\skateboard_pad_handler.h">
<Filter>Io\Skateboard</Filter> <Filter>Io\Skateboard</Filter>
</ClInclude> </ClInclude>
@ -1253,6 +1253,9 @@
<ClInclude Include="Input\gui_pad_thread.h"> <ClInclude Include="Input\gui_pad_thread.h">
<Filter>Io</Filter> <Filter>Io</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="util\console.h">
<Filter>rpcs3</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<CustomBuild Include="debug\moc_predefs.h.cbt"> <CustomBuild Include="debug\moc_predefs.h.cbt">
@ -1555,6 +1558,9 @@
<CustomBuild Include="rpcs3qt\emulated_pad_settings_dialog.h"> <CustomBuild Include="rpcs3qt\emulated_pad_settings_dialog.h">
<Filter>Gui\settings</Filter> <Filter>Gui\settings</Filter>
</CustomBuild> </CustomBuild>
<CustomBuild Include="rpcs3qt\midi_creator.h">
<Filter>Gui\settings</Filter>
</CustomBuild>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Image Include="rpcs3.ico" /> <Image Include="rpcs3.ico" />

View file

@ -21,6 +21,7 @@
#include "Emu/Io/Null/null_music_handler.h" #include "Emu/Io/Null/null_music_handler.h"
#include "Emu/vfs_config.h" #include "Emu/vfs_config.h"
#include "util/init_mutex.hpp" #include "util/init_mutex.hpp"
#include "util/console.h"
#include "Input/raw_mouse_handler.h" #include "Input/raw_mouse_handler.h"
#include "trophy_notification_helper.h" #include "trophy_notification_helper.h"
#include "save_data_dialog.h" #include "save_data_dialog.h"
@ -116,16 +117,11 @@ bool gui_application::Init()
return false; return false;
} }
#ifdef _WIN32
if (m_gui_settings->GetValue(gui::m_attachCommandLine).toBool()) if (m_gui_settings->GetValue(gui::m_attachCommandLine).toBool())
{ {
if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) utils::attach_console(utils::console_stream::std_err, true);
{
[[maybe_unused]] const auto con_out = freopen("CONOUT$", "w", stderr);
}
} }
else else
#endif
{ {
m_gui_settings->SetValue(gui::m_attachCommandLine, false); m_gui_settings->SetValue(gui::m_attachCommandLine, false);
} }

39
rpcs3/util/console.cpp Normal file
View file

@ -0,0 +1,39 @@
#include "console.h"
#ifdef _WIN32
#include "Windows.h"
#include <stdio.h>
#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
}
}

13
rpcs3/util/console.h Normal file
View file

@ -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);
}