aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-10-26 19:22:08 +0800
committercrupest <crupest@outlook.com>2021-10-26 19:22:08 +0800
commit395c5aa302518af0d9f66dfafc910b3eab88742d (patch)
tree5fa452058f5650fc62c37d0f435b8914c5b1aac5 /src
parent253341d93d8e3cb38a204b539822ca1cc8597754 (diff)
downloadcru-395c5aa302518af0d9f66dfafc910b3eab88742d.tar.gz
cru-395c5aa302518af0d9f66dfafc910b3eab88742d.tar.bz2
cru-395c5aa302518af0d9f66dfafc910b3eab88742d.zip
...
Diffstat (limited to 'src')
-rw-r--r--src/osx/graphics/quartz/TextLayout.cpp2
-rw-r--r--src/osx/gui/Window.mm43
-rw-r--r--src/osx/gui/WindowPrivate.h4
-rw-r--r--src/ui/host/WindowHost.cpp1
4 files changed, 44 insertions, 6 deletions
diff --git a/src/osx/graphics/quartz/TextLayout.cpp b/src/osx/graphics/quartz/TextLayout.cpp
index 41d04958..5145f9f9 100644
--- a/src/osx/graphics/quartz/TextLayout.cpp
+++ b/src/osx/graphics/quartz/TextLayout.cpp
@@ -146,6 +146,8 @@ Point OsxCTTextLayout::TextSinglePoint(Index position, bool trailing) {
}
}
+ if (lines_.empty()) return Point{};
+
return Convert(CTLineGetImageBounds(lines_.back(), nullptr)).GetRightTop();
}
diff --git a/src/osx/gui/Window.mm b/src/osx/gui/Window.mm
index 84cc1145..bbf05f4d 100644
--- a/src/osx/gui/Window.mm
+++ b/src/osx/gui/Window.mm
@@ -75,6 +75,10 @@ void OsxWindowPrivate::OnWindowDidResize() {
osx_window_->RequestRepaint();
}
+void OsxWindowPrivate::OnBecomeKeyWindow() { focus_event_.Raise(FocusChangeType::Gain); }
+
+void OsxWindowPrivate::OnResignKeyWindow() { focus_event_.Raise(FocusChangeType::Lost); }
+
void OsxWindowPrivate::OnMouseEnterLeave(MouseEnterLeaveType type) {
mouse_enter_leave_event_.Raise(type);
if (type == MouseEnterLeaveType::Enter) {
@@ -85,18 +89,18 @@ void OsxWindowPrivate::OnMouseEnterLeave(MouseEnterLeaveType type) {
}
}
-void OsxWindowPrivate::OnMouseMove(Point p) { mouse_move_event_.Raise(p); }
+void OsxWindowPrivate::OnMouseMove(Point p) { mouse_move_event_.Raise(TransformMousePoint(p)); }
void OsxWindowPrivate::OnMouseDown(MouseButton button, Point p, KeyModifier key_modifier) {
- mouse_down_event_.Raise({button, p, key_modifier});
+ mouse_down_event_.Raise({button, TransformMousePoint(p), key_modifier});
}
void OsxWindowPrivate::OnMouseUp(MouseButton button, Point p, KeyModifier key_modifier) {
- mouse_up_event_.Raise({button, p, key_modifier});
+ mouse_up_event_.Raise({button, TransformMousePoint(p), key_modifier});
}
void OsxWindowPrivate::OnMouseWheel(float delta, Point p, KeyModifier key_modifier) {
- mouse_wheel_event_.Raise({delta, p, key_modifier});
+ mouse_wheel_event_.Raise({delta, TransformMousePoint(p), key_modifier});
}
void OsxWindowPrivate::OnKeyDown(KeyCode key, KeyModifier key_modifier) {
@@ -116,6 +120,13 @@ void OsxWindowPrivate::UpdateCursor() {
[cursor->p_->ns_cursor_ set];
}
+
+Point OsxWindowPrivate::TransformMousePoint(const Point& point) {
+ Point r = point;
+ r.y = content_rect_.height - r.y;
+ return r;
+}
+
}
OsxWindow::OsxWindow(OsxUiApplication* ui_application, INativeWindow* parent, bool frame)
@@ -340,6 +351,16 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho
_p->OnMouseMove(cru::platform::Point(event.locationInWindow.x, event.locationInWindow.y));
}
+- (void)mouseDragged:(NSEvent*)event {
+ // cru::log::TagDebug(u"CruView", u"Recieved mouse move.");
+ _p->OnMouseMove(cru::platform::Point(event.locationInWindow.x, event.locationInWindow.y));
+}
+
+- (void)rightMouseDragged:(NSEvent*)event {
+ // cru::log::TagDebug(u"CruView", u"Recieved mouse move.");
+ _p->OnMouseMove(cru::platform::Point(event.locationInWindow.x, event.locationInWindow.y));
+}
+
- (void)mouseEntered:(NSEvent*)event {
// cru::log::TagDebug(u"CruView", u"Recieved mouse enter.");
_p->OnMouseEnterLeave(cru::platform::gui::MouseEnterLeaveType::Enter);
@@ -427,7 +448,7 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho
}
- (void)keyDown:(NSEvent*)event {
- cru::log::TagDebug(u"CruView", u"Recieved key down.");
+ // cru::log::TagDebug(u"CruView", u"Recieved key down.");
cru::platform::gui::KeyModifier key_modifier;
if (event.modifierFlags & NSEventModifierFlagControl)
@@ -448,7 +469,7 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho
}
- (void)keyUp:(NSEvent*)event {
- cru::log::TagDebug(u"CruView", u"Recieved key up.");
+ // cru::log::TagDebug(u"CruView", u"Recieved key up.");
cru::platform::gui::KeyModifier key_modifier;
if (event.modifierFlags & NSEventModifierFlagControl)
@@ -547,11 +568,13 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho
}
_input_context_text = nil;
+ _input_context_p->SetCompositionText(cru::platform::gui::CompositionText());
cru::String ss = Convert(s);
cru::log::TagDebug(u"CruView", u"Finish composition: {}, replacement range: ({}, {})", ss,
replacementRange.location, replacementRange.length);
+ _input_context_p->RaiseCompositionEvent();
_input_context_p->RaiseCompositionEndEvent();
_input_context_p->RaiseTextEvent(ss);
}
@@ -598,4 +621,12 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho
- (void)windowDidResize:(NSNotification*)notification {
_p->OnWindowDidResize();
}
+
+- (void)windowDidBecomeKey:(NSNotification*)notification {
+ _p->OnBecomeKeyWindow();
+}
+
+- (void)windowDidResignKey:(NSNotification*)notification {
+ _p->OnResignKeyWindow();
+}
@end
diff --git a/src/osx/gui/WindowPrivate.h b/src/osx/gui/WindowPrivate.h
index 68440fe0..0778195a 100644
--- a/src/osx/gui/WindowPrivate.h
+++ b/src/osx/gui/WindowPrivate.h
@@ -54,6 +54,8 @@ class OsxWindowPrivate {
void OnWindowDidExpose();
void OnWindowDidUpdate();
void OnWindowDidResize();
+ void OnBecomeKeyWindow();
+ void OnResignKeyWindow();
CGLayerRef GetDrawLayer() { return draw_layer_; }
@@ -63,6 +65,8 @@ class OsxWindowPrivate {
private:
void UpdateCursor();
+ Point TransformMousePoint(const Point& point);
+
private:
OsxWindow* osx_window_;
diff --git a/src/ui/host/WindowHost.cpp b/src/ui/host/WindowHost.cpp
index e24a883f..f60e2809 100644
--- a/src/ui/host/WindowHost.cpp
+++ b/src/ui/host/WindowHost.cpp
@@ -205,6 +205,7 @@ void WindowHost::Relayout(const Size& available_size) {
}
void WindowHost::Repaint() {
+ if (native_window_ == nullptr) return;
auto painter = native_window_->BeginPaint();
painter->Clear(colors::white);
root_render_object_->Draw(painter.get());