diff options
Diffstat (limited to 'include/cru/platform')
| -rw-r--r-- | include/cru/platform/gui/InputMethod.h | 6 | ||||
| -rw-r--r-- | include/cru/platform/gui/sdl/InputMethod.h | 42 | ||||
| -rw-r--r-- | include/cru/platform/gui/sdl/Window.h | 7 |
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 |
