[UI] Loop thread to main thread WindowedAppContext
This commit is contained in:
64
src/xenia/ui/windowed_app_main_posix.cc
Normal file
64
src/xenia/ui/windowed_app_main_posix.cc
Normal file
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2021 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <memory>
|
||||
|
||||
#include "xenia/base/cvar.h"
|
||||
#include "xenia/base/logging.h"
|
||||
#include "xenia/ui/windowed_app.h"
|
||||
#include "xenia/ui/windowed_app_context_gtk.h"
|
||||
|
||||
extern "C" int main(int argc_pre_gtk, char** argv_pre_gtk) {
|
||||
// Initialize GTK+, which will handle and remove its own arguments from argv.
|
||||
// Both GTK+ and Xenia use --option=value argument format (see man
|
||||
// gtk-options), however, it's meaningless to try to parse the same argument
|
||||
// both as a GTK+ one and as a cvar. Make GTK+ options take precedence in case
|
||||
// of a name collision, as there's an alternative way of setting Xenia options
|
||||
// (the config).
|
||||
int argc_post_gtk = argc_pre_gtk;
|
||||
char** argv_post_gtk = argv_pre_gtk;
|
||||
if (!gtk_init_check(&argc_post_gtk, &argv_post_gtk)) {
|
||||
// Logging has not been initialized yet.
|
||||
std::fputs("Failed to initialize GTK+\n", stderr);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
int result;
|
||||
|
||||
{
|
||||
xe::ui::GTKWindowedAppContext app_context;
|
||||
|
||||
std::unique_ptr<xe::ui::WindowedApp> app =
|
||||
xe::ui::GetWindowedAppCreator()(app_context);
|
||||
|
||||
cvar::ParseLaunchArguments(argc_post_gtk, argv_post_gtk,
|
||||
app->GetPositionalOptionsUsage(),
|
||||
app->GetPositionalOptions());
|
||||
|
||||
// Initialize logging. Needs parsed cvars.
|
||||
xe::InitializeLogging(app->GetName());
|
||||
|
||||
if (app->OnInitialize()) {
|
||||
app_context.RunMainGTKLoop();
|
||||
result = EXIT_SUCCESS;
|
||||
} else {
|
||||
result = EXIT_FAILURE;
|
||||
}
|
||||
|
||||
app->InvokeOnDestroy();
|
||||
}
|
||||
|
||||
// Logging may still be needed in the destructors.
|
||||
xe::ShutdownLogging();
|
||||
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user