From c0b3e9260cd4b4a7f1c370c0c1c782ee15841397 Mon Sep 17 00:00:00 2001 From: nathan Date: Sun, 25 Dec 2016 23:53:19 +0100 Subject: [PATCH] Updated comments, added BASIC support for Arch. --- src/dorkbox/systemTray/SystemTray.java | 82 +++++++++++++++++++++----- 1 file changed, 66 insertions(+), 16 deletions(-) diff --git a/src/dorkbox/systemTray/SystemTray.java b/src/dorkbox/systemTray/SystemTray.java index e46fcfd..bbf0009 100644 --- a/src/dorkbox/systemTray/SystemTray.java +++ b/src/dorkbox/systemTray/SystemTray.java @@ -94,11 +94,10 @@ class SystemTray { @Property /** Enables auto-detection for the system tray. This should be mostly successful. *

- * Auto-detection will use DEFAULT_WINDOWS_SIZE or DEFAULT_LINUX_SIZE as a 'base-line' for determining what size to use. On Linux, - * `gsettings get org.gnome.desktop.interface scaling-factor` is used to determine the scale factor (for HiDPI configurations). + * Auto-detection will use DEFAULT_TRAY_SIZE or DEFAULT_MENU_SIZE as a 'base-line' for determining what size to use. *

- * If auto-detection fails and the incorrect size is detected or used, disable this and specify the correct DEFAULT_WINDOWS_SIZE or - * DEFAULT_LINUX_SIZE to use them instead + * If auto-detection fails and the incorrect size is detected or used, disable this and specify the correct DEFAULT_TRAY_SIZE or + * DEFAULT_MENU_SIZE instead */ public static boolean AUTO_TRAY_SIZE = true; @@ -476,7 +475,7 @@ class SystemTray { // Fedora KDE requires GtkStatusIcon trayType = selectTypeQuietly(useNativeMenus, TrayType.GtkStatusIcon); } else { - // kde (at least, plasma 5.5.6) requires appindicator + // kde (at least, plasma 5.5.6) requires appindicator trayType = selectTypeQuietly(useNativeMenus, TrayType.AppIndicator); } @@ -487,7 +486,11 @@ class SystemTray { // http://bazaar.launchpad.net/~wingpanel-devs/wingpanel/trunk/view/head:/sample/SampleIndicator.vala if (!useNativeMenus && AUTO_FIX_INCONSISTENCIES) { - logger.warn("Cannot use non-native menus with pantheon (elementaryOS). Forcing native menus."); + if (OS.isElementaryOSInstalled()) { + logger.warn("Cannot use non-native menus with pantheon (elementaryOS). Forcing native menus."); + } else { + logger.warn("Cannot use non-native menus with pantheon DE. Forcing native menus."); + } useNativeMenus = true; } @@ -504,6 +507,21 @@ class SystemTray { } if ("gnome".equalsIgnoreCase(GDM)) { + if (OS.isArchInstalled()) { + if (DEBUG) { + logger.debug("Running Arch Linux."); + } + if (!Extension.isInstalled()) { + logger.info("You may need a work-around for showing the SystemTray icon - we suggest installing the " + + "the [Top Icons] plugin (https://extensions.gnome.org/extension/1031/topicons/) which moves " + + "icons from the *notification drawer* (it is normally collapsed) at the bottom left corner " + + "of the screen to the menu panel next to the clock."); + } + } else { + // Automatically install the extension for everyone except Arch. It's bonkers. + Extension.install(); + } + // are we fedora? If so, what version? // now, what VERSION of fedora? 23/24/25 don't have AppIndicator installed, so we have to use GtkStatusIcon int fedoraVersion = OS.getFedoraVersion(); @@ -516,9 +534,9 @@ class SystemTray { System.setProperty("SystemTray_IS_FEDORA_GNOME_ADJUST_SIZE", Integer.toString(fedoraVersion)); // 23 is gtk, 24/25 is gtk (but also wrong size unless we adjust it) - Extension.install(); trayType = selectTypeQuietly(useNativeMenus, TrayType.GtkStatusIcon); } else { + // arch likely will have problems unless the correct/appropriate libraries are installed. trayType = selectTypeQuietly(useNativeMenus, TrayType.AppIndicator); } } @@ -664,15 +682,13 @@ class SystemTray { final AtomicReference reference = new AtomicReference(); - /* - * appIndicator/gtk require strings (which is the path) - * swing version loads as an image (which can be stream or path, we use path) - */ + // - appIndicator/gtk require strings (which is the path) + // - swing version loads as an image (which can be stream or path, we use path) CacheUtil.tempDir = "SysTray"; try { if (OS.isLinux()) { - // load up our libraries NOTE: appindicator1 -> GTk2, appindicator3 -> GTK3. + // NOTE: appindicator1 -> GTk2, appindicator3 -> GTK3. // appindicator3 doesn't support menu icons via GTK2!! if (!Gtk.isLoaded) { logger.error("Unable to initialize GTK! Something is severely wrong!"); @@ -680,6 +696,33 @@ class SystemTray { return; } + + if (OS.isArchInstalled()) { + // arch linux is fun! + + if (isTrayType(trayType, TrayType.AppIndicator)) { + // appindicators + + // requires the install of libappindicator which is GTK2 (as of 25DEC2016) + // requires the install of libappindicator3 which is GTK3 (as of 25DEC2016) + + if (!AppIndicator.isLoaded) { + if (Gtk.isGtk2) { + logger.error("Unable to initialize AppIndicator for Arch linux, it requires GTK2! " + + "Please install libappindicator, for example: 'sudo pacman -S libappindicator'"); + systemTrayMenu = null; + return; + } else { + logger.error("Unable to initialize AppIndicator for Arch linux, it requires GTK3! " + + "Please install libappindicator3, for example: 'sudo pacman -S libappindicator3'"); // GTK3 + systemTrayMenu = null; + return; + } + } + } + } + + if (isTrayType(trayType, TrayType.AppIndicator)) { if (Gtk.isGtk2 && AppIndicator.isVersion3) { try { @@ -708,9 +751,12 @@ class SystemTray { } } + + + if (isJavaFxLoaded) { if (isTrayType(trayType, TrayType.GtkStatusIcon)) { - // set a property so that GTK (if necessary) can set the name + // set a property so that GTK (if necessary) can set the name of the system tray icon System.setProperty("SystemTray_GTK_SET_NAME", "true"); } @@ -722,6 +768,8 @@ class SystemTray { Swt.init(); } + + if ((isJavaFxLoaded || isSwtLoaded) && SwingUtilities.isEventDispatchThread()) { // oh boy! This WILL NOT WORK. Let the dev know logger.error("SystemTray initialization for JavaFX or SWT **CAN NOT** occur on the Swing Event Dispatch Thread " + @@ -733,6 +781,8 @@ class SystemTray { // javaFX and SWT should not start on the EDT!! + + // if it's linux + native menus must not start on the EDT! // _AwtTray must be constructed on the EDT however... if (isJavaFxLoaded || isSwtLoaded || @@ -770,6 +820,8 @@ class SystemTray { systemTrayMenu = reference.get(); + + // verify that we have what we are expecting. if (OS.isWindows() && systemTrayMenu instanceof SwingUI) { // this configuration is OK. @@ -922,9 +974,7 @@ class SystemTray { setImage(bimage); Component[] menuComponents = jMenu.getMenuComponents(); - for (int i = 0, menuComponentsLength = menuComponents.length; i < menuComponentsLength; i++) { - final Component c = menuComponents[i]; - + for (Component c : menuComponents) { if (c instanceof JMenu) { menu.add((JMenu) c); }