From 09b07e3619a71f142c1a3af41244d756e1230142 Mon Sep 17 00:00:00 2001
From: Geenz <geenz@geenzo.com>
Date: Tue, 8 Jan 2013 16:22:54 -0500
Subject: [PATCH] Big change set: - LLAppDelegate header relocated to LLWindow.
  Definition is still present in secondlife-bin (for compatibility reasons
 when loading a nib). - Return key handling fixed. - Command key now acts the
 same as the control key by issuing control character codes when the command
 key is pressed. - We now retrieve the window pointer directly from the app
 delegate in LLWindow.

---
 indra/llwindow/CMakeLists.txt                 |   1 +
 .../llappdelegate-objc.h}                     |   2 +-
 indra/llwindow/llkeyboardmacosx.cpp           |  35 ++----
 indra/llwindow/llopenglview-objc.h            |   5 -
 indra/llwindow/llopenglview-objc.mm           | 113 ++++++++++++------
 indra/llwindow/llwindowmacosx-objc.h          |  11 ++
 indra/llwindow/llwindowmacosx-objc.mm         |  56 ++++++---
 indra/llwindow/llwindowmacosx.cpp             |  22 ++--
 indra/newview/CMakeLists.txt                  |   8 +-
 ...cosx-delegate.mm => llappdelegate-objc.mm} |   4 +-
 indra/newview/llappviewermacosx-objc.h        |  19 ---
 indra/newview/llappviewermacosx-objc.mm       |  20 ----
 indra/newview/llappviewermacosx.cpp           |   2 +-
 13 files changed, 157 insertions(+), 141 deletions(-)
 rename indra/{newview/llappviewermacosx-delegate.h => llwindow/llappdelegate-objc.h} (89%)
 rename indra/newview/{llappviewermacosx-delegate.mm => llappdelegate-objc.mm} (91%)
 delete mode 100644 indra/newview/llappviewermacosx-objc.h
 delete mode 100644 indra/newview/llappviewermacosx-objc.mm

diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index 8a38db751ed..84e01698265 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -82,6 +82,7 @@ if (DARWIN)
     llwindowmacosx.h
     llwindowmacosx-objc.h
     llopenglview-objc.h
+    llappdelegate-objc.h
     )
 
   # We use a bunch of deprecated system APIs.
diff --git a/indra/newview/llappviewermacosx-delegate.h b/indra/llwindow/llappdelegate-objc.h
similarity index 89%
rename from indra/newview/llappviewermacosx-delegate.h
rename to indra/llwindow/llappdelegate-objc.h
index 848ccbde621..56b7a307971 100644
--- a/indra/newview/llappviewermacosx-delegate.h
+++ b/indra/llwindow/llappdelegate-objc.h
@@ -8,7 +8,7 @@
 
 #import <Cocoa/Cocoa.h>
 #import "llopenglview-objc.h"
-#include "llappviewermacosx-objc.h"
+#include "llwindowmacosx-objc.h"
 
 @interface LLAppDelegate : NSObject <NSApplicationDelegate> {
 	LLNSWindow *window;
diff --git a/indra/llwindow/llkeyboardmacosx.cpp b/indra/llwindow/llkeyboardmacosx.cpp
index 077ebea9092..3db94e8835e 100644
--- a/indra/llwindow/llkeyboardmacosx.cpp
+++ b/indra/llwindow/llkeyboardmacosx.cpp
@@ -167,13 +167,15 @@ void LLKeyboardMacOSX::resetMaskKeys()
 	// MBW -- XXX -- This mirrors the operation of the Windows version of resetMaskKeys().
 	//    It looks a bit suspicious, as it won't correct for keys that have been released.
 	//    Is this the way it's supposed to work?
+	
+	// We apply the modifier masks directly within getModifiers.  So check to see which masks we've applied.
 
 	if(mask & MAC_SHIFT_KEY)
 	{
 		mKeyLevel[KEY_SHIFT] = TRUE;
 	}
 
-	if(mask & (MAC_CTRL_KEY))
+	if(mask & MAC_CTRL_KEY)
 	{
 		mKeyLevel[KEY_CONTROL] = TRUE;
 	}
@@ -198,25 +200,9 @@ static BOOL translateKeyMac(const U16 key, const U32 mask, KEY &outKey, U32 &out
 
 MASK LLKeyboardMacOSX::updateModifiers(const U32 mask)
 {
-	// translate the mask
-	MASK out_mask = 0;
-
-	if(mask & MAC_SHIFT_KEY)
-	{
-		out_mask |= MASK_SHIFT;
-	}
-
-	if(mask & MAC_CTRL_KEY || mask & MAC_CMD_KEY)
-	{
-		out_mask |= MASK_CONTROL;
-	}
-
-	if(mask & MAC_ALT_KEY)
-	{
-		out_mask |= MASK_ALT;
-	}
-
-	return out_mask;
+	// This is handled for us in LLNSWindow on OS X.
+	
+	return mask;
 }
 
 BOOL LLKeyboardMacOSX::handleKeyDown(const U16 key, const U32 mask)
@@ -231,12 +217,7 @@ BOOL LLKeyboardMacOSX::handleKeyDown(const U16 key, const U32 mask)
 	{
 		handled = handleTranslatedKeyDown(translated_key, translated_mask);
 	}
-	if (!handled)
-	{
-		LL_INFOS("Keyboard") << "Unhandled key: " << mTranslateKeyMap[key] << LL_ENDL;
-	} else {
-		LL_INFOS("Keyboard") << "Handled key: " << mTranslateKeyMap[key] << LL_ENDL;
-	}
+	
 	return handled;
 }
 
@@ -272,7 +253,7 @@ MASK LLKeyboardMacOSX::currentMask(BOOL for_mouse_event)
 		if (mask & MAC_CMD_KEY) result |= MASK_CONTROL;
 	}
 
-	return result;
+	return mask;
 }
 
 void LLKeyboardMacOSX::scanKeyboard()
diff --git a/indra/llwindow/llopenglview-objc.h b/indra/llwindow/llopenglview-objc.h
index 20589e321d3..84126213926 100644
--- a/indra/llwindow/llopenglview-objc.h
+++ b/indra/llwindow/llopenglview-objc.h
@@ -40,8 +40,3 @@
 }
 
 @end
-
-void setLLNSWindowRef(LLNSWindow* window);
-void setLLOpenGLViewRef(LLOpenGLView* view);
-LLNSWindow* winRef;
-LLOpenGLView* glviewRef;
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index e5e198b8565..d91601152bc 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -132,62 +132,72 @@
 
 - (void) mouseDragged:(NSEvent *)theEvent
 {
-	[super mouseDragged:theEvent];
+	[_window mouseDragged:theEvent];
 }
 
 - (void) scrollWheel:(NSEvent *)theEvent
 {
-	[super scrollWheel:theEvent];
+	[_window scrollWheel:theEvent];
 }
 
 - (void) mouseDown:(NSEvent *)theEvent
 {
-	[super mouseDown:theEvent];
+	[_window mouseDown:theEvent];
 }
 
 - (void) mouseUp:(NSEvent *)theEvent
 {
-	[super mouseUp:theEvent];
+	[_window mouseUp:theEvent];
 }
 
 - (void) rightMouseDown:(NSEvent *)theEvent
 {
-	[super rightMouseDown:theEvent];
+	[_window rightMouseDown:theEvent];
 }
 
 - (void) rightMouseUp:(NSEvent *)theEvent
 {
-	[super rightMouseUp:theEvent];
+	[_window rightMouseUp:theEvent];
+}
+
+- (void) otherMouseDown:(NSEvent *)theEvent
+{
+	[_window otherMouseDown:theEvent];
+}
+
+- (void) otherMouseUp:(NSEvent *)theEvent
+{
+	[_window otherMouseUp:theEvent];
 }
 
 - (void) keyUp:(NSEvent *)theEvent
 {
-	[super keyUp:theEvent];
+	[_window keyUp:theEvent];
 }
 
 - (void) keyDown:(NSEvent *)theEvent
 {
-	[super keyDown:theEvent];
+	[_window keyDown:theEvent];
 }
 
 - (void) mouseMoved:(NSEvent *)theEvent
 {
-	[super mouseMoved:theEvent];
+	[_window mouseMoved:theEvent];
 }
 
 - (void) flagsChanged:(NSEvent *)theEvent
 {
-	[super flagsChanged:theEvent];
+	[_window flagsChanged:theEvent];
 }
 
 - (BOOL) becomeFirstResponder
 {
-	return [super becomeFirstResponder];
+	return [_window becomeFirstResponder];
 }
 
 - (BOOL) resignFirstResponder
 {
-	return [super resignFirstResponder];
+	return [_window resignFirstResponder];
 }
 
 @end
@@ -200,58 +210,99 @@
 
 - (id) init
 {
+	//[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType, nil]];
 	return self;
 }
 
 - (void) keyDown:(NSEvent *)theEvent
 {
-	callKeyDown([theEvent keyCode], [theEvent modifierFlags]);
-	
+	callKeyDown([theEvent keyCode], mModifiers);
 	NSString *chars = [theEvent characters];
 	for (uint i = 0; i < [chars length]; i++)
 	{
 		// Enter and Return are special cases.
 		unichar returntest = [chars characterAtIndex:i];
-		if ((returntest == NSCarriageReturnCharacter || returntest == NSEnterCharacter) && !([theEvent modifierFlags] & NSCommandKeyMask) && !([theEvent modifierFlags] & NSAlternateKeyMask) && !([theEvent modifierFlags] & NSControlKeyMask))
+		if ((returntest == NSCarriageReturnCharacter || returntest == NSEnterCharacter) &&
+			!([theEvent modifierFlags] & NSCommandKeyMask) &&
+			!([theEvent modifierFlags] & NSAlternateKeyMask) &&
+			!([theEvent modifierFlags] & NSControlKeyMask))
 		{
-			callUnicodeCallback(returntest, 0);
+			callUnicodeCallback(13, 0);
 		} else {
-			callUnicodeCallback([chars characterAtIndex:i], [theEvent modifierFlags]);
+			// The command key being pressed is also a special case.
+			// Control + <character> produces an ASCII control character code.
+			// Command + <character> produces just the character's code.
+			// Check to see if the command key is pressed, then filter through the different character ranges that are relevant to control characters, and subtract the appropriate range.
+			if ([theEvent modifierFlags] & NSCommandKeyMask)
+			{
+				if (returntest >= 64 && returntest <= 95)
+				{
+					callUnicodeCallback(returntest - 63, mModifiers);
+				} else if (returntest >= 97 && returntest <= 122)
+				{
+					callUnicodeCallback(returntest - 96, mModifiers);
+				}
+			} else {
+				callUnicodeCallback(returntest, mModifiers);
+			}
 		}
 	}
 }
 
 - (void) keyUp:(NSEvent *)theEvent {
-	callKeyUp([theEvent keyCode], [theEvent modifierFlags]);
+	callKeyUp([theEvent keyCode], mModifiers);
 }
 
 - (void)flagsChanged:(NSEvent *)theEvent {
-	mModifiers = [theEvent modifierFlags];
+	uint modifiers = [theEvent modifierFlags];
+	
+	// Filter through our modifier keys, and only pick out the ones we care about.
+	
+	mModifiers = 0;
+	if (modifiers & NSCommandKeyMask)
+	{
+		mModifiers |= 0x0001;
+	}
+	
+	if (modifiers & NSAlternateKeyMask)
+	{
+		mModifiers |= 0x0002;
+	}
+	
+	if (modifiers & NSShiftKeyMask)
+	{
+		mModifiers |= 0x0004;
+	}
+	
+	if (modifiers & NSControlKeyMask)
+	{
+		mModifiers |= 0x0001;
+	}
 }
 
 - (void) mouseDown:(NSEvent *)theEvent
 {
 	if ([theEvent clickCount] >= 2)
 	{
-		callDoubleClick(mMousePos, [theEvent modifierFlags]);
+		callDoubleClick(mMousePos, mModifiers);
 	} else if ([theEvent clickCount] == 1) {
-		callLeftMouseDown(mMousePos, [theEvent modifierFlags]);
+		callLeftMouseDown(mMousePos, mModifiers);
 	}
 }
 
 - (void) mouseUp:(NSEvent *)theEvent
 {
-	callLeftMouseUp(mMousePos, [theEvent modifierFlags]);
+	callLeftMouseUp(mMousePos, mModifiers);
 }
 
 - (void) rightMouseDown:(NSEvent *)theEvent
 {
-	callRightMouseDown(mMousePos, [theEvent modifierFlags]);
+	callRightMouseDown(mMousePos, mModifiers);
 }
 
 - (void) rightMouseUp:(NSEvent *)theEvent
 {
-	callRightMouseUp(mMousePos, [theEvent modifierFlags]);
+	callRightMouseUp(mMousePos, mModifiers);
 }
 
 - (void)mouseMoved:(NSEvent *)theEvent
@@ -292,12 +343,12 @@
 
 - (void) otherMouseDown:(NSEvent *)theEvent
 {
-	callMiddleMouseDown(mMousePos, 0);
+	callMiddleMouseDown(mMousePos, mModifiers);
 }
 
 - (void) otherMouseUp:(NSEvent *)theEvent
 {
-	callMiddleMouseUp(mMousePos, 0);
+	callMiddleMouseUp(mMousePos, mModifiers);
 }
 
 - (void) otherMouseDragged:(NSEvent *)theEvent
@@ -330,13 +381,3 @@
 }
 
 @end
-
-void setLLNSWindowRef(LLNSWindow* window)
-{
-	winRef = window;
-}
-
-void setLLOpenGLViewRef(LLOpenGLView* view)
-{
-	glviewRef = view;
-}
diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h
index 414491f9482..57b3d112967 100644
--- a/indra/llwindow/llwindowmacosx-objc.h
+++ b/indra/llwindow/llwindowmacosx-objc.h
@@ -38,8 +38,19 @@ typedef void *CursorRef;
 typedef void *NSWindowRef;
 typedef void *GLViewRef;
 
+// These are defined in llappviewermacosx.cpp.
+bool initViewer();
+void handleQuit();
+bool runMainLoop();
+void initMainLoop();
+void cleanupViewer();
+
 /* Defined in llwindowmacosx-objc.mm: */
+int createNSApp(int argc, const char **argv);
 void setupCocoa();
+bool pasteBoardAvailable();
+bool copyToPBoard(const unsigned short *str, unsigned int len);
+const unsigned short *copyFromPBoard();
 CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY);
 short releaseImageCursor(CursorRef ref);
 short setImageCursor(CursorRef ref);
diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm
index 5a024eda460..1a64c94b2d8 100644
--- a/indra/llwindow/llwindowmacosx-objc.mm
+++ b/indra/llwindow/llwindowmacosx-objc.mm
@@ -29,6 +29,7 @@
 #include <Cocoa/Cocoa.h>
 #include "llwindowmacosx-objc.h"
 #include "llopenglview-objc.h"
+#include "llappdelegate-objc.h"
 
 /*
  * These functions are broken out into a separate file because the
@@ -37,6 +38,11 @@
  * linden headers with any objective-C++ source.
  */
 
+int createNSApp(int argc, const char *argv[])
+{
+	return NSApplicationMain(argc, argv);
+}
+
 void setupCocoa()
 {
 	static bool inited = false;
@@ -49,15 +55,6 @@ void setupCocoa()
 		// ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr' 
 		// when init'ing the Cocoa App window.		
 		[[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"];
-		
-		// This is a bit of voodoo taken from the Apple sample code "CarbonCocoa_PictureCursor":
-		//   http://developer.apple.com/samplecode/CarbonCocoa_PictureCursor/index.html
-		
-		//	Needed for Carbon based applications which call into Cocoa
-		// NSApplicationLoad();
-
-		//	Must first call [[[NSWindow alloc] init] release] to get the NSWindow machinery set up so that NSCursor can use a window to cache the cursor image
-		//[[[NSWindow alloc] init] release];
 
 		[pool release];
 		
@@ -65,6 +62,38 @@ void setupCocoa()
 	}
 }
 
+bool copyToPBoard(const unsigned short *str, unsigned int len)
+{
+	NSPasteboard *pboard = [NSPasteboard generalPasteboard];
+	[pboard clearContents];
+	
+	NSArray *contentsToPaste = [[NSArray alloc] initWithObjects:[NSString stringWithCharacters:str length:len], nil];
+	
+	return [pboard writeObjects:contentsToPaste];
+}
+
+bool pasteBoardAvailable()
+{
+	NSArray *classArray = [NSArray arrayWithObject:[NSString class]];
+	return [[NSPasteboard generalPasteboard] canReadObjectForClasses:classArray options:[NSDictionary dictionary]];
+}
+
+const unsigned short *copyFromPBoard()
+{
+	NSPasteboard *pboard = [NSPasteboard generalPasteboard];
+	NSArray *classArray = [NSArray arrayWithObject:[NSString class]];
+	NSString *str = NULL;
+	BOOL ok = [pboard canReadObjectForClasses:classArray options:[NSDictionary dictionary]];
+	if (ok)
+	{
+		NSArray *objToPaste = [pboard readObjectsForClasses:classArray options:[NSDictionary dictionary]];
+		str = [objToPaste objectAtIndex:0];
+	}
+	unichar* temp = (unichar*)calloc([str length], sizeof(unichar));
+	[str getCharacters:temp];
+	return temp;
+}
+
 CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY)
 {
 	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
@@ -287,15 +316,12 @@ void removeGLView(GLViewRef view)
 
 NSWindowRef getMainAppWindow()
 {
-	[(LLNSWindow*)winRef setAcceptsMouseMovedEvents:TRUE];
+	LLNSWindow *winRef = [(LLAppDelegate*)[[NSApplication sharedApplication] delegate] window];
+	
+	[winRef setAcceptsMouseMovedEvents:TRUE];
 	return winRef;
 }
 
-GLViewRef getGLView()
-{
-	return glviewRef;
-}
-
 unsigned int getModifiers()
 {
 	return [NSEvent modifierFlags];
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 902391e170b..93b9f4c4849 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -1029,25 +1029,27 @@ void LLWindowMacOSX::flashIcon(F32 seconds)
 
 BOOL LLWindowMacOSX::isClipboardTextAvailable()
 {
-	BOOL result = false;
-	// TODO: Clipboard support.
-	return result;
+	return pasteBoardAvailable();
 }
 
 BOOL LLWindowMacOSX::pasteTextFromClipboard(LLWString &dst)
-{
-	BOOL result = false;
-	
-	// TODO: Clipboard support.
-
-	return result;
+{	
+	llutf16string str(copyFromPBoard());
+	dst = utf16str_to_wstring(str);
+	if (dst != L"")
+	{
+		return true;
+	} else {
+		return false;
+	}
 }
 
 BOOL LLWindowMacOSX::copyTextToClipboard(const LLWString &s)
 {
 	BOOL result = false;
+	llutf16string utf16str = wstring_to_utf16str(s);
 	
-	// TODO: Clipboard support.
+	result = copyToPBoard(utf16str.data(), utf16str.length());
 
 	return result;
 }
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 73f5ecc38cc..c60940f93c0 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1231,10 +1231,9 @@ source_group("CMake Rules" FILES ViewerInstall.cmake)
 
 if (DARWIN)
   LIST(APPEND viewer_SOURCE_FILES llappviewermacosx.cpp)
-  LIST(APPEND viewer_SOURCE_FILES llappviewermacosx-objc.h)
-  LIST(APPEND viewer_SOURCE_FILES llappviewermacosx-objc.mm)
-  LIST(APPEND viewer_SOURCE_FILES llappviewermacosx-delegate.h)
-  LIST(APPEND viewer_SOURCE_FILES llappviewermacosx-delegate.mm)
+
+  # This should be compiled with the viewer.
+  LIST(APPEND viewer_SOURCE_FILES llappdelegate-objc.mm)
 
   find_library(AGL_LIBRARY AGL)
   find_library(APPKIT_LIBRARY AppKit)
@@ -1532,6 +1531,7 @@ if (FMOD)
   if (DARWIN)
     set(fmodwrapper_SOURCE_FILES fmodwrapper.cpp)
     add_library(fmodwrapper SHARED ${fmodwrapper_SOURCE_FILES})
+    find_library(CARBON_LIBRARY Carbon)
     set(fmodwrapper_needed_LIBRARIES ${FMOD_LIBRARY} ${CARBON_LIBRARY})
     set_target_properties(
       fmodwrapper
diff --git a/indra/newview/llappviewermacosx-delegate.mm b/indra/newview/llappdelegate-objc.mm
similarity index 91%
rename from indra/newview/llappviewermacosx-delegate.mm
rename to indra/newview/llappdelegate-objc.mm
index 7baeeb1de82..f5143d7578d 100644
--- a/indra/newview/llappviewermacosx-delegate.mm
+++ b/indra/newview/llappdelegate-objc.mm
@@ -6,7 +6,7 @@
 //
 //
 
-#import "llappviewermacosx-delegate.h"
+#import "llappdelegate-objc.h"
 
 @implementation LLAppDelegate
 
@@ -21,8 +21,6 @@
 {
 	frameTimer = nil;
 	
-	setLLNSWindowRef([self window]);
-	
 	if (initViewer())
 	{
 		frameTimer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(mainLoop) userInfo:nil repeats:YES];
diff --git a/indra/newview/llappviewermacosx-objc.h b/indra/newview/llappviewermacosx-objc.h
deleted file mode 100644
index ed9017ca5df..00000000000
--- a/indra/newview/llappviewermacosx-objc.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-//  NSObject_llappviewermacosx_objc.h
-//  SecondLife
-//
-//  Created by Geenz on 12/16/12.
-//
-//
-
-#include <boost/tr1/functional.hpp>
-typedef std::tr1::function<void()> VoidCallback;
-typedef void* ViewerAppRef;
-
-int createNSApp(int argc, const char **argv);
-
-bool initViewer();
-void handleQuit();
-bool runMainLoop();
-void initMainLoop();
-void cleanupViewer();
\ No newline at end of file
diff --git a/indra/newview/llappviewermacosx-objc.mm b/indra/newview/llappviewermacosx-objc.mm
deleted file mode 100644
index ca2090b790f..00000000000
--- a/indra/newview/llappviewermacosx-objc.mm
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-//  llappviewermacosx.m
-//  SecondLife
-//
-//  Created by Geenz on 12/12/12.
-//
-//
-
-#import <Cocoa/Cocoa.h>
-#import <ApplicationServices/ApplicationServices.h>
-#include "llappviewermacosx-objc.h"
-#import "llappviewermacosx-delegate.h"
-
-int createNSApp(int argc, const char *argv[])
-{
-	return NSApplicationMain(argc, argv);
-}
-
-
-
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 6e7b91347bc..b199405a664 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -31,7 +31,7 @@
 #endif
 
 #include "llappviewermacosx.h"
-#include "llappviewermacosx-objc.h"
+#include "llwindowmacosx-objc.h"
 #include "llcommandlineparser.h"
 
 #include "llmemtype.h"
-- 
GitLab