Fixed icon scaling issues (#2) for windows using native tray implementation. Text still might be incorrect size.

This commit is contained in:
nathan 2018-10-22 11:23:11 +02:00
parent 350ab142d8
commit c7788b2935
2 changed files with 28 additions and 16 deletions

View File

@ -449,19 +449,21 @@ class SystemTray {
} }
boolean isNix = OS.isLinux() || OS.isUnix(); boolean isNix = OS.isLinux() || OS.isUnix();
boolean isWindows = OS.isWindows();
boolean isMacOsX = OS.isMacOsX();
// Windows can ONLY use Swing (non-native) - AWT/native looks absolutely horrid and is not an option // Windows can ONLY use Swing (non-native) or WindowsNotifyIcon (native) - AWT looks absolutely horrid and is not an option
// OSx can use Swing (non-native) or AWT (native) . // OSx can use Swing (non-native) or AWT (native).
// Linux can use Swing (non-native), AWT (native), GtkStatusIcon (native), or AppIndicator (native) // Linux can use Swing (non-native), AWT (native), GtkStatusIcon (native), or AppIndicator (native)
if (OS.isWindows()) { if (isWindows) {
if (FORCE_TRAY_TYPE != TrayType.AutoDetect && FORCE_TRAY_TYPE != TrayType.Swing) { if (FORCE_TRAY_TYPE != TrayType.AutoDetect && FORCE_TRAY_TYPE != TrayType.Swing && FORCE_TRAY_TYPE != TrayType.WindowsNotifyIcon) {
// windows MUST use swing only! // windows MUST use swing/windows-notify-icon only!
FORCE_TRAY_TYPE = TrayType.AutoDetect; FORCE_TRAY_TYPE = TrayType.AutoDetect;
logger.warn("Windows cannot use the '" + FORCE_TRAY_TYPE + "' SystemTray type, defaulting to native implementation"); logger.warn("Windows cannot use the '" + FORCE_TRAY_TYPE + "' SystemTray type, defaulting to swing implementation");
} }
} }
else if (OS.isMacOsX()) { else if (isMacOsX) {
// cannot mix Swing/AWT and JavaFX for MacOSX in java7 (fixed in java8) without special stuff. // cannot mix Swing/AWT and JavaFX for MacOSX in java7 (fixed in java8) without special stuff.
// https://bugs.openjdk.java.net/browse/JDK-8116017 // https://bugs.openjdk.java.net/browse/JDK-8116017
// https://bugs.openjdk.java.net/browse/JDK-8118714 // https://bugs.openjdk.java.net/browse/JDK-8118714
@ -487,7 +489,7 @@ class SystemTray {
// Of note, v4.3 is the "last released" version of SWT by eclipse AND IT WILL NOT WORK!! // Of note, v4.3 is the "last released" version of SWT by eclipse AND IT WILL NOT WORK!!
// for NEWER versions of SWT via maven, use http://maven-eclipse.github.io/maven // for NEWER versions of SWT via maven, use http://maven-eclipse.github.io/maven
if (Swt.getVersion() < 4430) { if (Swt.getVersion() < 4430) {
logger.error("Unable to use currently loaded version of SWT, it is TOO OLD. Please use version 4.4+."); logger.error("Unable to use currently loaded version of SWT, it is TOO OLD. Please use version 4.4+");
systemTrayMenu = null; systemTrayMenu = null;
systemTray = null; systemTray = null;
@ -906,11 +908,12 @@ class SystemTray {
// have to make adjustments BEFORE the tray/menu image size calculations // have to make adjustments BEFORE the tray/menu image size calculations
if (AUTO_FIX_INCONSISTENCIES && isTrayType(trayType, TrayType.Swing) && SystemTray.SWING_UI == null) { if (AUTO_FIX_INCONSISTENCIES && SystemTray.SWING_UI == null) {
if (isNix) { if (isNix && isTrayType(trayType, TrayType.Swing)) {
SystemTray.SWING_UI = new LinuxSwingUI(); SystemTray.SWING_UI = new LinuxSwingUI();
} }
else if (OS.isWindows()) { else if (isWindows &&
(isTrayType(trayType, TrayType.Swing) || isTrayType(trayType, TrayType.WindowsNotifyIcon))) {
SystemTray.SWING_UI = new WindowsSwingUI(); SystemTray.SWING_UI = new WindowsSwingUI();
} }
} }
@ -927,12 +930,14 @@ class SystemTray {
if (AUTO_FIX_INCONSISTENCIES) { if (AUTO_FIX_INCONSISTENCIES) {
// this logic has to be before we create the system Tray, but after GTK is started (if applicable) // this logic has to be before we create the system Tray, but after GTK is started (if applicable)
if (OS.isWindows() && (isTrayType(trayType, TrayType.AWT) || isTrayType(trayType, TrayType.Swing))) { if (isWindows && isTrayType(trayType, TrayType.Swing)) {
// Our default for windows is now a native tray icon (instead of the swing tray icon). // we don't permit AWT for windows (it looks absolutely HORRID)
// Our default for windows is now a native tray icon (instead of the swing tray icon), but we preserve the use of Swing
// windows hard-codes the image size for AWT/SWING tray types // windows hard-codes the image size for AWT/SWING tray types
SystemTrayFixes.fixWindows(trayImageSize); SystemTrayFixes.fixWindows(trayImageSize);
} }
else if (OS.isMacOsX() && (isTrayType(trayType, TrayType.AWT) || isTrayType(trayType, TrayType.Swing))) { else if (isMacOsX && (isTrayType(trayType, TrayType.AWT) || isTrayType(trayType, TrayType.Swing))) {
// macosx doesn't respond to all buttons (but should) // macosx doesn't respond to all buttons (but should)
SystemTrayFixes.fixMacOS(); SystemTrayFixes.fixMacOS();
} }
@ -987,6 +992,10 @@ class SystemTray {
} }
}); });
} else if (isTrayType(trayType, TrayType.WindowsNotifyIcon)) { } else if (isTrayType(trayType, TrayType.WindowsNotifyIcon)) {
// ensure AWT toolkit is initialized.
java.awt.Toolkit.getDefaultToolkit();
// difference from above, is we do not need to do anything inside the swing EDT
try { try {
reference.set((Tray) trayType.getConstructors()[0].newInstance(systemTray)); reference.set((Tray) trayType.getConstructors()[0].newInstance(systemTray));
} catch (Exception e) { } catch (Exception e) {
@ -1036,7 +1045,7 @@ class SystemTray {
} }
}); });
} }
else if (isTrayType(trayType, TrayType.Swing)) { else if (isTrayType(trayType, TrayType.Swing) || isTrayType(trayType, TrayType.WindowsNotifyIcon)) {
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override @Override
public public

View File

@ -32,6 +32,7 @@ import javax.swing.JMenuItem;
import dorkbox.systemTray.SystemTray; import dorkbox.systemTray.SystemTray;
import dorkbox.systemTray.Tray; import dorkbox.systemTray.Tray;
import dorkbox.systemTray.ui.swing._SwingTray; import dorkbox.systemTray.ui.swing._SwingTray;
import dorkbox.systemTray.ui.swing._WindowsNativeTray;
import dorkbox.util.OS; import dorkbox.util.OS;
import dorkbox.util.SwingUtil; import dorkbox.util.SwingUtil;
import dorkbox.util.jna.linux.GtkTheme; import dorkbox.util.jna.linux.GtkTheme;
@ -108,10 +109,12 @@ class SizeAndScalingUtil {
TRAY_SIZE = 32; TRAY_SIZE = 32;
} }
} }
if (TRAY_SIZE == 0) { if (TRAY_SIZE == 0) {
// reasonable default // reasonable default
TRAY_SIZE = 32; TRAY_SIZE = 32;
} }
return TRAY_SIZE; return TRAY_SIZE;
} }
@ -128,7 +131,7 @@ class SizeAndScalingUtil {
TRAY_MENU_SIZE = 16; TRAY_MENU_SIZE = 16;
} }
} }
else if ((trayType == _SwingTray.class)) { else if ((trayType == _SwingTray.class) || (trayType == _WindowsNativeTray.class)) {
// Java does not scale the menu item IMAGE **AT ALL**, we must provide the correct size to begin with // Java does not scale the menu item IMAGE **AT ALL**, we must provide the correct size to begin with
if (OS.isWindows()) { if (OS.isWindows()) {