Skip to content

Commit 5dded90

Browse files
committed
Code improvements
Discussion: #18
1 parent 42ca384 commit 5dded90

11 files changed

Lines changed: 52 additions & 63 deletions

.github/workflows/build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ jobs:
1010
- uses: actions/checkout@v3
1111
- uses: actions/setup-java@v3
1212
with:
13-
distribution: 'temurin'
14-
java-version: 19
13+
distribution: 'zulu'
14+
java-version: 20
1515
cache: 'maven'
1616
- name: Ensure to use tagged version
1717
if: startsWith(github.ref, 'refs/tags/')

.github/workflows/codeql-analysis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ jobs:
2020
fetch-depth: 2
2121
- uses: actions/setup-java@v3
2222
with:
23-
distribution: 'temurin'
24-
java-version: 19
23+
distribution: 'zulu'
24+
java-version: 20
2525
cache: 'maven'
2626
- name: Initialize CodeQL
2727
uses: github/codeql-action/init@v2

.github/workflows/publish-central.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ jobs:
1515
ref: "refs/tags/${{ github.event.inputs.tag }}"
1616
- uses: actions/setup-java@v3
1717
with:
18-
distribution: 'temurin'
19-
java-version: 19
18+
distribution: 'zulu'
19+
java-version: 20
2020
cache: 'maven'
2121
server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml
2222
server-username: MAVEN_USERNAME # env variable for username in deploy

.github/workflows/publish-github.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ jobs:
1010
- uses: actions/checkout@v3
1111
- uses: actions/setup-java@v3
1212
with:
13-
distribution: 'temurin'
14-
java-version: 19
13+
distribution: 'zulu'
14+
java-version: 20
1515
cache: 'maven'
1616
gpg-private-key: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }} # Value of the GPG private key to import
1717
gpg-passphrase: MAVEN_GPG_PASSPHRASE # env variable for GPG private key passphrase

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
<!-- runtime dependencies -->
4242

43-
<api.version>2.0.0-alpha1</api.version>
43+
<api.version>2.0.0-alpha2</api.version>
4444
<secret-service.version>1.8.1-jdk17</secret-service.version>
4545
<kdewallet.version>1.3.0</kdewallet.version>
4646
<appindicator.version>1.3.0</appindicator.version>

src/main/java/module-info.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@
1919
provides RevealPathService with DBusSendRevealPathService;
2020
provides TrayMenuController with AppindicatorTrayMenuController;
2121

22-
exports org.cryptomator.linux.tray;
22+
opens org.cryptomator.linux.tray to org.cryptomator.integrations.api;
2323
}

src/main/java/org/cryptomator/linux/tray/ActionItemCallback.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,8 @@
55
import org.slf4j.Logger;
66
import org.slf4j.LoggerFactory;
77

8-
public class ActionItemCallback implements GCallback {
8+
record ActionItemCallback (ActionItem actionItem) implements GCallback {
99
private static final Logger LOG = LoggerFactory.getLogger(ActionItemCallback.class);
10-
private ActionItem actionItem;
11-
12-
public ActionItemCallback(ActionItem actionItem) {
13-
this.actionItem = actionItem;
14-
}
1510

1611
@Override
1712
public void apply() {

src/main/java/org/cryptomator/linux/tray/AppindicatorTrayMenuController.java

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package org.cryptomator.linux.tray;
22

3-
import org.apache.commons.lang3.SystemUtils;
43
import org.cryptomator.integrations.common.CheckAvailability;
4+
import org.cryptomator.integrations.common.OperatingSystem;
5+
import org.cryptomator.integrations.common.Priority;
56
import org.cryptomator.integrations.tray.ActionItem;
67
import org.cryptomator.integrations.tray.SeparatorItem;
78
import org.cryptomator.integrations.tray.SubMenuItem;
9+
import org.cryptomator.integrations.tray.TrayIconLoader;
810
import org.cryptomator.integrations.tray.TrayMenuController;
911
import org.cryptomator.integrations.tray.TrayMenuException;
1012
import org.cryptomator.integrations.tray.TrayMenuItem;
@@ -13,27 +15,29 @@
1315
import org.slf4j.LoggerFactory;
1416

1517
import java.io.File;
18+
import java.lang.foreign.Arena;
1619
import java.lang.foreign.MemorySegment;
17-
import java.lang.foreign.SegmentScope;
1820
import java.net.URI;
1921
import java.net.URISyntaxException;
2022
import java.nio.file.Paths;
2123
import java.util.List;
24+
import java.util.function.Consumer;
2225

2326
import static org.purejava.appindicator.app_indicator_h.*;
2427

25-
@CheckAvailability
28+
@Priority(1000)
29+
@OperatingSystem(OperatingSystem.Value.LINUX)
2630
public class AppindicatorTrayMenuController implements TrayMenuController {
2731

2832
private static final Logger LOG = LoggerFactory.getLogger(AppindicatorTrayMenuController.class);
2933

30-
private final SegmentScope scope = SegmentScope.auto();
34+
private static final Arena ARENA = Arena.openShared();
3135
private MemorySegment indicator;
3236
private MemorySegment menu = gtk_menu_new();
3337

3438
@CheckAvailability
3539
public static boolean isAvailable() {
36-
return SystemUtils.IS_OS_LINUX && MemoryAllocator.isLoadedNativeLib();
40+
return MemoryAllocator.isLoadedNativeLib();
3741
}
3842

3943
@Override
@@ -47,8 +51,13 @@ public void showTrayIcon(URI uri, Runnable runnable, String s) throws TrayMenuEx
4751
}
4852

4953
@Override
50-
public void updateTrayIcon(URI uri) {
51-
app_indicator_set_icon(indicator, MemoryAllocator.ALLOCATE_FOR(getAbsolutePath(getPathString(uri))));
54+
public void updateTrayIcon(Consumer<TrayIconLoader> iconLoader) {
55+
TrayIconLoader.FreedesktopIconName callback = this::updateTrayIconCallback;
56+
iconLoader.load(callback);
57+
}
58+
59+
private void updateTrayIconCallback(String s) {
60+
app_indicator_set_icon(indicator, MemoryAllocator.ALLOCATE_FOR(s));
5261
}
5362

5463
@Override
@@ -66,30 +75,34 @@ public void onBeforeOpenMenu(Runnable runnable) {
6675

6776
private void addChildren(MemorySegment menu, List<TrayMenuItem> items) {
6877
for (var item : items) {
69-
// TODO: use Pattern Matching for switch, once available
70-
if (item instanceof ActionItem a) {
71-
var gtkMenuItem = gtk_menu_item_new();
72-
gtk_menu_item_set_label(gtkMenuItem, MemoryAllocator.ALLOCATE_FOR(a.title()));
73-
g_signal_connect_object(gtkMenuItem,
74-
MemoryAllocator.ALLOCATE_FOR("activate"),
75-
MemoryAllocator.ALLOCATE_CALLBACK_FOR(new ActionItemCallback(a), scope),
76-
menu,
77-
0);
78-
gtk_menu_shell_append(menu, gtkMenuItem);
79-
} else if (item instanceof SeparatorItem) {
80-
var gtkSeparator = gtk_menu_item_new();
81-
gtk_menu_shell_append(menu, gtkSeparator);
82-
} else if (item instanceof SubMenuItem s) {
83-
var gtkMenuItem = gtk_menu_item_new();
84-
var gtkSubmenu = gtk_menu_new();
85-
gtk_menu_item_set_label(gtkMenuItem, MemoryAllocator.ALLOCATE_FOR(s.title()));
86-
addChildren(gtkSubmenu, s.items());
87-
gtk_menu_item_set_submenu(gtkMenuItem, gtkSubmenu);
88-
gtk_menu_shell_append(menu, gtkMenuItem);
78+
switch (item) {
79+
case ActionItem a -> {
80+
var gtkMenuItem = gtk_menu_item_new();
81+
gtk_menu_item_set_label(gtkMenuItem, MemoryAllocator.ALLOCATE_FOR(a.title()));
82+
g_signal_connect_object(gtkMenuItem,
83+
MemoryAllocator.ALLOCATE_FOR("activate"),
84+
MemoryAllocator.ALLOCATE_CALLBACK_FOR(new ActionItemCallback(a), ARENA.scope()),
85+
menu,
86+
0);
87+
gtk_menu_shell_append(menu, gtkMenuItem);
88+
}
89+
case SeparatorItem separatorItem -> {
90+
var gtkSeparator = gtk_menu_item_new();
91+
gtk_menu_shell_append(menu, gtkSeparator);
92+
}
93+
case SubMenuItem s -> {
94+
var gtkMenuItem = gtk_menu_item_new();
95+
var gtkSubmenu = gtk_menu_new();
96+
gtk_menu_item_set_label(gtkMenuItem, MemoryAllocator.ALLOCATE_FOR(s.title()));
97+
addChildren(gtkSubmenu, s.items());
98+
gtk_menu_item_set_submenu(gtkMenuItem, gtkSubmenu);
99+
gtk_menu_shell_append(menu, gtkMenuItem);
100+
}
89101
}
90102
gtk_widget_show_all(menu);
91103
}
92104
}
105+
93106
private String getAbsolutePath(String iconName) {
94107
var res = getClass().getClassLoader().getResource(iconName);
95108
if (null == res) {

src/main/java/org/cryptomator/linux/tray/LinuxTrayIntegrationsProvider.java

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/main/resources/META-INF/services/org.cryptomator.integrations.tray.TrayIntegrationProvider

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)