Skip to content

Commit

Permalink
replace deprecated API calls
Browse files Browse the repository at this point in the history
  • Loading branch information
groverlynn authored and lotem committed Mar 6, 2024
1 parent 32d4d88 commit baeb420
Show file tree
Hide file tree
Showing 11 changed files with 264 additions and 226 deletions.
2 changes: 1 addition & 1 deletion .clang-format
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
BasedOnStyle: Chromium
SortIncludes: false
SortIncludes: false
4 changes: 4 additions & 0 deletions Squirrel.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
A4FC48CB0F6530EF0069BE81 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A4FC48C90F6530EF0069BE81 /* Localizable.strings */; };
D26434552706A15100857391 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D26434542706A15100857391 /* QuartzCore.framework */; };
E93074B70A5C264700470842 /* InputMethodKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E93074B60A5C264700470842 /* InputMethodKit.framework */; };
F45E005F2B8CA81C00179B75 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F45E005E2B8CA81C00179B75 /* UserNotifications.framework */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
Expand Down Expand Up @@ -278,6 +279,7 @@
A4FC48CA0F6530EF0069BE81 /* en */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
D26434542706A15100857391 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
E93074B60A5C264700470842 /* InputMethodKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = InputMethodKit.framework; path = /System/Library/Frameworks/InputMethodKit.framework; sourceTree = "<absolute>"; };
F45E005E2B8CA81C00179B75 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand All @@ -287,6 +289,7 @@
files = (
D26434552706A15100857391 /* QuartzCore.framework in Frameworks */,
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
F45E005F2B8CA81C00179B75 /* UserNotifications.framework in Frameworks */,
E93074B70A5C264700470842 /* InputMethodKit.framework in Frameworks */,
A4B8E1B30F645B870094E08B /* Carbon.framework in Frameworks */,
447765C925C30E97002415AF /* Sparkle.framework in Frameworks */,
Expand Down Expand Up @@ -379,6 +382,7 @@
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
isa = PBXGroup;
children = (
F45E005E2B8CA81C00179B75 /* UserNotifications.framework */,
D26434542706A15100857391 /* QuartzCore.framework */,
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
Expand Down
6 changes: 3 additions & 3 deletions SquirrelApplicationDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
// outlet of NSApp's instance
@interface SquirrelApplicationDelegate : NSObject

@property(nonatomic, copy) IBOutlet NSMenu* menu;
@property(nonatomic, strong) IBOutlet SquirrelPanel* panel;
@property(nonatomic, strong) IBOutlet id updater;
@property(nonatomic, weak) IBOutlet NSMenu* menu;
@property(nonatomic, weak) IBOutlet SquirrelPanel* panel;
@property(nonatomic, weak) IBOutlet id updater;

@property(nonatomic, readonly, strong) SquirrelConfig* config;
@property(nonatomic, readonly) BOOL enableNotifications;
Expand Down
101 changes: 60 additions & 41 deletions SquirrelApplicationDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#import <rime_api.h>
#import "SquirrelConfig.h"
#import "SquirrelPanel.h"
#import <UserNotifications/UserNotifications.h>

static NSString* const kRimeWikiURL = @"https://github.com/rime/home/wiki";

Expand All @@ -22,41 +23,60 @@ - (IBAction)syncUserData:(id)sender {

- (IBAction)configure:(id)sender {
[[NSWorkspace sharedWorkspace]
openURL:[NSURL URLWithString:[@"file://"
stringByAppendingString:
(@"~/Library/Rime")
.stringByStandardizingPath]]];
openURL:[NSURL fileURLWithPath:@"~/Library/Rime/"
.stringByExpandingTildeInPath
isDirectory:YES]];
}

- (IBAction)openWiki:(id)sender {
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:kRimeWikiURL]];
}

void show_message(const char* msg_text, const char* msg_id) {
@autoreleasepool {
id notification = [[NSClassFromString(@"NSUserNotification") alloc] init];
[notification performSelector:@selector(setTitle:)
withObject:NSLocalizedString(@"Squirrel", nil)];
[notification performSelector:@selector(setSubtitle:)
withObject:NSLocalizedString(@(msg_text), nil)];
id notificationCenter = [(id)NSClassFromString(@"NSUserNotificationCenter")
performSelector:@selector(defaultUserNotificationCenter)];
[notificationCenter
performSelector:@selector(removeAllDeliveredNotifications)];
[notificationCenter performSelector:@selector(deliverNotification:)
withObject:notification];
}
UNUserNotificationCenter* center =
UNUserNotificationCenter.currentNotificationCenter;
[center requestAuthorizationWithOptions:UNAuthorizationOptionAlert |
UNAuthorizationOptionProvisional
completionHandler:^(BOOL granted, NSError* error) {
if (error) {
NSLog(@"User notification authorization error: %@",
error.debugDescription);
}
}];
[center getNotificationSettingsWithCompletionHandler:^(
UNNotificationSettings* settings) {
if ((settings.authorizationStatus == UNAuthorizationStatusAuthorized ||
settings.authorizationStatus == UNAuthorizationStatusProvisional) &&
(settings.alertSetting == UNNotificationSettingEnabled)) {
UNMutableNotificationContent* content =
[[UNMutableNotificationContent alloc] init];
content.title = NSLocalizedString(@"Squirrel", nil);
content.subtitle = NSLocalizedString(@(msg_text), nil);
if (@available(macOS 12.0, *)) {
content.interruptionLevel = UNNotificationInterruptionLevelActive;
}
UNNotificationRequest* request =
[UNNotificationRequest requestWithIdentifier:@"SquirrelNotification"
content:content
trigger:nil];
[center addNotificationRequest:request
withCompletionHandler:^(NSError* error) {
if (error) {
NSLog(@"User notification request error: %@",
error.debugDescription);
}
}];
}
}];
}

static void show_status_message(const char* msg_text_long,
const char* msg_text_short,
const char* msg_id) {
SquirrelPanel* panel = NSApp.squirrelAppDelegate.panel;
if (panel) {
NSString* msgLong = msg_text_long ? @(msg_text_long) : nil;
NSString* msgShort = msg_text_short ? @(msg_text_short) : nil;
[panel updateStatusLong:msgLong statusShort:msgShort];
}
NSString* msgLong = msg_text_long ? @(msg_text_long) : nil;
NSString* msgShort = msg_text_short ? @(msg_text_short) : nil;
[panel updateStatusLong:msgLong statusShort:msgShort];
}

void notification_handler(void* context_object,
Expand All @@ -74,7 +94,7 @@ void notification_handler(void* context_object,
return;
}
// off?
id app_delegate = (__bridge id)context_object;
SquirrelApplicationDelegate* app_delegate = (__bridge id)context_object;
if (app_delegate && ![app_delegate enableNotifications]) {
return;
}
Expand All @@ -93,10 +113,10 @@ void notification_handler(void* context_object,
const char* option_name = message_value + !state;
struct rime_string_slice_t state_label_long =
rime_get_api()->get_state_label_abbreviated(session_id, option_name,
state, NO);
state, False);
struct rime_string_slice_t state_label_short =
rime_get_api()->get_state_label_abbreviated(session_id, option_name,
state, YES);
state, True);

if (state_label_long.str || state_label_short.str) {
const char* short_message =
Expand All @@ -109,13 +129,13 @@ void notification_handler(void* context_object,
}

- (void)setupRime {
NSString* userDataDir = (@"~/Library/Rime").stringByStandardizingPath;
NSString* userDataDir = @"~/Library/Rime".stringByExpandingTildeInPath;
NSFileManager* fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:userDataDir]) {
if (![fileManager createDirectoryAtPath:userDataDir
withIntermediateDirectories:YES
attributes:nil
error:NULL]) {
error:nil]) {
NSLog(@"Error creating user data directory: %@", userDataDir);
}
}
Expand All @@ -127,8 +147,8 @@ - (void)setupRime {
squirrel_traits.user_data_dir = userDataDir.UTF8String;
squirrel_traits.distribution_code_name = "Squirrel";
squirrel_traits.distribution_name = "鼠鬚管";
squirrel_traits.distribution_version =
[[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"] UTF8String];
squirrel_traits.distribution_version = [[[NSBundle mainBundle]
objectForInfoDictionaryKey:(NSString*)kCFBundleVersionKey] UTF8String];
squirrel_traits.app_name = "rime.squirrel";
rime_get_api()->setup(&squirrel_traits);
}
Expand Down Expand Up @@ -187,26 +207,27 @@ - (void)loadSchemaSpecificSettings:(NSString*)schemaId {
// prevent freezing the system
- (BOOL)problematicLaunchDetected {
BOOL detected = NO;
NSString* logfile = [NSTemporaryDirectory()
stringByAppendingPathComponent:@"squirrel_launch.dat"];
NSURL* logfile = [[NSURL fileURLWithPath:NSTemporaryDirectory()
isDirectory:YES]
URLByAppendingPathComponent:@"squirrel_launch.dat"];
// NSLog(@"[DEBUG] archive: %@", logfile);
NSData* archive = [NSData dataWithContentsOfFile:logfile
options:NSDataReadingUncached
error:nil];
NSData* archive = [NSData dataWithContentsOfURL:logfile
options:NSDataReadingUncached
error:nil];
if (archive) {
NSDate* previousLaunch =
[NSKeyedUnarchiver unarchivedObjectOfClass:NSDate.class
fromData:archive
error:NULL];
if (previousLaunch && previousLaunch.timeIntervalSinceNow >= -2) {
error:nil];
if (previousLaunch.timeIntervalSinceNow >= -2) {
detected = YES;
}
}
NSDate* now = [NSDate date];
NSData* record = [NSKeyedArchiver archivedDataWithRootObject:now
requiringSecureCoding:NO
error:NULL];
[record writeToFile:logfile atomically:NO];
error:nil];
[record writeToURL:logfile atomically:NO];
return detected;
}

Expand Down Expand Up @@ -259,9 +280,7 @@ - (void)awakeFromNib {
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSDistributedNotificationCenter defaultCenter] removeObserver:self];
if (_panel) {
[_panel hide];
}
[_panel hide];
}

@end // SquirrelApplicationDelegate
Expand Down
6 changes: 3 additions & 3 deletions SquirrelConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ typedef NSMutableDictionary<NSString*, NSNumber*> SquirrelMutableAppOptions;
@interface SquirrelConfig : NSObject

@property(nonatomic, readonly) BOOL isOpen;
@property(nonatomic, copy) NSString* colorSpace;
@property(nonatomic, readonly) NSString* schemaId;
@property(nonatomic, strong) NSString* colorSpace;
@property(nonatomic, strong, readonly) NSString* schemaId;

- (BOOL)openBaseConfig;
- (BOOL)openWithSchemaId:(NSString*)schemaId baseConfig:(SquirrelConfig*)config;
Expand All @@ -16,7 +16,7 @@ typedef NSMutableDictionary<NSString*, NSNumber*> SquirrelMutableAppOptions;
- (BOOL)hasSection:(NSString*)section;

- (BOOL)getBool:(NSString*)option;
- (NSInteger)getInt:(NSString*)option;
- (int)getInt:(NSString*)option;
- (double)getDouble:(NSString*)option;
- (NSNumber*)getOptionalBool:(NSString*)option;
- (NSNumber*)getOptionalInt:(NSString*)option;
Expand Down
62 changes: 32 additions & 30 deletions SquirrelConfig.m
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,17 @@
@implementation SquirrelConfig {
NSMutableDictionary* _cache;
RimeConfig _config;
NSString* _schemaId;
SquirrelConfig* _baseConfig;
BOOL _isOpen;
}

- (instancetype)init {
self = [super init];
if (self) {
if (self = [super init]) {
_cache = [[NSMutableDictionary alloc] init];
_colorSpace = @"srgb";
}
self.colorSpace = @"srgb";
return self;
}

- (BOOL)isOpen {
return _isOpen;
}

- (NSString*)schemaId {
return _schemaId;
}

- (BOOL)openBaseConfig {
[self close];
_isOpen = !!rime_get_api()->config_open("squirrel", &_config);
Expand All @@ -52,6 +41,10 @@ - (void)close {
}
}

- (void)dealloc {
[self close];
}

- (BOOL)hasSection:(NSString*)section {
if (_isOpen) {
RimeConfigIterator iterator = {0};
Expand All @@ -68,17 +61,17 @@ - (BOOL)getBool:(NSString*)option {
return [self getOptionalBool:option].boolValue;
}

- (NSInteger)getInt:(NSString*)option {
return [self getOptionalInt:option].integerValue;
- (int)getInt:(NSString*)option {
return [self getOptionalInt:option].intValue;
}

- (double)getDouble:(NSString*)option {
return [self getOptionalDouble:option].doubleValue;
}

- (NSNumber*)getOptionalBool:(NSString*)option {
NSNumber* cachedValue = [self cachedValueOfClass:[NSNumber class]
forKey:option];
NSNumber* cachedValue = [self cachedValueOfObjCType:@encode(BOOL)
forKey:option];
if (cachedValue) {
return cachedValue;
}
Expand All @@ -91,8 +84,8 @@ - (NSNumber*)getOptionalBool:(NSString*)option {
}

- (NSNumber*)getOptionalInt:(NSString*)option {
NSNumber* cachedValue = [self cachedValueOfClass:[NSNumber class]
forKey:option];
NSNumber* cachedValue = [self cachedValueOfObjCType:@encode(int)
forKey:option];
if (cachedValue) {
return cachedValue;
}
Expand All @@ -105,8 +98,8 @@ - (NSNumber*)getOptionalInt:(NSString*)option {
}

- (NSNumber*)getOptionalDouble:(NSString*)option {
NSNumber* cachedValue = [self cachedValueOfClass:[NSNumber class]
forKey:option];
NSNumber* cachedValue = [self cachedValueOfObjCType:@encode(double)
forKey:option];
if (cachedValue) {
return cachedValue;
}
Expand Down Expand Up @@ -167,7 +160,16 @@ - (SquirrelAppOptions*)getAppOptions:(NSString*)appName {

- (id)cachedValueOfClass:(Class)aClass forKey:(NSString*)key {
id value = [_cache objectForKey:key];
if (value && [value isKindOfClass:aClass]) {
if ([value isMemberOfClass:aClass]) {
return value;
}
return nil;
}

- (NSNumber*)cachedValueOfObjCType:(const char*)type forKey:(NSString*)key {
id value = [_cache objectForKey:key];
if ([value isMemberOfClass:NSNumber.class] &&
!strcmp([value objCType], type)) {
return value;
}
return nil;
Expand All @@ -187,15 +189,15 @@ - (NSColor*)colorFromString:(NSString*)string {
sscanf(string.UTF8String, "0x%02x%02x%02x", &b, &g, &r);
}
if ([self.colorSpace isEqualToString:@"display_p3"]) {
return [NSColor colorWithDisplayP3Red:(CGFloat)r / 255.
green:(CGFloat)g / 255.
blue:(CGFloat)b / 255.
alpha:(CGFloat)a / 255.];
return [NSColor colorWithDisplayP3Red:r / 255.0
green:g / 255.0
blue:b / 255.0
alpha:a / 255.0];
} else { // sRGB by default
return [NSColor colorWithSRGBRed:(CGFloat)r / 255.
green:(CGFloat)g / 255.
blue:(CGFloat)b / 255.
alpha:(CGFloat)a / 255.];
return [NSColor colorWithSRGBRed:r / 255.0
green:g / 255.0
blue:b / 255.0
alpha:a / 255.0];
}
}

Expand Down
Loading

0 comments on commit baeb420

Please sign in to comment.