package io.gitlab.jfronny.inceptum.gtk; import org.gtk.gio.ApplicationFlags; import org.gtk.glib.GLib; import org.gtk.gtk.Application; import io.gitlab.jfronny.inceptum.common.*; import io.gitlab.jfronny.inceptum.gtk.window.MainWindow; import io.gitlab.jfronny.inceptum.launcher.LauncherEnv; import java.io.IOException; import java.util.*; public class GtkMain { public static final String ID = "io.gitlab.jfronny.inceptum"; private static final Queue SCHEDULED = new ArrayDeque<>(); public static void main(String[] args) throws IOException { LauncherEnv.initialize(GtkEnvBackend.INSTANCE); Utils.LOGGER.info("Launching Inceptum v" + BuildMetadata.VERSION); Utils.LOGGER.info("Loading from " + MetaHolder.BASE_PATH); //TODO look into java-gtk samples for window architecture int statusCode = -1; try { statusCode = showGui(args); } finally { LauncherEnv.terminate(); System.exit(statusCode); } } public static void schedule(Runnable task) { SCHEDULED.add(Objects.requireNonNull(task)); } public static int showGui(String[] args) throws IOException { var app = new Application(ID, ApplicationFlags.FLAGS_NONE); app.onActivate($ -> { GtkMenubar.create(app); var window = new MainWindow(app); window.show(); GLib.idleAdd(data -> { Runnable r; while ((r = SCHEDULED.poll()) != null) { try { r.run(); } catch (Throwable t) { Utils.LOGGER.error("Could not run scheduled task", t); } } return true; }, null); GtkEnvBackend.INSTANCE.dialogParent = window; window.onCloseRequest($1 -> { GtkEnvBackend.INSTANCE.dialogParent = null; app.quit(); return false; }); }); return app.run(args.length, args); } }