aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/osx/Convert.hpp12
-rw-r--r--include/cru/osx/graphics/quartz/Convert.hpp10
-rw-r--r--src/osx/CMakeLists.txt2
-rw-r--r--src/osx/Convert.cpp30
-rw-r--r--src/osx/graphics/quartz/Convert.cpp26
-rw-r--r--src/osx/gui/Window.mm28
6 files changed, 67 insertions, 41 deletions
diff --git a/include/cru/osx/Convert.hpp b/include/cru/osx/Convert.hpp
new file mode 100644
index 00000000..6d2c0327
--- /dev/null
+++ b/include/cru/osx/Convert.hpp
@@ -0,0 +1,12 @@
+#pragma once
+#include "Resource.hpp"
+
+#include <CoreFoundation/CFString.h>
+
+namespace cru::platform::osx {
+CFStringRef Convert(const String& string);
+String Convert(CFStringRef string);
+
+CFRange Convert(const Range& range);
+Range Convert(const CFRange& range);
+} // namespace cru::platform::osx
diff --git a/include/cru/osx/graphics/quartz/Convert.hpp b/include/cru/osx/graphics/quartz/Convert.hpp
index a8cc270e..1b5a186a 100644
--- a/include/cru/osx/graphics/quartz/Convert.hpp
+++ b/include/cru/osx/graphics/quartz/Convert.hpp
@@ -1,14 +1,11 @@
#pragma once
-#include "cru/platform/Matrix.hpp"
-#include "cru/common/String.hpp"
#include "cru/common/Range.hpp"
+#include "cru/common/String.hpp"
+#include "cru/platform/Matrix.hpp"
#include <CoreGraphics/CoreGraphics.h>
namespace cru::platform::graphics::osx::quartz {
-CFStringRef Convert(const String& string);
-String Convert(CFStringRef string);
-
CGAffineTransform Convert(const Matrix& matrix);
Matrix Convert(const CGAffineTransform& matrix);
@@ -20,7 +17,4 @@ Size Convert(const CGSize& size);
CGRect Convert(const Rect& rect);
Rect Convert(const CGRect& rect);
-
-CFRange Convert(const Range& range);
-Range Convert(const CFRange& range);
} // namespace cru::platform::graphics::osx::quartz
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 {