From 39c0b5ad6814db9e46ac2cb4ab64a37e0e19749b Mon Sep 17 00:00:00 2001 From: crupest Date: Thu, 16 Apr 2020 16:22:50 +0800 Subject: ... --- include/cru/platform/native/base.hpp | 2 +- include/cru/platform/native/input_method.hpp | 42 +++++++++++++++------ include/cru/win/native/input_method.hpp | 56 ++++++++++++++++++++-------- include/cru/win/native/window.hpp | 2 + 4 files changed, 73 insertions(+), 29 deletions(-) (limited to 'include/cru') diff --git a/include/cru/platform/native/base.hpp b/include/cru/platform/native/base.hpp index 3cbf77c5..e0ecbda7 100644 --- a/include/cru/platform/native/base.hpp +++ b/include/cru/platform/native/base.hpp @@ -11,7 +11,7 @@ struct IUiApplication; struct INativeWindow; struct INativeWindowResolver; struct IInputMethodManager; -struct IInputMethodContextRef; +struct IInputMethodContext; struct Dpi { float x; diff --git a/include/cru/platform/native/input_method.hpp b/include/cru/platform/native/input_method.hpp index cce10d93..00017502 100644 --- a/include/cru/platform/native/input_method.hpp +++ b/include/cru/platform/native/input_method.hpp @@ -4,32 +4,50 @@ #include "cru/common/event.hpp" #include +#include namespace cru::platform::native { -// It is a reference, so there is a ref count, remember to destroy it to release -// the ref after use. -struct IInputMethodContextRef : virtual INativeResource { +struct CompositionUnderline { + int start; + int end; +}; + +struct CompositionText { + std::string text; + std::vector underlines; + int caret_position; +}; + +struct IInputMethodContext : virtual INativeResource { // Return true if you should draw composition text manually. Return false if // system will take care of that for you. virtual bool ShouldManuallyDrawCompositionText() = 0; - // Reset composition string. Use this method to prepare typing. - virtual void Reset() = 0; - // Get the composition string. - virtual std::string GetCompositionText() = 0; + + virtual void EnableIME() = 0; + + virtual void DisableIME() = 0; + + virtual void CompleteComposition() = 0; + + virtual void CancelComposition() = 0; + + virtual const CompositionText& GetCompositionText() = 0; + // Set the candidate window lefttop. Use this method to prepare typing. virtual void SetCandidateWindowPosition(const Point& point) = 0; + // Triggered when user starts composition. virtual IEvent* CompositionStartEvent() = 0; + // Triggered when user stops composition. virtual IEvent* CompositionEndEvent() = 0; - // Triggered every time composition text changes, event args is the new - // composition text. - virtual IEvent* CompositionTextChangeEvent() = 0; + + // Triggered every time composition text changes. + virtual IEvent* CompositionEvent() = 0; }; struct IInputMethodManager : virtual INativeResource { - // Get a reference of context of a window. - virtual std::unique_ptr GetContext( + virtual std::unique_ptr GetContext( INativeWindow* window) = 0; }; } // namespace cru::platform::native diff --git a/include/cru/win/native/input_method.hpp b/include/cru/win/native/input_method.hpp index 7dc9526a..56e678a9 100644 --- a/include/cru/win/native/input_method.hpp +++ b/include/cru/win/native/input_method.hpp @@ -1,5 +1,6 @@ // Some useful information can be found from chromium code: // https://chromium.googlesource.com/chromium/chromium/+/refs/heads/master/ui/base/win/ime_input.h +// https://chromium.googlesource.com/chromium/chromium/+/refs/heads/master/ui/base/win/ime_input.cc #pragma once #include "resource.hpp" @@ -10,23 +11,47 @@ #include namespace cru::platform::native::win { -class WinInputMethodContextRef : public WinNativeResource, - public virtual IInputMethodContextRef { +class AutoHIMC : public Object { public: - WinInputMethodContextRef(WinNativeWindow* window); + explicit AutoHIMC(HWND hwnd); - CRU_DELETE_COPY(WinInputMethodContextRef) - CRU_DELETE_MOVE(WinInputMethodContextRef) + CRU_DELETE_COPY(AutoHIMC) - ~WinInputMethodContextRef() override; + AutoHIMC(AutoHIMC&& other); + AutoHIMC& operator=(AutoHIMC&& other); - ::HIMC GetHandle() const { return handle_; } + ~AutoHIMC() override; + + HWND GetHwnd() const { return hwnd_; } + + HIMC Get() const { return handle_; } + + private: + HWND hwnd_; + HIMC handle_; +}; + +class WinInputMethodContext : public WinNativeResource, + public virtual IInputMethodContext { + public: + WinInputMethodContext(gsl::not_null window); + + CRU_DELETE_COPY(WinInputMethodContext) + CRU_DELETE_MOVE(WinInputMethodContext) + + ~WinInputMethodContext() override; bool ShouldManuallyDrawCompositionText() override { return true; } - void Reset() override; + void EnableIME() override; + + void DisableIME() override; + + void CompleteComposition() override; - std::string GetCompositionText() override; + void CancelComposition() override; + + const CompositionText& GetCompositionText() override; void SetCandidateWindowPosition(const Point& point) override; @@ -34,22 +59,21 @@ class WinInputMethodContextRef : public WinNativeResource, IEvent* CompositionEndEvent() override; - IEvent* CompositionTextChangeEvent() override; + IEvent* CompositionEvent() override; private: void OnWindowNativeMessage(WindowNativeMessageEventArgs& args); + std::optional TryGetHIMC(); + private: - [[maybe_unused]] WinNativeWindow* window_; + std::shared_ptr native_window_resolver_; std::vector event_revoker_guards_; - ::HWND window_handle_; - ::HIMC handle_; - Event composition_start_event_; Event composition_end_event_; - Event composition_text_change_event_; + Event composition_event_; }; class WinInputMethodManager : public WinNativeResource, @@ -63,7 +87,7 @@ class WinInputMethodManager : public WinNativeResource, ~WinInputMethodManager() override; public: - std::unique_ptr GetContext( + std::unique_ptr GetContext( INativeWindow* window) override; }; } // namespace cru::platform::native::win diff --git a/include/cru/win/native/window.hpp b/include/cru/win/native/window.hpp index 2129895c..45f1f16a 100644 --- a/include/cru/win/native/window.hpp +++ b/include/cru/win/native/window.hpp @@ -177,4 +177,6 @@ class WinNativeWindowResolver : public WinNativeResource, private: WinNativeWindow* window_; }; + +WinNativeWindow* Resolve(gsl::not_null resolver); } // namespace cru::platform::native::win -- cgit v1.2.3