11package org .cryptomator .linux .tray ;
22
3+ import org .apache .commons .lang3 .StringUtils ;
34import org .cryptomator .integrations .common .CheckAvailability ;
45import org .cryptomator .integrations .common .OperatingSystem ;
56import org .cryptomator .integrations .common .Priority ;
1112import org .cryptomator .integrations .tray .TrayMenuException ;
1213import org .cryptomator .integrations .tray .TrayMenuItem ;
1314import org .purejava .appindicator .GCallback ;
14- import org .purejava .appindicator .MemoryAllocator ;
15+ import org .purejava .appindicator .NativeLibUtilities ;
1516
1617import java .lang .foreign .Arena ;
1718import java .lang .foreign .MemorySegment ;
1819import java .lang .foreign .SegmentScope ;
1920import java .util .List ;
21+ import java .util .Optional ;
2022import java .util .function .Consumer ;
2123
2224import static org .purejava .appindicator .app_indicator_h .*;
2325
2426@ Priority (1000 )
27+ @ CheckAvailability
2528@ OperatingSystem (OperatingSystem .Value .LINUX )
2629public class AppindicatorTrayMenuController implements TrayMenuController {
27-
2830 private static final String APP_INDICATOR_ID = "org.cryptomator.Cryptomator" ;
31+ private static final String SVG_SOURCE_PROPERTY = "cryptomator.integrationsLinux.trayIconsDir" ;
2932
3033 private static final SegmentScope SCOPE = SegmentScope .global ();
3134 private MemorySegment indicator ;
3235 private MemorySegment menu = gtk_menu_new ();
36+ private Optional <String > svgSourcePath ;
3337
3438 @ CheckAvailability
3539 public static boolean isAvailable () {
36- return MemoryAllocator .isLoadedNativeLib ();
40+ return NativeLibUtilities .isLoadedNativeLib ();
3741 }
3842
3943 @ Override
@@ -46,9 +50,20 @@ public void showTrayIcon(Consumer<TrayIconLoader> iconLoader, Runnable runnable,
4650
4751 private void showTrayIconWithSVG (String s ) {
4852 try (var arena = Arena .openConfined ()) {
49- indicator = app_indicator_new (arena .allocateUtf8String (APP_INDICATOR_ID ),
50- arena .allocateUtf8String (s ),
51- APP_INDICATOR_CATEGORY_APPLICATION_STATUS ());
53+ svgSourcePath = Optional .ofNullable (System .getProperty (SVG_SOURCE_PROPERTY ));
54+ // flatpak
55+ if (svgSourcePath .isEmpty ()) {
56+ indicator = app_indicator_new (arena .allocateUtf8String (APP_INDICATOR_ID ),
57+ arena .allocateUtf8String (s ),
58+ APP_INDICATOR_CATEGORY_APPLICATION_STATUS ());
59+ // AppImage and ppa
60+ } else {
61+ indicator = app_indicator_new_with_path (arena .allocateUtf8String (APP_INDICATOR_ID ),
62+ arena .allocateUtf8String (s ),
63+ APP_INDICATOR_CATEGORY_APPLICATION_STATUS (),
64+ // find tray icons theme in mounted AppImage / installed on system by ppa
65+ arena .allocateUtf8String (svgSourcePath .get ()));
66+ }
5267 }
5368 }
5469
0 commit comments