|
1
|
1 //
|
|
|
2 // PFC-ObjC.m
|
|
|
3 // pfc-test
|
|
|
4 //
|
|
|
5 // Created by PEPE on 28/07/14.
|
|
|
6 // Copyright (c) 2014 PEPE. All rights reserved.
|
|
|
7 //
|
|
|
8 #ifdef __APPLE__
|
|
|
9 #import <Foundation/Foundation.h>
|
|
|
10
|
|
|
11
|
|
|
12 #include <TargetConditionals.h>
|
|
|
13
|
|
|
14 #if TARGET_OS_MAC && !TARGET_OS_IPHONE
|
|
|
15 #import <Cocoa/Cocoa.h>
|
|
|
16 #endif
|
|
|
17
|
|
|
18 #include "pfc.h"
|
|
|
19 #include "sortstring.h"
|
|
|
20
|
|
|
21
|
|
|
22 namespace pfc {
|
|
|
23 void * thread::g_entry(void * arg) {
|
|
|
24 @autoreleasepool {
|
|
|
25 reinterpret_cast<thread*>(arg)->entry();
|
|
|
26 }
|
|
|
27 return NULL;
|
|
|
28 }
|
|
|
29 void thread::appleStartThreadPrologue() {
|
|
|
30 if (![NSThread isMultiThreaded]) [[[NSThread alloc] init] start];
|
|
|
31 }
|
|
|
32
|
|
|
33 bool isShiftKeyPressed() {
|
|
|
34 #if TARGET_OS_MAC && !TARGET_OS_IPHONE
|
|
|
35 return ( [NSEvent modifierFlags] & NSEventModifierFlagShift ) != 0;
|
|
|
36 #else
|
|
|
37 return false;
|
|
|
38 #endif
|
|
|
39 }
|
|
|
40 bool isCtrlKeyPressed() {
|
|
|
41 #if TARGET_OS_MAC && !TARGET_OS_IPHONE
|
|
|
42 return ( [NSEvent modifierFlags] & NSEventModifierFlagControl ) != 0;
|
|
|
43 #else
|
|
|
44 return false;
|
|
|
45 #endif
|
|
|
46 }
|
|
|
47 bool isAltKeyPressed() {
|
|
|
48 #if TARGET_OS_MAC && !TARGET_OS_IPHONE
|
|
|
49 return ( [NSEvent modifierFlags] & NSEventModifierFlagOption ) != 0;
|
|
|
50 #else
|
|
|
51 return false;
|
|
|
52 #endif
|
|
|
53 }
|
|
|
54
|
|
|
55 void inAutoReleasePool(std::function<void()> f) {
|
|
|
56 @autoreleasepool {
|
|
|
57 f();
|
|
|
58 }
|
|
|
59 }
|
|
|
60
|
|
|
61 void appleDebugLog( const char * str ) {
|
|
|
62 NSLog(@"%s\n", str );
|
|
|
63 }
|
|
|
64
|
|
|
65 bool appleRecycleFile( const char * path ) {
|
|
|
66 @autoreleasepool {
|
|
|
67 NSFileManager * manager = [NSFileManager defaultManager];
|
|
|
68 NSURL * url = [NSURL fileURLWithPath: [NSString stringWithUTF8String: path] ];
|
|
|
69 if (@available(iOS 11.0, *)) {
|
|
|
70 NSError * error = nil;
|
|
|
71 if ([manager trashItemAtURL: url resultingItemURL: nil error: &error]) {
|
|
|
72 return true;
|
|
|
73 }
|
|
|
74 if ([error.domain isEqualToString: NSCocoaErrorDomain] && error.code == NSFeatureUnsupportedError) {
|
|
|
75 // trashcan not supported, fall thru
|
|
|
76 } else {
|
|
|
77 // failed to remove
|
|
|
78 return false;
|
|
|
79 }
|
|
|
80 }
|
|
|
81 return [manager removeItemAtURL: url error: nil];
|
|
|
82 }
|
|
|
83 }
|
|
|
84 void appleSetThreadDescription( const char * str ) {
|
|
|
85 @autoreleasepool {
|
|
|
86 [NSThread currentThread].name = [NSString stringWithUTF8String: str];
|
|
|
87 }
|
|
|
88 }
|
|
|
89
|
|
|
90 pfc::string8 unicodeNormalizeD(const char * str) {
|
|
|
91 @autoreleasepool {
|
|
|
92 pfc::string8 ret;
|
|
|
93 NSString * v = [[NSString stringWithUTF8String: str] decomposedStringWithCanonicalMapping];
|
|
|
94 if ( v ) ret = v.UTF8String;
|
|
|
95 else ret = str;
|
|
|
96 return ret;
|
|
|
97 }
|
|
|
98 }
|
|
|
99 pfc::string8 unicodeNormalizeC(const char * str) {
|
|
|
100 @autoreleasepool {
|
|
|
101 pfc::string8 ret;
|
|
|
102 NSString * v = [[NSString stringWithUTF8String: str] precomposedStringWithCanonicalMapping];
|
|
|
103 if ( v ) ret = v.UTF8String;
|
|
|
104 else ret = str;
|
|
|
105 return ret;
|
|
|
106 }
|
|
|
107 }
|
|
|
108
|
|
|
109 int appleNaturalSortCompare(const char* s1, const char* s2) {
|
|
|
110 @autoreleasepool {
|
|
|
111 NSString * str1 = [NSString stringWithUTF8String: s1];
|
|
|
112 NSString * str2 = [NSString stringWithUTF8String: s2];
|
|
|
113 return (int) [str1 localizedCompare: str2];
|
|
|
114 }
|
|
|
115 }
|
|
|
116 int appleNaturalSortCompareI(const char* s1, const char* s2) {
|
|
|
117 @autoreleasepool {
|
|
|
118 NSString * str1 = [NSString stringWithUTF8String: s1];
|
|
|
119 NSString * str2 = [NSString stringWithUTF8String: s2];
|
|
|
120 return (int) [str1 localizedCaseInsensitiveCompare: str2];
|
|
|
121 }
|
|
|
122 }
|
|
|
123 [[noreturn]] void appleThrowException( const char * name, const char * reason ) {
|
|
|
124 @autoreleasepool {
|
|
|
125 @throw [NSException exceptionWithName: [NSString stringWithUTF8String: name] reason:[NSString stringWithUTF8String: reason] userInfo:nil];
|
|
|
126 }
|
|
|
127 }
|
|
|
128
|
|
|
129 #ifndef PFC_SORTSTRING_GENERIC
|
|
|
130 sortString_t makeSortString(const char* str) {
|
|
|
131 sortString_t ret;
|
|
|
132 ret.Attach( CFStringCreateWithCString(NULL, str, kCFStringEncodingUTF8) );
|
|
|
133 return ret;
|
|
|
134 }
|
|
|
135 int sortStringCompare(sortString_t const& s1, sortString_t const& s2) {
|
|
|
136 return (int) CFStringCompare(s1.p, s2.p, kCFCompareLocalized | kCFCompareNumerically );
|
|
|
137 }
|
|
|
138 int sortStringCompareI(sortString_t const& s1, sortString_t const& s2) {
|
|
|
139 return (int) CFStringCompare(s1.p, s2.p, kCFCompareLocalized | kCFCompareNumerically | kCFCompareCaseInsensitive );
|
|
|
140 }
|
|
|
141 #endif
|
|
|
142 }
|
|
|
143 #endif
|