diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/osx/gui/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/osx/gui/Clipboard.mm | 46 | ||||
-rw-r--r-- | src/osx/gui/ClipboardPrivate.h | 28 | ||||
-rw-r--r-- | src/osx/gui/UiApplication.mm | 9 | ||||
-rw-r--r-- | src/platform/gui/CMakeLists.txt | 1 |
5 files changed, 88 insertions, 0 deletions
diff --git a/src/osx/gui/CMakeLists.txt b/src/osx/gui/CMakeLists.txt index 93034bb6..f9bfd9c7 100644 --- a/src/osx/gui/CMakeLists.txt +++ b/src/osx/gui/CMakeLists.txt @@ -1,6 +1,7 @@ set(CRU_OSX_GUI_INCLUDE_DIR ${CRU_INCLUDE_DIR}/cru/osx/gui) add_library(cru_osx_gui SHARED + Clipboard.mm Cursor.mm InputMethod.mm Keyboard.mm @@ -8,12 +9,15 @@ add_library(cru_osx_gui SHARED UiApplication.mm Window.mm + ClipboardPrivate.h InputMethodPrivate.h CursorPrivate.h WindowPrivate.h ) target_sources(cru_osx_gui PUBLIC + ${CRU_OSX_GUI_INCLUDE_DIR}/Clipboard.hpp + ${CRU_OSX_GUI_INCLUDE_DIR}/Cursor.hpp ${CRU_OSX_GUI_INCLUDE_DIR}/InputMethod.hpp ${CRU_OSX_GUI_INCLUDE_DIR}/Keyboard.hpp ${CRU_OSX_GUI_INCLUDE_DIR}/Resource.hpp diff --git a/src/osx/gui/Clipboard.mm b/src/osx/gui/Clipboard.mm new file mode 100644 index 00000000..f9515d59 --- /dev/null +++ b/src/osx/gui/Clipboard.mm @@ -0,0 +1,46 @@ +#include "cru/osx/gui/Clipboard.hpp" +#include "ClipboardPrivate.h" + +#include "cru/common/Logger.hpp" +#include "cru/osx/Convert.hpp" + +#include <memory> + +namespace cru::platform::gui::osx { +using cru::platform::osx::Convert; + +OsxClipboard::OsxClipboard(cru::platform::gui::IUiApplication* ui_application, + std::unique_ptr<details::OsxClipboardPrivate> p) + : OsxGuiResource(ui_application), p_(std::move(p)) {} + +OsxClipboard::~OsxClipboard() {} + +String OsxClipboard::GetText() { return p_->GetText(); } + +void OsxClipboard::SetText(String text) { p_->SetText(text); } + +namespace details { +OsxClipboardPrivate::OsxClipboardPrivate(NSPasteboard* pasteboard) : pasteboard_(pasteboard) {} + +OsxClipboardPrivate::~OsxClipboardPrivate() {} + +String OsxClipboardPrivate::GetText() { + auto result = [pasteboard_ readObjectsForClasses:@[ NSString.class ] options:nil]; + if (result == nil) { + log::TagWarn(log_tag, u"Failed to get text from clipboard"); + return u""; + } else { + if (result.count == 0) { + return u""; + } else { + return Convert((CFStringRef)result[0]); + } + } +} + +void OsxClipboardPrivate::SetText(String text) { + [pasteboard_ clearContents]; + [pasteboard_ writeObjects:@[ (NSString*)Convert(text) ]]; +} +} +} // namespace cru::platform::gui::osx diff --git a/src/osx/gui/ClipboardPrivate.h b/src/osx/gui/ClipboardPrivate.h new file mode 100644 index 00000000..2a12973c --- /dev/null +++ b/src/osx/gui/ClipboardPrivate.h @@ -0,0 +1,28 @@ +#pragma once +#include "cru/common/Base.hpp" +#include "cru/osx/gui/Clipboard.hpp" + +#include <AppKit/AppKit.h> + +namespace cru::platform::gui::osx { +namespace details { +class OsxClipboardPrivate : public Object { + CRU_DEFINE_CLASS_LOG_TAG( + u"cru::platform::gui::osx::details::OsxClipboardPrivate") + public: + explicit OsxClipboardPrivate(NSPasteboard* pasteboard); + + CRU_DELETE_COPY(OsxClipboardPrivate) + CRU_DELETE_MOVE(OsxClipboardPrivate) + + ~OsxClipboardPrivate(); + + public: + String GetText(); + void SetText(String text); + + private: + NSPasteboard* pasteboard_; +}; +} // namespace details +} // namespace cru::platform::gui::osx diff --git a/src/osx/gui/UiApplication.mm b/src/osx/gui/UiApplication.mm index d6cf14f3..865111ba 100644 --- a/src/osx/gui/UiApplication.mm +++ b/src/osx/gui/UiApplication.mm @@ -1,10 +1,13 @@ #include "cru/osx/gui/UiApplication.hpp" +#include "ClipboardPrivate.h" #include "cru/common/Logger.hpp" #include "cru/osx/graphics/quartz/Factory.hpp" +#include "cru/osx/gui/Clipboard.hpp" #include "cru/osx/gui/Cursor.hpp" #include "cru/osx/gui/Window.hpp" #include "cru/platform/graphics/Factory.hpp" +#include "cru/platform/gui/Base.hpp" #include "cru/platform/gui/UiApplication.hpp" #include "cru/platform/gui/Window.hpp" @@ -55,6 +58,8 @@ class OsxUiApplicationPrivate { std::unique_ptr<OsxCursorManager> cursor_manager_; + std::unique_ptr<OsxClipboard> clipboard_; + std::unique_ptr<platform::graphics::osx::quartz::QuartzGraphicsFactory> quartz_graphics_factory_; }; @@ -75,6 +80,8 @@ OsxUiApplication::OsxUiApplication() [NSApp setDelegate:p_->app_delegate_]; p_->quartz_graphics_factory_ = std::make_unique<graphics::osx::quartz::QuartzGraphicsFactory>(); p_->cursor_manager_ = std::make_unique<OsxCursorManager>(this); + p_->clipboard_ = std::make_unique<OsxClipboard>( + this, std::make_unique<details::OsxClipboardPrivate>([NSPasteboard generalPasteboard])); } OsxUiApplication::~OsxUiApplication() {} @@ -156,6 +163,8 @@ INativeWindow* OsxUiApplication::CreateWindow(INativeWindow* parent, CreateWindo ICursorManager* OsxUiApplication::GetCursorManager() { return p_->cursor_manager_.get(); } +IClipboard* OsxUiApplication::GetClipboard() { return p_->clipboard_.get(); } + graphics::IGraphicsFactory* OsxUiApplication::GetGraphicsFactory() { return p_->quartz_graphics_factory_.get(); } diff --git a/src/platform/gui/CMakeLists.txt b/src/platform/gui/CMakeLists.txt index 7f16a0e0..297d0080 100644 --- a/src/platform/gui/CMakeLists.txt +++ b/src/platform/gui/CMakeLists.txt @@ -5,6 +5,7 @@ add_library(cru_platform_gui SHARED ) target_sources(cru_platform_gui PUBLIC ${CRU_PLATFORM_GUI_INCLUDE_DIR}/Base.hpp + ${CRU_PLATFORM_GUI_INCLUDE_DIR}/Clipboard.hpp ${CRU_PLATFORM_GUI_INCLUDE_DIR}/Cursor.hpp ${CRU_PLATFORM_GUI_INCLUDE_DIR}/InputMethod.hpp ${CRU_PLATFORM_GUI_INCLUDE_DIR}/Keyboard.hpp |