Inceptum/launcher-gtk/src/main/java/io/gitlab/jfronny/inceptum/gtk/GtkMain.java

61 lines
2.0 KiB
Java

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<Runnable> 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(() -> {
Runnable r;
while ((r = SCHEDULED.poll()) != null) {
try {
r.run();
} catch (Throwable t) {
Utils.LOGGER.error("Could not run scheduled task", t);
}
}
return true;
});
GtkEnvBackend.INSTANCE.dialogParent = window;
window.onCloseRequest(() -> {
GtkEnvBackend.INSTANCE.dialogParent = null;
app.quit();
return false;
});
});
return app.run(args.length, args);
}
}