10
10
import org .cryptomator .integrations .tray .TrayMenuController ;
11
11
import org .cryptomator .integrations .tray .TrayMenuException ;
12
12
import org .cryptomator .integrations .tray .TrayMenuItem ;
13
+ import org .purejava .appindicator .AppIndicator ;
13
14
import org .purejava .appindicator .GCallback ;
14
- import org .purejava .appindicator .NativeLibUtilities ;
15
+ import org .purejava .appindicator .GObject ;
16
+ import org .purejava .appindicator .Gtk ;
15
17
16
18
import java .lang .foreign .Arena ;
17
19
import java .lang .foreign .MemorySegment ;
18
20
import java .util .List ;
19
- import java .util .Optional ;
20
21
import java .util .function .Consumer ;
21
22
22
- import static org .purejava .appindicator .app_indicator_h .*;
23
+ import static org .purejava .appindicator .app_indicator_h .APP_INDICATOR_CATEGORY_APPLICATION_STATUS ;
24
+ import static org .purejava .appindicator .app_indicator_h .APP_INDICATOR_STATUS_ACTIVE ;
23
25
24
26
@ Priority (1000 )
25
27
@ CheckAvailability
@@ -30,37 +32,35 @@ public class AppindicatorTrayMenuController implements TrayMenuController {
30
32
31
33
private static final Arena ARENA = Arena .global ();
32
34
private MemorySegment indicator ;
33
- private MemorySegment menu = gtk_menu_new ();
35
+ private MemorySegment menu = Gtk . newMenu ();
34
36
35
37
@ CheckAvailability
36
38
public static boolean isAvailable () {
37
- return NativeLibUtilities . isLoadedNativeLib ();
39
+ return AppIndicator . isLoaded ();
38
40
}
39
41
40
42
@ Override
41
43
public void showTrayIcon (Consumer <TrayIconLoader > iconLoader , Runnable runnable , String s ) throws TrayMenuException {
42
44
TrayIconLoader .FreedesktopIconName callback = this ::showTrayIconWithSVG ;
43
45
iconLoader .accept (callback );
44
- gtk_widget_show_all (menu );
45
- app_indicator_set_status (indicator , APP_INDICATOR_STATUS_ACTIVE ());
46
+ Gtk . widgetShowAll (menu );
47
+ AppIndicator . setStatus (indicator , APP_INDICATOR_STATUS_ACTIVE ());
46
48
}
47
49
48
- private void showTrayIconWithSVG (String s ) {
49
- try (var arena = Arena .ofConfined ()) {
50
- var svgSourcePath = System .getProperty (SVG_SOURCE_PROPERTY );
51
- // flatpak
52
- if (svgSourcePath == null ) {
53
- indicator = app_indicator_new (arena .allocateUtf8String (APP_INDICATOR_ID ),
54
- arena .allocateUtf8String (s ),
55
- APP_INDICATOR_CATEGORY_APPLICATION_STATUS ());
56
- // AppImage and ppa
57
- } else {
58
- indicator = app_indicator_new_with_path (arena .allocateUtf8String (APP_INDICATOR_ID ),
59
- arena .allocateUtf8String (s ),
60
- APP_INDICATOR_CATEGORY_APPLICATION_STATUS (),
61
- // find tray icons theme in mounted AppImage / installed on system by ppa
62
- arena .allocateUtf8String (svgSourcePath ));
63
- }
50
+ private void showTrayIconWithSVG (String iconName ) {
51
+ var svgSourcePath = System .getProperty (SVG_SOURCE_PROPERTY );
52
+ // flatpak
53
+ if (svgSourcePath == null ) {
54
+ indicator = AppIndicator .newIndicator (APP_INDICATOR_ID ,
55
+ iconName ,
56
+ APP_INDICATOR_CATEGORY_APPLICATION_STATUS ());
57
+ // AppImage and ppa
58
+ } else {
59
+ indicator = AppIndicator .newIndicatorWithPath (APP_INDICATOR_ID ,
60
+ iconName ,
61
+ APP_INDICATOR_CATEGORY_APPLICATION_STATUS (),
62
+ // find tray icons theme in mounted AppImage / installed on system by ppa
63
+ svgSourcePath );
64
64
}
65
65
}
66
66
@@ -70,18 +70,16 @@ public void updateTrayIcon(Consumer<TrayIconLoader> iconLoader) {
70
70
iconLoader .accept (callback );
71
71
}
72
72
73
- private void updateTrayIconWithSVG (String s ) {
74
- try (var arena = Arena .ofConfined ()) {
75
- app_indicator_set_icon (indicator , arena .allocateUtf8String (s ));
76
- }
73
+ private void updateTrayIconWithSVG (String iconName ) {
74
+ AppIndicator .setIcon (indicator , iconName );
77
75
}
78
76
79
77
@ Override
80
78
public void updateTrayMenu (List <TrayMenuItem > items ) throws TrayMenuException {
81
- menu = gtk_menu_new ();
79
+ menu = Gtk . newMenu ();
82
80
addChildren (menu , items );
83
- gtk_widget_show_all (menu );
84
- app_indicator_set_menu (indicator , menu );
81
+ Gtk . widgetShowAll (menu );
82
+ AppIndicator . setMenu (indicator , menu );
85
83
}
86
84
87
85
@ Override
@@ -93,30 +91,26 @@ private void addChildren(MemorySegment menu, List<TrayMenuItem> items) {
93
91
for (var item : items ) {
94
92
switch (item ) {
95
93
case ActionItem a -> {
96
- var gtkMenuItem = gtk_menu_item_new ();
97
- try (var arena = Arena .ofConfined ()) {
98
- gtk_menu_item_set_label (gtkMenuItem , arena .allocateUtf8String (a .title ()));
99
- g_signal_connect_object (gtkMenuItem ,
100
- arena .allocateUtf8String ("activate" ),
101
- GCallback .allocate (new ActionItemCallback (a ), ARENA ),
102
- menu ,
103
- 0 );
104
- }
105
- gtk_menu_shell_append (menu , gtkMenuItem );
94
+ var gtkMenuItem = Gtk .newMenuItem ();
95
+ Gtk .menuItemSetLabel (gtkMenuItem , a .title ());
96
+ GObject .signalConnectObject (gtkMenuItem ,
97
+ "activate" ,
98
+ GCallback .allocate (new ActionItemCallback (a ), ARENA ),
99
+ menu ,
100
+ 0 );
101
+ Gtk .menuShellAppend (menu , gtkMenuItem );
106
102
}
107
103
case SeparatorItem _ -> {
108
- var gtkSeparator = gtk_menu_item_new ();
109
- gtk_menu_shell_append (menu , gtkSeparator );
104
+ var gtkSeparator = Gtk . newMenuItem ();
105
+ Gtk . menuShellAppend (menu , gtkSeparator );
110
106
}
111
107
case SubMenuItem s -> {
112
- var gtkMenuItem = gtk_menu_item_new ();
113
- var gtkSubmenu = gtk_menu_new ();
114
- try (var arena = Arena .ofConfined ()) {
115
- gtk_menu_item_set_label (gtkMenuItem , arena .allocateUtf8String (s .title ()));
116
- }
108
+ var gtkMenuItem = Gtk .newMenuItem ();
109
+ var gtkSubmenu = Gtk .newMenu ();
110
+ Gtk .menuItemSetLabel (gtkMenuItem , s .title ());
117
111
addChildren (gtkSubmenu , s .items ());
118
- gtk_menu_item_set_submenu (gtkMenuItem , gtkSubmenu );
119
- gtk_menu_shell_append (menu , gtkMenuItem );
112
+ Gtk . menuItemSetSubmenu (gtkMenuItem , gtkSubmenu );
113
+ Gtk . menuShellAppend (menu , gtkMenuItem );
120
114
}
121
115
}
122
116
}
0 commit comments