From bd0a5d825d4c82e94b575e31e55dd86e6480526e Mon Sep 17 00:00:00 2001 From: James Turner Date: Sun, 5 Aug 2012 21:00:05 +0100 Subject: [PATCH] Cocoa clipboard implementation. Fix OS-X build by supplying a Cocoa clipboard implementation. --- src/Scripting/CMakeLists.txt | 2 + src/Scripting/ClipboardCocoa.mm | 105 ++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 src/Scripting/ClipboardCocoa.mm diff --git a/src/Scripting/CMakeLists.txt b/src/Scripting/CMakeLists.txt index 4a528c91f..42692b55a 100644 --- a/src/Scripting/CMakeLists.txt +++ b/src/Scripting/CMakeLists.txt @@ -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 index 000000000..8e0b0abae --- /dev/null +++ b/src/Scripting/ClipboardCocoa.mm @@ -0,0 +1,105 @@ +// Cocoa implementation of clipboard access for Nasal +// +// Copyright (C) 2012 James Turner +// +// 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 + +#include + +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); +} -- 2.39.5