]> git.mxchange.org Git - flightgear.git/commitdiff
Cocoa clipboard implementation.
authorJames Turner <zakalawe@mac.com>
Sun, 5 Aug 2012 20:00:05 +0000 (21:00 +0100)
committerJames Turner <zakalawe@mac.com>
Sun, 5 Aug 2012 20:00:05 +0000 (21:00 +0100)
Fix OS-X build by supplying a Cocoa clipboard implementation.

src/Scripting/CMakeLists.txt
src/Scripting/ClipboardCocoa.mm [new file with mode: 0644]

index 4a528c91f0c57beece91840e9ff70cc739ba94f8..42692b55a95578e095d5159f52e3237229d11e88 100644 (file)
@@ -17,6 +17,8 @@ set(HEADERS
 
 if(WIN32)
   list(APPEND SOURCES ClipboardWindows.cxx)
+elseif(APPLE)
+    list(APPEND SOURCES ClipboardCocoa.mm)
 else()
   find_package(X11)
   if(X11_FOUND)
diff --git a/src/Scripting/ClipboardCocoa.mm b/src/Scripting/ClipboardCocoa.mm
new file mode 100644 (file)
index 0000000..8e0b0ab
--- /dev/null
@@ -0,0 +1,105 @@
+// Cocoa implementation of clipboard access for Nasal
+//
+// Copyright (C) 2012  James Turner <zakalawe@mac.com>
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+#include "NasalClipboard.hxx"
+
+#include <simgear/debug/logstream.hxx>
+
+#include <Cocoa/Cocoa.h>
+
+namespace {
+  class CocoaAutoreleasePool
+  {
+  public:
+    CocoaAutoreleasePool()
+    {
+      pool = [[NSAutoreleasePool alloc] init];
+    }
+    
+    ~CocoaAutoreleasePool()
+    {
+      [pool release];
+    }
+    
+  private:
+    NSAutoreleasePool* pool;
+  };
+}
+
+static NSString* stdStringToCocoa(const std::string& s)
+{
+  return [NSString stringWithUTF8String:s.c_str()];
+}
+
+static std::string stdStringFromCocoa(NSString* s)
+{
+  return std::string([s UTF8String]);
+}
+
+/**
+ */
+class ClipboardCocoa: public NasalClipboard
+{
+  public:
+
+    /**
+     * Get clipboard contents as text
+     */
+    virtual std::string getText(Type type)
+    {
+      CocoaAutoreleasePool pool;
+      
+      if( type == CLIPBOARD )
+      {
+        NSPasteboard* pboard = [NSPasteboard generalPasteboard];
+        NSString* nstext = [pboard stringForType:NSPasteboardTypeString];
+        return stdStringFromCocoa(nstext);
+      }
+      
+      return "";
+    }
+
+    /**
+     * Set clipboard contents as text
+     */
+    virtual bool setText(const std::string& text, Type type)
+    {
+      CocoaAutoreleasePool pool;
+      
+      if( type == CLIPBOARD )
+      {
+        NSPasteboard* pboard = [NSPasteboard generalPasteboard];
+        NSString* nstext = stdStringToCocoa(text);
+        [pboard clearContents];
+        [pboard setString:nstext forType:NSPasteboardTypeString];
+        return true;
+      }
+      
+      return false;
+    }
+
+  protected:
+
+    std::string _selection;
+};
+
+//------------------------------------------------------------------------------
+NasalClipboard::Ptr NasalClipboard::create()
+{
+  return NasalClipboard::Ptr(new ClipboardCocoa);
+}