Browse Source

UI: Add Chromium-compatible NSApplication subclass

This fixes some crashes in browser panels on Mac, but it's also harmless
if browser panels aren't enabled.
Theodore Dubois 5 years ago
parent
commit
bd3cbf23ad
2 changed files with 33 additions and 0 deletions
  1. 4 0
      UI/obs-app.cpp
  2. 29 0
      UI/platform-osx.mm

+ 4 - 0
UI/obs-app.cpp

@@ -1761,6 +1761,10 @@ static int run_program(fstream &logFile, int argc, char *argv[])
 
 	QCoreApplication::addLibraryPath(".");
 
+#if __APPLE__
+	InstallNSApplicationSubclass();
+#endif
+
 	OBSApp program(argc, argv, profilerNameStore.get());
 	try {
 		bool created_log = false;

+ 29 - 0
UI/platform-osx.mm

@@ -196,3 +196,32 @@ void EnableOSXDockIcon(bool enable)
 		[NSApp setActivationPolicy:
 				NSApplicationActivationPolicyProhibited];
 }
+
+/*
+ * This custom NSApplication subclass makes the app compatible with CEF. Qt
+ * also has an NSApplication subclass, but it doesn't conflict thanks to Qt
+ * using arcane magic to hook into the NSApplication superclass itself if the
+ * program has its own NSApplication subclass.
+ */
+
+@protocol CrAppProtocol
+- (BOOL)isHandlingSendEvent;
+@end
+
+@interface OBSApplication : NSApplication <CrAppProtocol>
+@property (nonatomic, getter=isHandlingSendEvent) BOOL handlingSendEvent;
+@end
+
+@implementation OBSApplication
+- (void)sendEvent:(NSEvent *)event
+{
+	_handlingSendEvent = YES;
+	[super sendEvent:event];
+	_handlingSendEvent = NO;
+}
+@end
+
+void InstallNSApplicationSubclass()
+{
+	[OBSApplication sharedApplication];
+}