annotate foosdk/sdk/foobar2000/shared/shared-apple.mm @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "shared.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "shared-apple.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #import <Cocoa/Cocoa.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 bool uSetClipboardString(const char * str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 @try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 NSPasteboard * pb = [NSPasteboard generalPasteboard];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 [pb clearContents];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 [pb setString: [NSString stringWithUTF8String: str] forType:NSPasteboardTypeString];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 } @catch (NSException *) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 bool uGetClipboardString(pfc::string_base & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 bool rv = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 NSPasteboard * pb = [NSPasteboard generalPasteboard];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 NSString * str = [pb stringForType: NSPasteboardTypeString];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 if ( str != nil ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 out = str.UTF8String;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 rv = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 static void wrapNoExcept(std::function<void()> f) noexcept {f();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 void fb2k::crashOnException(std::function<void()> f, const char * context) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 #if 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 auto fail = [context] ( const char * msg ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 if (context) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 fb2k::crashWithMessage(pfc::format(context, ": ", msg));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 fb2k::crashWithMessage(msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 @try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 f();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 } @catch(NSException * e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 auto header = pfc::format("NSException: ", e.name.UTF8String, " reason: ", e.reason.UTF8String );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 uAddDebugEvent( header );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 uAddDebugEvent("Stack:");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 for(NSString * str in e.callStackSymbols ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 uAddDebugEvent(str.UTF8String);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 fail(header);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 } catch(std::exception const & e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 fail(pfc::format("C++ exception: ", e.what()));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 } catch(...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 fail("Invalid exception");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 wrapNoExcept(f);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 }