diff options
-rw-r--r-- | include/cru/platform/native/base.hpp | 1 | ||||
-rw-r--r-- | include/cru/platform/native/input_method.hpp | 6 | ||||
-rw-r--r-- | include/cru/platform/native/ui_application.hpp | 1 | ||||
-rw-r--r-- | include/cru/win/native/base.hpp | 19 | ||||
-rw-r--r-- | include/cru/win/native/god_window.hpp | 7 | ||||
-rw-r--r-- | include/cru/win/native/input_method.hpp | 19 | ||||
-rw-r--r-- | include/cru/win/native/keyboard.hpp | 2 | ||||
-rw-r--r-- | include/cru/win/native/resource.hpp | 2 | ||||
-rw-r--r-- | include/cru/win/native/ui_application.hpp | 7 | ||||
-rw-r--r-- | include/cru/win/native/window.hpp | 7 | ||||
-rw-r--r-- | include/cru/win/native/window_class.hpp | 4 | ||||
-rw-r--r-- | include/cru/win/native/window_render_target.hpp | 8 | ||||
-rw-r--r-- | src/win/native/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/win/native/input_method.cpp | 12 | ||||
-rw-r--r-- | src/win/native/ui_application.cpp | 6 |
15 files changed, 70 insertions, 33 deletions
diff --git a/include/cru/platform/native/base.hpp b/include/cru/platform/native/base.hpp index 883a9450..3cbf77c5 100644 --- a/include/cru/platform/native/base.hpp +++ b/include/cru/platform/native/base.hpp @@ -11,6 +11,7 @@ struct IUiApplication; struct INativeWindow; struct INativeWindowResolver; struct IInputMethodManager; +struct IInputMethodContextRef; struct Dpi { float x; diff --git a/include/cru/platform/native/input_method.hpp b/include/cru/platform/native/input_method.hpp index 6ca85852..cce10d93 100644 --- a/include/cru/platform/native/input_method.hpp +++ b/include/cru/platform/native/input_method.hpp @@ -8,7 +8,7 @@ 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 : INativeResource { +struct IInputMethodContextRef : 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; @@ -17,7 +17,7 @@ struct IInputMethodContextRef : INativeResource { // Get the composition string. virtual std::string GetCompositionText() = 0; // Set the candidate window lefttop. Use this method to prepare typing. - virtual void SetCandidateWindowPosition(const Point& point); + virtual void SetCandidateWindowPosition(const Point& point) = 0; // Triggered when user starts composition. virtual IEvent<std::nullptr_t>* CompositionStartEvent() = 0; // Triggered when user stops composition. @@ -27,7 +27,7 @@ struct IInputMethodContextRef : INativeResource { virtual IEvent<std::string>* CompositionTextChangeEvent() = 0; }; -struct IInputMethodManager : INativeResource { +struct IInputMethodManager : virtual INativeResource { // Get a reference of context of a window. virtual std::unique_ptr<IInputMethodContextRef> GetContext( INativeWindow* window) = 0; diff --git a/include/cru/platform/native/ui_application.hpp b/include/cru/platform/native/ui_application.hpp index 0825251e..92222929 100644 --- a/include/cru/platform/native/ui_application.hpp +++ b/include/cru/platform/native/ui_application.hpp @@ -45,5 +45,6 @@ struct IUiApplication : public virtual INativeResource { virtual cru::platform::graph::IGraphFactory* GetGraphFactory() = 0; virtual ICursorManager* GetCursorManager() = 0; + virtual IInputMethodManager* GetInputMethodManager() = 0; }; } // namespace cru::platform::native diff --git a/include/cru/win/native/base.hpp b/include/cru/win/native/base.hpp new file mode 100644 index 00000000..61c9f4da --- /dev/null +++ b/include/cru/win/native/base.hpp @@ -0,0 +1,19 @@ +#pragma once +#include "../win_pre_config.hpp" + +#include "cru/common/base.hpp" + +namespace cru::platform::native::win { +class GodWindow; +class TimerManager; +class WinCursor; +class WinCursorManager; +class WindowClass; +class WindowManager; +class WindowRenderTarget; +class WinNativeWindow; +class WinNativeWindowResolver; +class WinUiApplication; +class WinInputMethodManager; +class WinInputMethodContextRef; +} // namespace cru::platform::native::win diff --git a/include/cru/win/native/god_window.hpp b/include/cru/win/native/god_window.hpp index 3cf97e0b..33218a55 100644 --- a/include/cru/win/native/god_window.hpp +++ b/include/cru/win/native/god_window.hpp @@ -1,14 +1,9 @@ #pragma once -#include "../win_pre_config.hpp" - -#include "cru/common/base.hpp" +#include "base.hpp" #include <memory> namespace cru::platform::native::win { -class WinUiApplication; -class WindowClass; - class GodWindow : public Object { public: explicit GodWindow(WinUiApplication* application); diff --git a/include/cru/win/native/input_method.hpp b/include/cru/win/native/input_method.hpp index a0b18d63..7dc9526a 100644 --- a/include/cru/win/native/input_method.hpp +++ b/include/cru/win/native/input_method.hpp @@ -10,10 +10,8 @@ #include <imm.h> namespace cru::platform::native::win { -class WinNativeWindow; - class WinInputMethodContextRef : public WinNativeResource, - public IInputMethodContextRef { + public virtual IInputMethodContextRef { public: WinInputMethodContextRef(WinNativeWindow* window); @@ -53,4 +51,19 @@ class WinInputMethodContextRef : public WinNativeResource, Event<std::nullptr_t> composition_end_event_; Event<std::string> composition_text_change_event_; }; + +class WinInputMethodManager : public WinNativeResource, + public virtual IInputMethodManager { + public: + WinInputMethodManager(WinUiApplication* application); + + CRU_DELETE_COPY(WinInputMethodManager) + CRU_DELETE_MOVE(WinInputMethodManager) + + ~WinInputMethodManager() override; + + public: + std::unique_ptr<IInputMethodContextRef> GetContext( + INativeWindow* window) override; +}; } // namespace cru::platform::native::win diff --git a/include/cru/win/native/keyboard.hpp b/include/cru/win/native/keyboard.hpp index 2d5cc151..afa51c92 100644 --- a/include/cru/win/native/keyboard.hpp +++ b/include/cru/win/native/keyboard.hpp @@ -1,5 +1,5 @@ #pragma once -#include "../win_pre_config.hpp" +#include "base.hpp" #include "cru/platform/native/keyboard.hpp" diff --git a/include/cru/win/native/resource.hpp b/include/cru/win/native/resource.hpp index 2c76fe6b..5601e40e 100644 --- a/include/cru/win/native/resource.hpp +++ b/include/cru/win/native/resource.hpp @@ -1,5 +1,5 @@ #pragma once -#include "../win_pre_config.hpp" +#include "base.hpp" #include "cru/platform/resource.hpp" diff --git a/include/cru/win/native/ui_application.hpp b/include/cru/win/native/ui_application.hpp index 8de9d1b5..1c54cc05 100644 --- a/include/cru/win/native/ui_application.hpp +++ b/include/cru/win/native/ui_application.hpp @@ -10,11 +10,6 @@ class DirectGraphFactory; } namespace cru::platform::native::win { -class GodWindow; -class TimerManager; -class WindowManager; -class WinCursorManager; - class WinUiApplication : public WinNativeResource, public virtual IUiApplication { public: @@ -55,6 +50,7 @@ class WinUiApplication : public WinNativeResource, } ICursorManager* GetCursorManager() override; + IInputMethodManager* GetInputMethodManager() override; HINSTANCE GetInstanceHandle() const { return instance_handle_; } @@ -73,6 +69,7 @@ class WinUiApplication : public WinNativeResource, std::unique_ptr<WindowManager> window_manager_; std::unique_ptr<WinCursorManager> cursor_manager_; + std::unique_ptr<WinInputMethodManager> input_method_manager_; std::vector<std::function<void()>> quit_handlers_; }; diff --git a/include/cru/win/native/window.hpp b/include/cru/win/native/window.hpp index a27a3384..2129895c 100644 --- a/include/cru/win/native/window.hpp +++ b/include/cru/win/native/window.hpp @@ -7,13 +7,6 @@ #include <memory> namespace cru::platform::native::win { -class WinUiApplication; -class WinCursor; -class WindowClass; -class WindowManager; -class WindowRenderTarget; -class WinNativeWindowResolver; - class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { public: WinNativeWindow(WinUiApplication* application, WindowClass* window_class, diff --git a/include/cru/win/native/window_class.hpp b/include/cru/win/native/window_class.hpp index fd5102a5..2140c304 100644 --- a/include/cru/win/native/window_class.hpp +++ b/include/cru/win/native/window_class.hpp @@ -1,7 +1,5 @@ #pragma once -#include "../win_pre_config.hpp" - -#include "cru/common/base.hpp" +#include "base.hpp" #include <string> diff --git a/include/cru/win/native/window_render_target.hpp b/include/cru/win/native/window_render_target.hpp index ab1d68ef..552e87bc 100644 --- a/include/cru/win/native/window_render_target.hpp +++ b/include/cru/win/native/window_render_target.hpp @@ -1,7 +1,5 @@ #pragma once -#include "../win_pre_config.hpp" - -#include "cru/common/base.hpp" +#include "base.hpp" namespace cru::platform::graph::win::direct { class DirectGraphFactory; @@ -24,7 +22,9 @@ class WindowRenderTarget : public Object { return factory_; } - ID2D1DeviceContext* GetD2D1DeviceContext() { return d2d1_device_context_.Get(); } + ID2D1DeviceContext* GetD2D1DeviceContext() { + return d2d1_device_context_.Get(); + } // Resize the underlying buffer. void ResizeBuffer(int width, int height); diff --git a/src/win/native/CMakeLists.txt b/src/win/native/CMakeLists.txt index 521b32cf..ba4b3387 100644 --- a/src/win/native/CMakeLists.txt +++ b/src/win/native/CMakeLists.txt @@ -22,6 +22,7 @@ add_library(cru_win_native STATIC target_sources(cru_win_native PUBLIC ${CRU_WIN_NATIVE_INCLUDE_DIR}/cursor.hpp ${CRU_WIN_NATIVE_INCLUDE_DIR}/exception.hpp + ${CRU_WIN_NATIVE_INCLUDE_DIR}/base.hpp ${CRU_WIN_NATIVE_INCLUDE_DIR}/god_window.hpp ${CRU_WIN_NATIVE_INCLUDE_DIR}/input_method.hpp ${CRU_WIN_NATIVE_INCLUDE_DIR}/keyboard.hpp @@ -32,4 +33,5 @@ target_sources(cru_win_native PUBLIC ${CRU_WIN_NATIVE_INCLUDE_DIR}/window_native_message_event_args.hpp ${CRU_WIN_NATIVE_INCLUDE_DIR}/window_render_target.hpp ) +target_link_libraries(cru_win_native PUBLIC imm32) target_link_libraries(cru_win_native PUBLIC cru_win_graph_direct cru_platform_native) diff --git a/src/win/native/input_method.cpp b/src/win/native/input_method.cpp index adadf8e2..4a125e8d 100644 --- a/src/win/native/input_method.cpp +++ b/src/win/native/input_method.cpp @@ -1,6 +1,7 @@ #include "cru/win/native/input_method.hpp" #include "cru/common/logger.hpp" +#include "cru/platform/check.hpp" #include "cru/win/exception.hpp" #include "cru/win/native/window.hpp" #include "cru/win/string.hpp" @@ -100,4 +101,15 @@ void WinInputMethodContextRef::OnWindowNativeMessage( } } } + +WinInputMethodManager::WinInputMethodManager(WinUiApplication*) {} + +WinInputMethodManager::~WinInputMethodManager() {} + +std::unique_ptr<IInputMethodContextRef> WinInputMethodManager::GetContext( + INativeWindow* window) { + Expects(window); + const auto w = CheckPlatform<WinNativeWindow>(window, GetPlatformId()); + return std::make_unique<WinInputMethodContextRef>(w); +} } // namespace cru::platform::native::win diff --git a/src/win/native/ui_application.cpp b/src/win/native/ui_application.cpp index 80460b29..7fba6805 100644 --- a/src/win/native/ui_application.cpp +++ b/src/win/native/ui_application.cpp @@ -7,6 +7,7 @@ #include "cru/win/native/cursor.hpp" #include "cru/win/native/exception.hpp" #include "cru/win/native/god_window.hpp" +#include "cru/win/native/input_method.hpp" #include "cru/win/native/window.hpp" #include "god_window_message.hpp" #include "timer.hpp" @@ -32,6 +33,7 @@ WinUiApplication::WinUiApplication() { timer_manager_ = std::make_unique<TimerManager>(god_window_.get()); window_manager_ = std::make_unique<WindowManager>(this); cursor_manager_ = std::make_unique<WinCursorManager>(); + input_method_manager_ = std::make_unique<WinInputMethodManager>(this); } WinUiApplication::~WinUiApplication() { instance = nullptr; } @@ -108,4 +110,8 @@ cru::platform::graph::IGraphFactory* WinUiApplication::GetGraphFactory() { ICursorManager* WinUiApplication::GetCursorManager() { return cursor_manager_.get(); } + +IInputMethodManager* WinUiApplication::GetInputMethodManager() { + return input_method_manager_.get(); +} } // namespace cru::platform::native::win |