Added GtkSupport.FORCE_GTK2, in case the developer needs to force it to use GTK2 (in which case, appindicator1 is tried first). Removed optional dispatch event loop.

This commit is contained in:
nathan 2016-02-13 17:39:10 +01:00
parent 176f64fd6e
commit f888de6482
2 changed files with 58 additions and 34 deletions

View File

@ -41,9 +41,21 @@ class AppIndicatorQuery {
// NOTE: GtkSupport uses this info to figure out WHAT VERSION OF GTK to use: appindiactor1 -> GTk2, appindicator3 -> GTK3.
if (GtkSupport.FORCE_GTK2) {
// try loading appindicator1 first, maybe it's there?
try {
library = Native.loadLibrary("appindicator1", AppIndicator.class);
if (library != null) {
return (AppIndicator) library;
}
} catch (Throwable ignored) {
}
}
// start with base version
try {
library = Native.loadLibrary("appindicator3", AppIndicator.class);
library = Native.loadLibrary("appindicator", AppIndicator.class);
if (library != null) {
String s = library.toString();
if (s.indexOf("appindicator3") > 0) {
@ -58,7 +70,6 @@ class AppIndicatorQuery {
// whoops. Symbolic links are bugged out. Look manually for it...
// version 1 is better than version 3, because of dumb shit redhat did.
try {
library = Native.loadLibrary("appindicator1", AppIndicator.class);
if (library != null) {

View File

@ -34,8 +34,8 @@ class GtkSupport {
private static volatile Thread gtkDispatchThread;
@Property
/** Enables/Disables the creation of a native GTK event loop. Useful if you are already creating one via SWT/etc. */
public static boolean CREATE_EVENT_LOOP = true;
/** Forces the system to always choose GTK2 (even when GTK3 might be available). SWT & JavaFX both use GTK2! */
public static boolean FORCE_GTK2 = false;
/**
* must call get() before accessing this! Only "Gtk" interface should access this!
@ -45,13 +45,30 @@ class GtkSupport {
public static volatile boolean isGtk2 = false;
/**
* Helper for GTK, because we could have v3 or v2
* Helper for GTK, because we could have v3 or v2.
*
* Observations: SWT & JavaFX both use GTK2, and we can't load GTK3 if GTK2 symbols are loaded
*/
@SuppressWarnings("Duplicates")
public static
Gtk get() {
Object library;
boolean shouldUseGtk2 = GtkSupport.FORCE_GTK2;
// in some cases, we ALWAYS want to try GTK2 first
if (shouldUseGtk2) {
try {
gtk_status_icon_position_menu = Function.getFunction("gtk-x11-2.0", "gtk_status_icon_position_menu");
library = Native.loadLibrary("gtk-x11-2.0", Gtk.class);
if (library != null) {
isGtk2 = true;
return (Gtk) library;
}
} catch (Throwable ignored) {
}
}
if (AppIndicatorQuery.isLoaded) {
if (AppIndicatorQuery.isVersion3) {
// appindicator3 requires GTK3
@ -133,7 +150,6 @@ class GtkSupport {
gtkDispatchThread.start();
if (CREATE_EVENT_LOOP) {
// startup the GTK GUI event loop. There can be multiple/nested loops.
final CountDownLatch blockUntilStarted = new CountDownLatch(1);
Thread gtkUpdateThread = new Thread() {
@ -165,7 +181,6 @@ class GtkSupport {
}
}
}
}
/**
* Best practices for GTK, is to call EVERYTHING for it on a SINGLE THREAD. This accomplishes that.
@ -181,9 +196,7 @@ class GtkSupport {
public static
void shutdownGui() {
if (CREATE_EVENT_LOOP) {
Gtk.INSTANCE.gtk_main_quit();
}
started = false;
gtkDispatchThread.interrupt();