Duckstation/src/duckstation-qt/main.cpp

117 lines
3.3 KiB
C++
Raw Normal View History

2021-01-31 06:10:50 +00:00
#include "common/crash_handler.h"
2019-12-31 06:17:17 +00:00
#include "mainwindow.h"
#include "qthostinterface.h"
#include "qtutils.h"
2019-12-31 06:17:17 +00:00
#include <QtWidgets/QApplication>
#include <QtWidgets/QMessageBox>
2021-02-28 09:55:26 +00:00
#include <csignal>
2021-02-28 09:00:54 +00:00
#include <cstdio>
#include <cstdlib>
2019-12-31 06:17:17 +00:00
#include <memory>
static bool ParseCommandLineParameters(QApplication& app, QtHostInterface* host_interface,
std::unique_ptr<SystemBootParameters>* boot_params)
{
const QStringList args(app.arguments());
std::vector<std::string> converted_args;
std::vector<char*> converted_argv;
converted_args.reserve(args.size());
converted_argv.reserve(args.size());
for (const QString& arg : args)
converted_args.push_back(arg.toStdString());
for (std::string& arg : converted_args)
converted_argv.push_back(arg.data());
return host_interface->ParseCommandLineParameters(args.size(), converted_argv.data(), boot_params);
}
2021-02-28 09:00:54 +00:00
static void SignalHandler(int signal)
{
// First try the normal (graceful) shutdown/exit.
static bool graceful_shutdown_attempted = false;
if (!graceful_shutdown_attempted)
{
std::fprintf(stderr, "Received CTRL+C, attempting graceful shutdown. Press CTRL+C again to force.\n");
graceful_shutdown_attempted = true;
QtHostInterface::GetInstance()->requestExit();
return;
}
std::signal(signal, SIG_DFL);
2021-02-28 09:55:26 +00:00
// MacOS is missing std::quick_exit() despite it being C++11...
#ifndef __APPLE__
2021-02-28 09:00:54 +00:00
std::quick_exit(1);
2021-02-28 09:55:26 +00:00
#else
_Exit(1);
#endif
2021-02-28 09:00:54 +00:00
}
static void HookSignals()
{
std::signal(SIGINT, SignalHandler);
std::signal(SIGTERM, SignalHandler);
}
2019-12-31 06:17:17 +00:00
int main(int argc, char* argv[])
{
2021-01-31 06:10:50 +00:00
CrashHandler::Install();
// Register any standard types we need elsewhere
qRegisterMetaType<std::optional<bool>>();
2020-10-19 15:14:49 +00:00
qRegisterMetaType<std::function<void()>>();
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
2020-09-09 14:07:52 +00:00
QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
#endif
2020-01-03 07:51:42 +00:00
2019-12-31 06:17:17 +00:00
QApplication app(argc, argv);
#ifdef _WIN32
// Use Segoe UI on Windows rather than MS Shell Dlg 2, courtesy of Dolphin.
// Can be removed once switched to Qt 6.
QApplication::setFont(QApplication::font("QMenu"));
#endif
2019-12-31 06:17:17 +00:00
std::unique_ptr<QtHostInterface> host_interface = std::make_unique<QtHostInterface>();
std::unique_ptr<SystemBootParameters> boot_params;
if (!ParseCommandLineParameters(app, host_interface.get(), &boot_params))
return EXIT_FAILURE;
std::unique_ptr<MainWindow> window = std::make_unique<MainWindow>(host_interface.get());
if (!host_interface->Initialize())
{
host_interface->Shutdown();
QMessageBox::critical(nullptr, QObject::tr("DuckStation Error"),
QObject::tr("Failed to initialize host interface. Cannot continue."), QMessageBox::Ok);
return EXIT_FAILURE;
}
2019-12-31 06:17:17 +00:00
window->initializeAndShow();
2021-02-28 09:00:54 +00:00
HookSignals();
2019-12-31 06:17:17 +00:00
// if we're in batch mode, don't bother refreshing the game list as it won't be used
if (!host_interface->inBatchMode())
host_interface->refreshGameList();
if (boot_params)
{
host_interface->bootSystem(std::move(boot_params));
}
2020-08-06 12:08:22 +00:00
else
{
window->startupUpdateCheck();
}
int result = app.exec();
window.reset();
host_interface->Shutdown();
return result;
2019-12-31 06:17:17 +00:00
}