diff options
Diffstat (limited to 'src/osx')
-rw-r--r-- | src/osx/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/osx/Convert.cpp | 30 | ||||
-rw-r--r-- | src/osx/graphics/quartz/Convert.cpp | 26 | ||||
-rw-r--r-- | src/osx/gui/Window.mm | 28 |
4 files changed, 53 insertions, 33 deletions
diff --git a/src/osx/CMakeLists.txt b/src/osx/CMakeLists.txt index 5d20c2ec..9be5ccf5 100644 --- a/src/osx/CMakeLists.txt +++ b/src/osx/CMakeLists.txt @@ -1,11 +1,13 @@ set(CRU_OSX_BASE_INCLUDE_DIR ${CRU_INCLUDE_DIR}/cru/osx) add_library(cru_osx_base SHARED + Convert.cpp Exception.cpp Resource.cpp ) target_sources(cru_osx_base PUBLIC + ${CRU_OSX_BASE_INCLUDE_DIR}/Convert.hpp ${CRU_OSX_BASE_INCLUDE_DIR}/Exception.hpp ${CRU_OSX_BASE_INCLUDE_DIR}/Resource.hpp ) diff --git a/src/osx/Convert.cpp b/src/osx/Convert.cpp new file mode 100644 index 00000000..51ebedf4 --- /dev/null +++ b/src/osx/Convert.cpp @@ -0,0 +1,30 @@ +#include "cru/osx/Convert.hpp" + +namespace cru::cru::platform::osx { +CFStringRef Convert(const String& string) { + return CFStringCreateWithBytes( + nullptr, reinterpret_cast<const UInt8*>(string.data()), + string.size() * sizeof(std::uint16_t), kCFStringEncodingUTF16, false); +} + +String Convert(CFStringRef string) { + auto d = CFStringCreateExternalRepresentation(nullptr, string, + kCFStringEncodingUTF16, 0); + auto l = CFDataGetLength(d); + + auto s = String(reinterpret_cast<const std::uint16_t*>(CFDataGetBytePtr(d)), + CFDataGetLength(d) / 2); + + CFRelease(d); + + return s; +} + +CFRange Convert(const Range& range) { + return CFRangeMake(range.position, range.count); +} + +Range Convert(const CFRange& range) { + return Range(range.location, range.length); +} +} // namespace cru::cru::platform::osx diff --git a/src/osx/graphics/quartz/Convert.cpp b/src/osx/graphics/quartz/Convert.cpp index a6892da9..af054e5a 100644 --- a/src/osx/graphics/quartz/Convert.cpp +++ b/src/osx/graphics/quartz/Convert.cpp @@ -2,24 +2,6 @@ #include <cstdint> namespace cru::platform::graphics::osx::quartz { -CFStringRef Convert(const String& string) { - return CFStringCreateWithBytes( - nullptr, reinterpret_cast<const UInt8*>(string.data()), - string.size() * sizeof(std::uint16_t), kCFStringEncodingUTF16, false); -} - -String Convert(CFStringRef string) { - auto d = CFStringCreateExternalRepresentation(nullptr, string, - kCFStringEncodingUTF16, 0); - auto l = CFDataGetLength(d); - - auto s = String(reinterpret_cast<const std::uint16_t*>(CFDataGetBytePtr(d)), - CFDataGetLength(d) / 2); - - CFRelease(d); - - return s; -} CGPoint Convert(const Point& point) { return CGPoint{point.x, point.y}; } Point Convert(const CGPoint& point) { return Point(point.x, point.y); } @@ -46,12 +28,4 @@ Rect Convert(const CGRect& rect) { static_cast<float>(rect.size.width), static_cast<float>(rect.size.height)}; } - -CFRange Convert(const Range& range) { - return CFRangeMake(range.position, range.count); -} - -Range Convert(const CFRange& range) { - return Range(range.location, range.length); -} } // namespace cru::platform::graphics::osx::quartz diff --git a/src/osx/gui/Window.mm b/src/osx/gui/Window.mm index cb46a75a..ff5572f2 100644 --- a/src/osx/gui/Window.mm +++ b/src/osx/gui/Window.mm @@ -1,7 +1,7 @@ #include "cru/osx/gui/Window.hpp" #include "cru/common/Range.hpp" -#include "cru/osx/graphics/quartz/Convert.hpp" +#include "cru/osx/Convert.hpp" #include "cru/osx/graphics/quartz/Painter.hpp" #include "cru/osx/gui/Keyboard.hpp" #include "cru/osx/gui/UiApplication.hpp" @@ -19,6 +19,8 @@ #include <limits> #include <memory> +using cru::platform::osx::Convert; + @interface WindowDelegate : NSObject <NSWindowDelegate> - (id)init:(cru::platform::gui::osx::details::OsxWindowPrivate*)p; @end @@ -264,11 +266,17 @@ class OsxInputMethodContextPrivate { void RaiseCompositionEvent(); void RaiseTextEvent(StringView text); + Point GetCandidateWindowPosition() const { return candidate_window_point_; } void SetCandidateWindowPosition(const Point& p) { candidate_window_point_ = p; } + Range GetSelectionRange() const { return selection_range_; } + void SetSelectionRange(Range selection_range) { selection_range_ = selection_range; } + private: CompositionText composition_text_; + Range selection_range_; + OsxInputMethodContext* input_method_context_; // On Osx, this is the text lefttop point on screen. @@ -369,7 +377,7 @@ NSMutableAttributedString* _text; } - (NSRange)selectedRange { - return NSRange{NSNotFound, 0}; + return NSMakeRange(_p->GetSelectionRange().position, _p->GetSelectionRange().count); } - (void)setMarkedText:(id)string @@ -385,8 +393,9 @@ NSMutableAttributedString* _text; atIndex:replacementRange.location]; cru::platform::gui::CompositionText composition_text; - composition_text.text = - cru::platform::graphics::osx::quartz::Convert((CFStringRef)[_text string]); + composition_text.text = Convert((CFStringRef)[_text string]); + composition_text.selection.position = replacementRange.location + selectedRange.location; + composition_text.selection.count = selectedRange.length; _p->SetCompositionText(composition_text); _p->RaiseCompositionEvent(); } @@ -410,17 +419,22 @@ NSMutableAttributedString* _text; - (void)insertText:(id)string replacementRange:(NSRange)replacementRange { _text = nil; - cru::String s = cru::platform::graphics::osx::quartz::Convert((CFStringRef)string); + cru::String s = Convert((CFStringRef)string); _p->RaiseCompositionEndEvent(); _p->RaiseTextEvent(s); } - (NSUInteger)characterIndexForPoint:(NSPoint)point { - // TODO: Implement this. + return NSNotFound; } - (NSRect)firstRectForCharacterRange:(NSRange)range actualRange:(NSRangePointer)actualRange { - // TODO: Implement this. + NSRect result; + result.origin.x = _p->GetCandidateWindowPosition().x; + result.origin.y = _p->GetCandidateWindowPosition().y; + result.size.height = 16; + result.size.width = 0; + return result; } - (void)doCommandBySelector:(SEL)selector { |