persist save() values across sessions

This commit is contained in:
David Kamholz 2019-06-21 11:18:58 -07:00 • committed by Marc Durdin
parent 786e0e1223
commit 8a44d048e3
7 changed files with 83 additions and 5 deletions

View file

@ -223,6 +223,7 @@ NSMutableArray *servers;
[self.AppDelegate setKeyboardIcon:[kmxInfo objectForKey:kKMKeyboardIconKey]];
[self.AppDelegate setContextBuffer:nil];
[self.AppDelegate setSelectedKeyboard:path];
[self.AppDelegate loadSavedStores];
if (kvk != nil && self.AppDelegate.alwaysShowOSK)
[self.AppDelegate showOSK];
}

View file

@ -89,6 +89,8 @@ extern NSString *const kWebSite;
- (NSMenu *)menu;
- (void)saveActiveKeyboards;
- (void)loadSavedStores;
- (void)saveStore:(NSNumber *)storeKey withValue:(NSString* )value;
- (void)showAboutWindow;
- (void)showOSK;
- (void)showConfigurationWindow;

View file

@ -24,6 +24,7 @@
NSString *const kKMSelectedKeyboardKey = @"KMSelectedKeyboardKey";
NSString *const kKMActiveKeyboardsKey = @"KMActiveKeyboardsKey";
NSString *const kKMSavedStoresKey = @"KMSavedStoresKey";
NSString *const kKMAlwaysShowOSKKey = @"KMAlwaysShowOSKKey";
NSString *const kKMUseVerboseLogging = @"KMUseVerboseLogging";
NSString *const kKeymanKeyboardDownloadCompletedNotification = @"kKeymanKeyboardDownloadCompletedNotification";
@ -308,6 +309,53 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
[_oskWindow.window setTitle:self.oskWindowTitle];
}
- (void)loadSavedStores {
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
NSDictionary *allSavedStores = [userData dictionaryForKey:kKMSavedStoresKey];
if (!allSavedStores) return;
NSDictionary *savedStores = [allSavedStores objectForKey:_selectedKeyboard];
if (!savedStores) return;
NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];
fmt.numberStyle = NSNumberFormatterDecimalStyle;
for (NSString *key in savedStores) {
NSString *value = [savedStores objectForKey:key];
NSUInteger storeID = [[fmt numberFromString:key] unsignedIntegerValue];
[self.kme setStore:(DWORD)storeID withValue:value];
}
}
- (void)saveStore:(NSNumber *)storeKey withValue:(NSString* )value {
NSString *storeKeyStr = [storeKey stringValue];
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
NSDictionary *allSavedStores = [userData dictionaryForKey:kKMSavedStoresKey];
NSDictionary *savedStores;
if (allSavedStores) {
savedStores = [allSavedStores objectForKey:_selectedKeyboard];
}
if (savedStores) {
NSMutableDictionary *newSavedStores = [savedStores mutableCopy];
[newSavedStores setObject:value forKey:storeKeyStr];
savedStores = newSavedStores;
} else {
savedStores = [[NSDictionary alloc] initWithObjectsAndKeys:value, storeKeyStr, nil];
}
if (allSavedStores) {
NSMutableDictionary *newAllSavedStores = [allSavedStores mutableCopy];
[newAllSavedStores setObject:savedStores forKey:_selectedKeyboard];
allSavedStores = newAllSavedStores;
} else {
allSavedStores = [[NSDictionary alloc] initWithObjectsAndKeys:savedStores, _selectedKeyboard, nil];
}
[userData setObject:allSavedStores forKey:kKMSavedStoresKey];
[userData synchronize];
}
- (NSString *)oskWindowTitle {
if (_keyboardName == nil || !_keyboardName.length)
return [NSString stringWithFormat:@"Keyman"];
@ -765,6 +813,7 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
[self setKvk:kvk];
[self setKeyboardName:[kmxInfo objectForKey:kKMKeyboardNameKey]];
[self setKeyboardIcon:[kmxInfo objectForKey:kKMKeyboardIconKey]];
[self loadSavedStores];
didSetKeyboard = YES;
}
@ -800,6 +849,7 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
[self setKeyboardName:[kmxInfo objectForKey:kKMKeyboardNameKey]];
[self setKeyboardIcon:[kmxInfo objectForKey:kKMKeyboardIconKey]];
[self setContextBuffer:nil];
[self loadSavedStores];
[self setSelectedKeyboard:path];
}
}

View file

@ -425,6 +425,12 @@ NSRange _previousSelRange;
else if ([actionType isEqualToString:Q_BEEP]) {
[[NSSound soundNamed:@"Tink"] play];
}
else if ([actionType isEqualToString:Q_SAVEOPT]) {
NSDictionary *save = [action objectForKey:actionType];
NSNumber *storeKey = [save allKeys][0];
NSString *value = [save objectForKey:storeKey];
[self.AppDelegate saveStore:storeKey withValue:value];
}
}
return YES;
}

View file

@ -36,6 +36,9 @@
[self removeLastObject];
[self addObject:mAction];
}
else {
[self addObject:newAction];
}
}
else if ([preActionType isEqualToString:Q_STR] && [newActionType isEqualToString:Q_BACK]) {
NSString *preStr = [preAction objectForKey:preActionType];

View file

@ -20,6 +20,7 @@ extern NSString *const Q_DEADKEY;
extern NSString *const Q_NUL;
extern NSString *const Q_BEEP;
extern NSString *const Q_RETURN;
extern NSString *const Q_SAVEOPT;
extern DWORD VKMap[0x80];
@ -31,6 +32,7 @@ extern DWORD VKMap[0x80];
- (id)initWithKMX:(KMXFile *)kmx contextBuffer:(NSString *)ctxBuf;
- (void)setContextBuffer:(NSString *)ctxBuf;
- (NSString *)contextBuffer;
- (void)setStore:(DWORD)storeID withValue:(NSString *)value;
- (NSArray *)processEvent:(NSEvent *)event;
- (void)setUseVerboseLogging:(BOOL)useVerboseLogging;

View file

@ -23,6 +23,7 @@ NSString *const Q_DEADKEY = @"Q_DEADKEY";
NSString *const Q_NUL = @"Q_NUL";
NSString *const Q_BEEP = @"Q_BEEP";
NSString *const Q_RETURN = @"Q_RETURN";
NSString *const Q_SAVEOPT = @"Q_SAVEOPT";
DWORD VKMap[0x80];
@ -103,6 +104,11 @@ const NSString* kEasterEggKmxName = @"EnglishSpanish.kmx";
return _tmpCtxBuf;
}
- (void)setStore:(DWORD)storeID withValue:(NSString *)value {
KMCompStore *store = [self.kmx.store objectAtIndex:storeID];
store.string = [[NSString alloc] initWithString:value];
}
- (NSArray *)processEvent:(NSEvent *)event {
NSArray *actions = nil;
@ -408,7 +414,7 @@ const NSString* kEasterEggKmxName = @"EnglishSpanish.kmx";
if (!outKey || !outKey.length)
return nil;
BOOL handled = NO;
BOOL handledWithoutActions = NO;
for (int i = 0; i < outKey.length;) {
unichar c = [outKey characterAtIndex:i];
@ -525,7 +531,7 @@ const NSString* kEasterEggKmxName = @"EnglishSpanish.kmx";
KMCompStore *store1 = [self.kmx.store objectAtIndex:x1];
KMCompStore *store2 = [self.kmx.store objectAtIndex:x2];
store1.string = [[NSString alloc] initWithString:store2.string];
handled = YES;
handledWithoutActions = YES;
i+=4;
break;
@ -535,7 +541,7 @@ const NSString* kEasterEggKmxName = @"EnglishSpanish.kmx";
KMCompStore *store = [self.kmx.store objectAtIndex:x1];
KMCompStore *storeSaved = [self.kmx.storeSaved objectAtIndex:x1];
store.string = [[NSString alloc] initWithString:storeSaved.string];
handled = YES;
handledWithoutActions = YES;
i+=3;
break;
}
@ -544,7 +550,15 @@ const NSString* kEasterEggKmxName = @"EnglishSpanish.kmx";
KMCompStore *store = [self.kmx.store objectAtIndex:x1];
KMCompStore *storeSaved = [self.kmx.storeSaved objectAtIndex:x1];
storeSaved.string = [[NSString alloc] initWithString:store.string];
handled = YES;
handledWithoutActions = YES;
NSDictionary *actionObj = [[NSDictionary alloc] initWithObjectsAndKeys:[[NSString alloc] initWithString:store.string], [NSNumber numberWithUnsignedInteger:x1], nil];
NSDictionary *action = [[NSDictionary alloc] initWithObjectsAndKeys:actionObj, Q_SAVEOPT, nil];
if (!actions)
actions = [[NSMutableArray alloc] initWithObjects:action, nil];
else
[actions addAction:action];
i+=3;
break;
}
@ -569,7 +583,7 @@ const NSString* kEasterEggKmxName = @"EnglishSpanish.kmx";
NSLog(@"tmpCtxBuf = \"%@\"", [self.tmpCtxBuf codeString]);
}
if (!actions && handled) {
if (!actions && handledWithoutActions) {
NSDictionary *action = [[NSDictionary alloc] initWithObjectsAndKeys:@"", Q_NUL, nil];
actions = [[NSMutableArray alloc] initWithObjects:action, nil];
}