Added major/minor/micro version info to GTK class. Added/removed methods
. Code polish
This commit is contained in:
parent
d4eb672882
commit
99b80c807a
|
@ -24,6 +24,7 @@ import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import com.sun.jna.Function;
|
import com.sun.jna.Function;
|
||||||
|
import com.sun.jna.NativeLibrary;
|
||||||
import com.sun.jna.Pointer;
|
import com.sun.jna.Pointer;
|
||||||
|
|
||||||
import dorkbox.systemTray.Entry;
|
import dorkbox.systemTray.Entry;
|
||||||
|
@ -38,14 +39,13 @@ import dorkbox.util.jna.JnaHelper;
|
||||||
* <p>
|
* <p>
|
||||||
* Direct-mapping, See: https://github.com/java-native-access/jna/blob/master/www/DirectMapping.md
|
* Direct-mapping, See: https://github.com/java-native-access/jna/blob/master/www/DirectMapping.md
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"Duplicates", "SameParameterValue", "DanglingJavadoc", "DeprecatedIsStillUsed"})
|
@SuppressWarnings({"Duplicates", "SameParameterValue", "DeprecatedIsStillUsed"})
|
||||||
public
|
public
|
||||||
class Gtk {
|
class Gtk {
|
||||||
// For funsies to look at, SyncThing did a LOT of work on compatibility in python (unfortunate for us, but interesting).
|
// For funsies to look at, SyncThing did a LOT of work on compatibility in python (unfortunate for us, but interesting).
|
||||||
// https://github.com/syncthing/syncthing-gtk/blob/b7a3bc00e3bb6d62365ae62b5395370f3dcc7f55/syncthing_gtk/statusicon.py
|
// https://github.com/syncthing/syncthing-gtk/blob/b7a3bc00e3bb6d62365ae62b5395370f3dcc7f55/syncthing_gtk/statusicon.py
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public static class State {
|
public static class State {
|
||||||
public static final int NORMAL = 0x0; // normal state.
|
public static final int NORMAL = 0x0; // normal state.
|
||||||
public static final int ACTIVE = 0x1; // pressed-in or activated; e.g. buttons while the mouse button is held down.
|
public static final int ACTIVE = 0x1; // pressed-in or activated; e.g. buttons while the mouse button is held down.
|
||||||
|
@ -76,18 +76,21 @@ class Gtk {
|
||||||
|
|
||||||
// objdump -T /usr/local/lib/libgtk-3.so.0 | grep gtk
|
// objdump -T /usr/local/lib/libgtk-3.so.0 | grep gtk
|
||||||
|
|
||||||
@SuppressWarnings("WeakerAccess")
|
|
||||||
public static final int FALSE = 0;
|
public static final int FALSE = 0;
|
||||||
public static final int TRUE = 1;
|
public static final int TRUE = 1;
|
||||||
private static final boolean alreadyRunningGTK;
|
private static final boolean alreadyRunningGTK;
|
||||||
|
|
||||||
// when debugging the EDT, we need a longer timeout.
|
// when debugging the EDT, we need a longer timeout.
|
||||||
private static final boolean debugEDT = true;
|
private static final boolean debugEDT = true;
|
||||||
|
|
||||||
// timeout is in seconds
|
// timeout is in seconds
|
||||||
private static final int TIMEOUT = debugEDT ? 10000000 : 2;
|
private static final int TIMEOUT = debugEDT ? 10000000 : 2;
|
||||||
|
|
||||||
// have to save these in a field to prevent GC on the objects (since they go out-of-scope from java)
|
// have to save these in a field to prevent GC on the objects (since they go out-of-scope from java)
|
||||||
@SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
|
|
||||||
private static final LinkedList<Object> gtkCallbacks = new LinkedList<Object>();
|
private static final LinkedList<Object> gtkCallbacks = new LinkedList<Object>();
|
||||||
|
|
||||||
public static Function gtk_status_icon_position_menu = null;
|
public static Function gtk_status_icon_position_menu = null;
|
||||||
|
|
||||||
// This is required because the EDT needs to have it's own value for this boolean, that is a different value than the main thread
|
// This is required because the EDT needs to have it's own value for this boolean, that is a different value than the main thread
|
||||||
private static ThreadLocal<Boolean> isDispatch = new ThreadLocal<Boolean>() {
|
private static ThreadLocal<Boolean> isDispatch = new ThreadLocal<Boolean>() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -96,11 +99,16 @@ class Gtk {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private static volatile boolean started = false;
|
private static volatile boolean started = false;
|
||||||
@SuppressWarnings("FieldCanBeLocal")
|
|
||||||
private static Thread gtkUpdateThread = null;
|
private static Thread gtkUpdateThread = null;
|
||||||
|
|
||||||
/**
|
public static final int MAJOR;
|
||||||
|
public static final int MINOR;
|
||||||
|
public static final int MICRO;
|
||||||
|
|
||||||
|
/*
|
||||||
* We can have GTK v3 or v2.
|
* We can have GTK v3 or v2.
|
||||||
*
|
*
|
||||||
* Observations:
|
* Observations:
|
||||||
|
@ -112,6 +120,9 @@ class Gtk {
|
||||||
boolean _isGtk2 = false;
|
boolean _isGtk2 = false;
|
||||||
boolean _isLoaded = false;
|
boolean _isLoaded = false;
|
||||||
boolean _alreadyRunningGTK = false;
|
boolean _alreadyRunningGTK = false;
|
||||||
|
int major = 0;
|
||||||
|
int minor = 0;
|
||||||
|
int micro = 0;
|
||||||
|
|
||||||
boolean shouldLoadGtk = !(OS.isWindows() || OS.isMacOsX());
|
boolean shouldLoadGtk = !(OS.isWindows() || OS.isMacOsX());
|
||||||
if (!shouldLoadGtk) {
|
if (!shouldLoadGtk) {
|
||||||
|
@ -124,6 +135,7 @@ class Gtk {
|
||||||
if (SystemTray.DEBUG) {
|
if (SystemTray.DEBUG) {
|
||||||
logger.debug("Not loading GTK for Swing or AWT");
|
logger.debug("Not loading GTK for Swing or AWT");
|
||||||
}
|
}
|
||||||
|
shouldLoadGtk = false;
|
||||||
_isLoaded = true;
|
_isLoaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,7 +146,7 @@ class Gtk {
|
||||||
|
|
||||||
if (!_isLoaded && shouldUseGtk2) {
|
if (!_isLoaded && shouldUseGtk2) {
|
||||||
try {
|
try {
|
||||||
JnaHelper.register(gtk2LibName, Gtk.class);
|
NativeLibrary library = JnaHelper.register(gtk2LibName, Gtk.class);
|
||||||
gtk_status_icon_position_menu = Function.getFunction(gtk2LibName, "gtk_status_icon_position_menu");
|
gtk_status_icon_position_menu = Function.getFunction(gtk2LibName, "gtk_status_icon_position_menu");
|
||||||
_isGtk2 = true;
|
_isGtk2 = true;
|
||||||
|
|
||||||
|
@ -143,6 +155,10 @@ class Gtk {
|
||||||
_alreadyRunningGTK = gtk_main_level() != 0;
|
_alreadyRunningGTK = gtk_main_level() != 0;
|
||||||
_isLoaded = true;
|
_isLoaded = true;
|
||||||
|
|
||||||
|
major = library.getGlobalVariableAddress("gtk_major_version").getInt(0);
|
||||||
|
minor = library.getGlobalVariableAddress("gtk_minor_version").getInt(0);
|
||||||
|
micro = library.getGlobalVariableAddress("gtk_micro_version").getInt(0);
|
||||||
|
|
||||||
if (SystemTray.DEBUG) {
|
if (SystemTray.DEBUG) {
|
||||||
logger.debug("GTK: {}", gtk2LibName);
|
logger.debug("GTK: {}", gtk2LibName);
|
||||||
}
|
}
|
||||||
|
@ -171,6 +187,10 @@ class Gtk {
|
||||||
_alreadyRunningGTK = gtk_main_level() != 0;
|
_alreadyRunningGTK = gtk_main_level() != 0;
|
||||||
_isLoaded = true;
|
_isLoaded = true;
|
||||||
|
|
||||||
|
major = Gtk3.gtk_get_major_version();
|
||||||
|
minor = Gtk3.gtk_get_minor_version();
|
||||||
|
micro = Gtk3.gtk_get_micro_version();
|
||||||
|
|
||||||
if (SystemTray.DEBUG) {
|
if (SystemTray.DEBUG) {
|
||||||
logger.debug("GTK: {}", gtk3LibName);
|
logger.debug("GTK: {}", gtk3LibName);
|
||||||
}
|
}
|
||||||
|
@ -184,7 +204,7 @@ class Gtk {
|
||||||
// now version 2
|
// now version 2
|
||||||
if (!_isLoaded) {
|
if (!_isLoaded) {
|
||||||
try {
|
try {
|
||||||
JnaHelper.register(gtk2LibName, Gtk.class);
|
NativeLibrary library = JnaHelper.register(gtk2LibName, Gtk.class);
|
||||||
gtk_status_icon_position_menu = Function.getFunction(gtk2LibName, "gtk_status_icon_position_menu");
|
gtk_status_icon_position_menu = Function.getFunction(gtk2LibName, "gtk_status_icon_position_menu");
|
||||||
_isGtk2 = true;
|
_isGtk2 = true;
|
||||||
|
|
||||||
|
@ -193,6 +213,10 @@ class Gtk {
|
||||||
_alreadyRunningGTK = gtk_main_level() != 0;
|
_alreadyRunningGTK = gtk_main_level() != 0;
|
||||||
_isLoaded = true;
|
_isLoaded = true;
|
||||||
|
|
||||||
|
major = library.getGlobalVariableAddress("gtk_major_version").getInt(0);
|
||||||
|
minor = library.getGlobalVariableAddress("gtk_minor_version").getInt(0);
|
||||||
|
micro = library.getGlobalVariableAddress("gtk_micro_version").getInt(0);
|
||||||
|
|
||||||
if (SystemTray.DEBUG) {
|
if (SystemTray.DEBUG) {
|
||||||
logger.debug("GTK: {}", gtk2LibName);
|
logger.debug("GTK: {}", gtk2LibName);
|
||||||
}
|
}
|
||||||
|
@ -217,6 +241,10 @@ class Gtk {
|
||||||
alreadyRunningGTK = _alreadyRunningGTK;
|
alreadyRunningGTK = _alreadyRunningGTK;
|
||||||
isGtk2 = _isGtk2;
|
isGtk2 = _isGtk2;
|
||||||
isGtk3 = !_isGtk2;
|
isGtk3 = !_isGtk2;
|
||||||
|
|
||||||
|
MAJOR = major;
|
||||||
|
MINOR = minor;
|
||||||
|
MICRO = micro;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
isLoaded = false;
|
isLoaded = false;
|
||||||
|
@ -224,11 +252,22 @@ class Gtk {
|
||||||
alreadyRunningGTK = false;
|
alreadyRunningGTK = false;
|
||||||
isGtk2 = false;
|
isGtk2 = false;
|
||||||
isGtk3 = false;
|
isGtk3 = false;
|
||||||
|
|
||||||
|
MAJOR = 0;
|
||||||
|
MINOR = 0;
|
||||||
|
MICRO = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shouldLoadGtk && !_isLoaded) {
|
if (shouldLoadGtk) {
|
||||||
throw new RuntimeException("We apologize for this, but we are unable to determine the GTK library is in use, " +
|
// now we output what version of GTK we have loaded.
|
||||||
"or even if it is in use... Please create an issue for this and include your OS type and configuration.");
|
if (SystemTray.DEBUG) {
|
||||||
|
SystemTray.logger.debug("GTK Version: " + MAJOR + "." + MINOR + "." + MICRO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_isLoaded) {
|
||||||
|
throw new RuntimeException("We apologize for this, but we are unable to determine the GTK library is in use, " +
|
||||||
|
"or even if it is in use... Please create an issue for this and include your OS type and configuration.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -568,7 +607,6 @@ class Gtk {
|
||||||
public static native
|
public static native
|
||||||
Pointer gtk_menu_new();
|
Pointer gtk_menu_new();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets or replaces the menu item’s submenu, or removes it when a NULL submenu is passed.
|
* Sets or replaces the menu item’s submenu, or removes it when a NULL submenu is passed.
|
||||||
*/
|
*/
|
||||||
|
@ -646,16 +684,37 @@ class Gtk {
|
||||||
Pointer gtk_status_icon_new();
|
Pointer gtk_status_icon_new();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the size in pixels that is available for the image. Stock icons and named icons adapt their size automatically if the size of
|
* Obtains the root window (parent all other windows are inside) for the default display and screen.
|
||||||
* the notification area changes. For other storage types, the size-changed signal can be used to react to size changes.
|
*
|
||||||
* Note that the returned size is only meaningful while the status icon is embedded (see gtk_status_icon_is_embedded()).
|
* @return the default root window
|
||||||
* <p>
|
|
||||||
* gtk_status_icon_get_size has been deprecated since version 3.14 and should not be used in newly-written code.
|
|
||||||
* Use notifications
|
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
|
||||||
public static native
|
public static native
|
||||||
int gtk_status_icon_get_size(Pointer status_icon);
|
Pointer gdk_get_default_root_window();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the default screen for the default display. (See gdk_display_get_default()).
|
||||||
|
*
|
||||||
|
* @return a GdkScreen, or NULL if there is no default display.
|
||||||
|
*
|
||||||
|
* @since 2.2
|
||||||
|
*/
|
||||||
|
public static native
|
||||||
|
Pointer gdk_screen_get_default();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the resolution for font handling on the screen; see gdk_screen_set_resolution() for full details.
|
||||||
|
*
|
||||||
|
* IE:
|
||||||
|
*
|
||||||
|
* The resolution for font handling on the screen. This is a scale factor between points specified in a PangoFontDescription and
|
||||||
|
* cairo units. The default value is 96, meaning that a 10 point font will be 13 units high. (10 * 96. / 72. = 13.3).
|
||||||
|
*
|
||||||
|
* @return the current resolution, or -1 if no resolution has been set.
|
||||||
|
*
|
||||||
|
* @since Since: 2.10
|
||||||
|
*/
|
||||||
|
public static native
|
||||||
|
double gdk_screen_get_resolution(Pointer screen);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes status_icon display the file filename . See gtk_status_icon_new_from_file() for details.
|
* Makes status_icon display the file filename . See gtk_status_icon_new_from_file() for details.
|
||||||
|
@ -678,7 +737,6 @@ class Gtk {
|
||||||
void gtk_status_icon_set_visible(Pointer widget, boolean visible);
|
void gtk_status_icon_set_visible(Pointer widget, boolean visible);
|
||||||
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
/**
|
/**
|
||||||
* Sets text as the contents of the tooltip.
|
* Sets text as the contents of the tooltip.
|
||||||
* This function will take care of setting “has-tooltip” to TRUE and of the default handler for the “query-tooltip” signal.
|
* This function will take care of setting “has-tooltip” to TRUE and of the default handler for the “query-tooltip” signal.
|
||||||
|
@ -687,7 +745,9 @@ class Gtk {
|
||||||
*
|
*
|
||||||
* gtk_status_icon_set_tooltip_text has been deprecated since version 3.14 and should not be used in newly-written code.
|
* gtk_status_icon_set_tooltip_text has been deprecated since version 3.14 and should not be used in newly-written code.
|
||||||
* Use notifications
|
* Use notifications
|
||||||
*/ public static native
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public static native
|
||||||
void gtk_status_icon_set_tooltip_text(Pointer widget, String tooltipText);
|
void gtk_status_icon_set_tooltip_text(Pointer widget, String tooltipText);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -780,13 +840,12 @@ class Gtk {
|
||||||
void gtk_widget_destroy(Pointer widget);
|
void gtk_widget_destroy(Pointer widget);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the GtkSettings object for the default GDK screen, creating it if necessary. See gtk_settings_get_for_screen().
|
* Gets the GtkSettings object for screen , creating it if necessary.
|
||||||
* <p>
|
*
|
||||||
* If there is no default screen, then returns NULL.
|
* @since 2.2
|
||||||
*/
|
*/
|
||||||
public static native
|
public static native
|
||||||
Pointer gtk_settings_get_default();
|
Pointer gtk_settings_get_for_screen(Pointer screen);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simply an accessor function that returns @widget->style.
|
* Simply an accessor function that returns @widget->style.
|
||||||
|
@ -801,14 +860,6 @@ class Gtk {
|
||||||
public static native
|
public static native
|
||||||
Pointer gtk_rc_get_style(Pointer widget);
|
Pointer gtk_rc_get_style(Pointer widget);
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a toplevel container widget that is used to retrieve snapshots of widgets without showing them on the screen.
|
|
||||||
*
|
|
||||||
* @since 2.20
|
|
||||||
*/
|
|
||||||
public static native
|
|
||||||
Pointer gtk_offscreen_window_new();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Looks up color_name in the style’s logical color mappings, filling in color and returning TRUE if found, otherwise returning
|
* Looks up color_name in the style’s logical color mappings, filling in color and returning TRUE if found, otherwise returning
|
||||||
* FALSE. Do not cache the found mapping, because it depends on the GtkStyle and might change when a theme switch occurs.
|
* FALSE. Do not cache the found mapping, because it depends on the GtkStyle and might change when a theme switch occurs.
|
||||||
|
|
|
@ -27,6 +27,11 @@ class Gtk3 {
|
||||||
// objdump -T /usr/lib/x86_64-linux-gnu/libgtk-3.so.0 | grep gtk
|
// objdump -T /usr/lib/x86_64-linux-gnu/libgtk-3.so.0 | grep gtk
|
||||||
// objdump -T /usr/local/lib/libgtk-3.so.0 | grep gtk
|
// objdump -T /usr/local/lib/libgtk-3.so.0 | grep gtk
|
||||||
|
|
||||||
|
public static native int gtk_get_major_version();
|
||||||
|
public static native int gtk_get_minor_version();
|
||||||
|
public static native int gtk_get_micro_version();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads a theme from the usual theme paths
|
* Loads a theme from the usual theme paths
|
||||||
*
|
*
|
||||||
|
@ -83,4 +88,21 @@ class Gtk3 {
|
||||||
* @since 3.0 (but not in the documentation...)
|
* @since 3.0 (but not in the documentation...)
|
||||||
*/
|
*/
|
||||||
public static native Pointer gtk_widget_get_style_context(Pointer widget);
|
public static native Pointer gtk_widget_get_style_context(Pointer widget);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the internal scale factor that maps from window coordinates to the actual device pixels. On traditional systems this is 1,
|
||||||
|
* but on very high density outputs this can be a higher value (often 2).
|
||||||
|
*
|
||||||
|
* A higher value means that drawing is automatically scaled up to a higher resolution, so any code doing drawing will automatically
|
||||||
|
* look nicer. However, if you are supplying pixel-based data the scale value can be used to determine whether to use a pixel
|
||||||
|
* resource with higher resolution data.
|
||||||
|
*
|
||||||
|
* The scale of a window may change during runtime, if this happens a configure event will be sent to the toplevel window.
|
||||||
|
*
|
||||||
|
* @return the scale factor
|
||||||
|
*
|
||||||
|
* @since 3.10
|
||||||
|
*/
|
||||||
|
public static native
|
||||||
|
int gdk_window_get_scale_factor (Pointer window);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user