aboutsummaryrefslogtreecommitdiff
path: root/include/cru
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru')
-rw-r--r--include/cru/platform/gui/InputMethod.h6
-rw-r--r--include/cru/platform/gui/sdl/InputMethod.h42
-rw-r--r--include/cru/platform/gui/sdl/Window.h7
3 files changed, 53 insertions, 2 deletions
diff --git a/include/cru/platform/gui/InputMethod.h b/include/cru/platform/gui/InputMethod.h
index 2d5d0b76..e2c34432 100644
--- a/include/cru/platform/gui/InputMethod.h
+++ b/include/cru/platform/gui/InputMethod.h
@@ -64,3 +64,9 @@ struct IInputMethodContext : virtual IPlatformResource {
virtual IEvent<const std::string&>* TextEvent() = 0;
};
} // namespace cru::platform::gui
+
+#define CRU_DEFINE_CRU_PLATFORM_GUI_I_INPUT_METHOD_OVERRIDE_EVENTS() \
+ CRU_DEFINE_EVENT_OVERRIDE(CompositionStart, std::nullptr_t) \
+ CRU_DEFINE_EVENT_OVERRIDE(CompositionEnd, std::nullptr_t) \
+ CRU_DEFINE_EVENT_OVERRIDE(Composition, std::nullptr_t) \
+ CRU_DEFINE_EVENT_OVERRIDE(Text, const std::string&)
diff --git a/include/cru/platform/gui/sdl/InputMethod.h b/include/cru/platform/gui/sdl/InputMethod.h
new file mode 100644
index 00000000..77a78999
--- /dev/null
+++ b/include/cru/platform/gui/sdl/InputMethod.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#include "Base.h"
+
+#include <cru/platform/gui/InputMethod.h>
+
+#include <SDL3/SDL_events.h>
+#include <SDL3/SDL_video.h>
+
+namespace cru::platform::gui::sdl {
+class SdlWindow;
+
+class SdlInputMethodContext : public SdlResource,
+ public virtual IInputMethodContext {
+ friend SdlWindow;
+
+ public:
+ explicit SdlInputMethodContext(SdlWindow* window);
+
+ bool ShouldManuallyDrawCompositionText() override;
+ void EnableIME() override;
+ void DisableIME() override;
+
+ /**
+ * Note: SDL doesn't support this. So it actually calls CancelComposition().
+ */
+ void CompleteComposition() override;
+ void CancelComposition() override;
+
+ CompositionText GetCompositionText() override;
+
+ void SetCandidateWindowPosition(const Point& point) override;
+
+ CRU_DEFINE_CRU_PLATFORM_GUI_I_INPUT_METHOD_OVERRIDE_EVENTS()
+
+ private:
+ bool HandleEvent(const SDL_Event* event);
+
+ private:
+ SdlWindow* window_;
+};
+} // namespace cru::platform::gui::sdl
diff --git a/include/cru/platform/gui/sdl/Window.h b/include/cru/platform/gui/sdl/Window.h
index 58dd9785..aaa0c725 100644
--- a/include/cru/platform/gui/sdl/Window.h
+++ b/include/cru/platform/gui/sdl/Window.h
@@ -6,10 +6,10 @@
#include <SDL3/SDL_events.h>
#include <SDL3/SDL_video.h>
-#include <optional>
namespace cru::platform::gui::sdl {
class SdlUiApplication;
+class SdlInputMethodContext;
class SdlWindow : public SdlResource, public virtual INativeWindow {
CRU_DEFINE_CLASS_LOG_TAG("cru::platform::gui::xcb::SdlWindow")
@@ -79,7 +79,8 @@ class SdlWindow : public SdlResource, public virtual INativeWindow {
IInputMethodContext* GetInputMethodContext() override;
public:
- std::optional<SDL_Window*> GetSdlWindow();
+ SDL_Window* GetSdlWindow();
+ SDL_WindowID GetSdlWindowId();
SdlUiApplication* GetSdlUiApplication();
float GetDisplayScale();
Thickness GetBorderThickness();
@@ -104,5 +105,7 @@ class SdlWindow : public SdlResource, public virtual INativeWindow {
WindowStyleFlag style_;
std::string title_;
std::shared_ptr<ICursor> cursor_;
+
+ std::unique_ptr<SdlInputMethodContext> input_context_;
};
} // namespace cru::platform::gui::sdl