Skip to content

Commit b297791

Browse files
committed
Override WM_CLASS according to scijava.app.wmclass
1 parent 154018e commit b297791

1 file changed

Lines changed: 30 additions & 1 deletion

File tree

src/main/java/org/scijava/desktop/platform/linux/LinuxPlatform.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@
4242
import org.scijava.plugin.Parameter;
4343
import org.scijava.plugin.Plugin;
4444

45+
import java.awt.GraphicsEnvironment;
46+
import java.awt.Toolkit;
4547
import java.io.IOException;
48+
import java.lang.reflect.Field;
4649
import java.net.URL;
4750
import java.nio.charset.StandardCharsets;
4851
import java.nio.file.Files;
@@ -101,6 +104,8 @@ public String osName() {
101104
public void configure(final PlatformService service) {
102105
super.configure(service);
103106

107+
applyWMClass();
108+
104109
// Create or update .desktop file for desktop integration.
105110
try {
106111
installDesktopFile();
@@ -222,7 +227,7 @@ public void syncDesktopIntegration(final boolean webLinks,
222227
df.setCategories(appCategories);
223228
df.setTerminal(false);
224229
df.setStartupNotify(true);
225-
final String appWMClass = System.getProperty("sun.awt.wmclass");
230+
final String appWMClass = System.getProperty("scijava.app.wmclass");
226231
if (appWMClass != null) df.setStartupWMClass(appWMClass);
227232
final String appIcon = System.getProperty("scijava.app.icon");
228233
if (appIcon != null) df.setIcon(appIcon);
@@ -362,6 +367,30 @@ private String sanitizeFileName(final String name) {
362367
return name.replaceAll("[^a-zA-Z0-9._-]", "-").toLowerCase();
363368
}
364369

370+
/**
371+
* Sets the AWT app class name via reflection so the running application's
372+
* windows carry the WM_CLASS specified by {@code scijava.app.wmclass}.
373+
* This must be called before any AWT windows are created.
374+
*/
375+
private void applyWMClass() {
376+
final String appWMClass = System.getProperty("scijava.app.wmclass");
377+
if (appWMClass == null) return;
378+
if (GraphicsEnvironment.isHeadless()) return;
379+
try {
380+
final Toolkit toolkit = Toolkit.getDefaultToolkit();
381+
if (toolkit == null) return;
382+
final Class<?> clazz = toolkit.getClass();
383+
if (!"sun.awt.X11.XToolkit".equals(clazz.getName())) return;
384+
final Field field = clazz.getDeclaredField("awtAppClassName");
385+
field.setAccessible(true);
386+
field.set(toolkit, appWMClass);
387+
if (log != null) log.debug("Set AWT app class name: " + appWMClass);
388+
}
389+
catch (final Throwable t) {
390+
if (log != null) log.debug("Could not set AWT app class name", t);
391+
}
392+
}
393+
365394
// -- Helper methods --
366395

367396
private LinkService linkService() {

0 commit comments

Comments
 (0)