touchbar: fixed IDEA-202927 Exception occurs on applying "Show F1, F2, etc. keys on the Touch Bar" option

GitOrigin-RevId: 391644616ed688b571185fe51d5904acd4e0c9e1
This commit is contained in:
Artem Bochkarev
2019-07-08 15:02:16 +03:00
committed by intellij-monorepo-bot
parent 24c4acc593
commit fa6ef31538
2 changed files with 64 additions and 1 deletions
@@ -11,6 +11,9 @@ import junit.framework.TestCase;
import org.junit.Assume;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
public class TouchBarSettingsTest extends TestCase {
private static final String testAppID = "com.apple.terminal";
@@ -47,7 +50,17 @@ public class TouchBarSettingsTest extends TestCase {
public void testTouchBarSettingsWrite() {
Assume.assumeTrue("NST-unsupported OS", NST.isSupportedOS());
Assume.assumeTrue(NSDefaults.ourTouchBarDomain +" doesn't exist", NSDefaults.isDomainExists(NSDefaults.ourTouchBarDomain));
if (NSDefaults.isDomainExists(NSDefaults.ourTouchBarDomain)) {
NSDefaults.removePersistentDomain(NSDefaults.ourTouchBarDomain);
Assume.assumeTrue("can't delete domain: " + NSDefaults.ourTouchBarDomain, !NSDefaults.isDomainExists(NSDefaults.ourTouchBarDomain));
}
final Map<String, Object> vals = new HashMap<>();
vals.put("TestNSDefaultsKey", "TestNSDefaultsValue");
vals.put("PresentationModePerApp", new HashMap<>());
NSDefaults.createPersistentDomain(NSDefaults.ourTouchBarDomain, vals);
Assume.assumeTrue("can't create domain: " + NSDefaults.ourTouchBarDomain, NSDefaults.isDomainExists(NSDefaults.ourTouchBarDomain));
final boolean enabled = NSDefaults.isShowFnKeysEnabled(testAppID);
NSDefaults.setShowFnKeysEnabled(testAppID, !enabled);
@@ -4,9 +4,12 @@ package com.intellij.ui.mac.foundation;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.SystemInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class NSDefaults {
private static final Logger LOG = Logger.getInstance(NSDefaults.class);
@@ -221,6 +224,16 @@ public class NSDefaults {
public static boolean setShowFnKeysEnabled(String appId, boolean val) { return setShowFnKeysEnabled(appId, val, false); }
public static boolean setShowFnKeysEnabled(String appId, boolean val, boolean performExtraDebugChecks) {
if (!isDomainExists(ourTouchBarDomain)) {
final Map<String, Object> vals = new HashMap<>();
vals.put(ourTouchBarNode, new HashMap<>());
createPersistentDomain(ourTouchBarDomain, vals);
if (!isDomainExists(ourTouchBarDomain)) {
LOG.error("can't create domain '" + ourTouchBarDomain + "'");
return false;
}
}
final Path path = Path.createDomainPath(ourTouchBarDomain, ourTouchBarNode);
String sval = path.readStringVal(appId);
final boolean settingEnabled = sval != null && sval.equals(ourTouchBarShowFnValue);
@@ -262,6 +275,43 @@ public class NSDefaults {
return result.lastValidPos() >= 0;
}
public static void createPersistentDomain(@NotNull String domainName, @Nullable Map<String, Object> values) {
final Foundation.NSAutoreleasePool pool = new Foundation.NSAutoreleasePool();
try {
final ID defaults = Foundation.invoke("NSUserDefaults", "standardUserDefaults");
if (defaults == null || defaults.equals(ID.NIL))
return;
final ID dict = Foundation.invoke("NSMutableDictionary", "new");
if (values != null) {
for (Map.Entry<String, Object> me: values.entrySet()) {
final Object val = me.getValue();
if (val instanceof String)
Foundation.invoke(dict,"setObject:forKey:", Foundation.nsString((String)val), Foundation.nsString(me.getKey()));
else if (val instanceof Map) {
final ID internalDict = Foundation.invoke("NSMutableDictionary", "new");
Foundation.invoke(dict,"setObject:forKey:", internalDict, Foundation.nsString(me.getKey()));
} else
LOG.error("unsupported type of domain value: " + String.valueOf(val));
}
}
Foundation.invoke(defaults, "setPersistentDomain:forName:", dict, Foundation.nsString(domainName));
} finally {
pool.drain();
}
}
public static void removePersistentDomain(@NotNull String domainName) {
final Foundation.NSAutoreleasePool pool = new Foundation.NSAutoreleasePool();
try {
final ID defaults = Foundation.invoke("NSUserDefaults", "standardUserDefaults");
if (defaults == null || defaults.equals(ID.NIL))
return;
Foundation.invoke(defaults, "removePersistentDomainForName:", Foundation.nsString(domainName));
} finally {
pool.drain();
}
}
public static boolean isDarkMenuBar() {
assert SystemInfo.isMac;