aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/platform/native/base.hpp1
-rw-r--r--include/cru/platform/native/input_method.hpp6
-rw-r--r--include/cru/platform/native/ui_application.hpp1
-rw-r--r--include/cru/win/native/base.hpp19
-rw-r--r--include/cru/win/native/god_window.hpp7
-rw-r--r--include/cru/win/native/input_method.hpp19
-rw-r--r--include/cru/win/native/keyboard.hpp2
-rw-r--r--include/cru/win/native/resource.hpp2
-rw-r--r--include/cru/win/native/ui_application.hpp7
-rw-r--r--include/cru/win/native/window.hpp7
-rw-r--r--include/cru/win/native/window_class.hpp4
-rw-r--r--include/cru/win/native/window_render_target.hpp8
-rw-r--r--src/win/native/CMakeLists.txt2
-rw-r--r--src/win/native/input_method.cpp12
-rw-r--r--src/win/native/ui_application.cpp6
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