diff options
Diffstat (limited to 'src/win')
-rw-r--r-- | src/win/native/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/win/native/dpi_util.hpp | 11 | ||||
-rw-r--r-- | src/win/native/input_method.cpp | 75 | ||||
-rw-r--r-- | src/win/native/window.cpp | 4 |
4 files changed, 88 insertions, 4 deletions
diff --git a/src/win/native/CMakeLists.txt b/src/win/native/CMakeLists.txt index 82994d67..521b32cf 100644 --- a/src/win/native/CMakeLists.txt +++ b/src/win/native/CMakeLists.txt @@ -9,6 +9,7 @@ add_library(cru_win_native STATIC cursor.cpp god_window.cpp + input_method.cpp keyboard.cpp timer.cpp ui_application.cpp @@ -22,6 +23,7 @@ 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}/god_window.hpp + ${CRU_WIN_NATIVE_INCLUDE_DIR}/input_method.hpp ${CRU_WIN_NATIVE_INCLUDE_DIR}/keyboard.hpp ${CRU_WIN_NATIVE_INCLUDE_DIR}/resource.hpp ${CRU_WIN_NATIVE_INCLUDE_DIR}/ui_application.hpp diff --git a/src/win/native/dpi_util.hpp b/src/win/native/dpi_util.hpp index d8c5610c..07b89a95 100644 --- a/src/win/native/dpi_util.hpp +++ b/src/win/native/dpi_util.hpp @@ -32,4 +32,15 @@ inline float PixelToDipX(const int pixel_x) { inline float PixelToDipY(const int pixel_y) { return DipToPixelInternal(pixel_y, GetDpi().y); } + +inline Point PiToDip(const POINT& pi_point) { + return Point(PixelToDipX(pi_point.x), PixelToDipY(pi_point.y)); +} + +inline POINT DipToPi(const Point& dip_point) { + POINT result; + result.x = DipToPixelX(dip_point.x); + result.y = DipToPixelY(dip_point.y); + return result; +} } // namespace cru::platform::native::win diff --git a/src/win/native/input_method.cpp b/src/win/native/input_method.cpp new file mode 100644 index 00000000..4edfdc5f --- /dev/null +++ b/src/win/native/input_method.cpp @@ -0,0 +1,75 @@ +#include "cru/win/native/input_method.hpp" + +#include "cru/common/logger.hpp" +#include "cru/win/exception.hpp" +#include "cru/win/native/window.hpp" +#include "cru/win/string.hpp" +#include "dpi_util.hpp" + +#include <vector> + +namespace cru::platform::native::win { +WinInputMethodContextRef::WinInputMethodContextRef(WinNativeWindow* window) + : window_(window) { + Expects(window); + + window_handle_ = window->GetWindowHandle(); + handle_ = ::ImmGetContext(window_handle_); + + // TODO: Events +} + +WinInputMethodContextRef::~WinInputMethodContextRef() { + ::ImmReleaseContext(window_handle_, handle_); +} + +void WinInputMethodContextRef::Reset() { + wchar_t s[1] = {L'\0'}; + + if (!::ImmSetCompositionStringW(handle_, SCS_SETSTR, static_cast<LPVOID>(s), + sizeof(s), static_cast<LPVOID>(s), + sizeof(s))) { + log::Warn( + "WinInputMethodContextRef: Failed to reset input method context."); + } +} + +std::string WinInputMethodContextRef::GetCompositionString() { + const auto length = + ::ImmGetCompositionStringW(handle_, GCS_RESULTREADSTR, NULL, 0) + + sizeof(wchar_t); + std::vector<std::byte> data(length); + const auto result = ::ImmGetCompositionStringW( + handle_, GCS_RESULTREADSTR, static_cast<LPVOID>(data.data()), length); + + if (result == IMM_ERROR_NODATA) { + return std::string{}; + } else if (result == IMM_ERROR_GENERAL) { + throw new platform::win::Win32Error(::GetLastError(), + "Failed to get composition string."); + } + + return platform::win::ToUtf8String( + std::wstring_view(reinterpret_cast<wchar_t*>(data.data()))); +} + +void WinInputMethodContextRef::SetCandidateWindowPosition(const Point& point) { + ::CANDIDATEFORM form; + form.dwIndex = 1; + form.dwStyle = CFS_CANDIDATEPOS; + form.ptCurrentPos = DipToPi(point); + + if (!::ImmSetCandidateWindow(handle_, &form)) + log::Debug( + "WinInputMethodContextRef: Failed to set input method candidate window " + "position."); +} + +IEvent<std::string>* WinInputMethodContextRef::CompositionTextChangeEvent() { + return &composition_text_change_event_; +} + +IEvent<std::string>* WinInputMethodContextRef::CharEvent() { + return &char_event_; +} +} // namespace cru::platform::native::win diff --git a/src/win/native/window.cpp b/src/win/native/window.cpp index 1b590026..6f66cb57 100644 --- a/src/win/native/window.cpp +++ b/src/win/native/window.cpp @@ -17,10 +17,6 @@ #include <windowsx.h> namespace cru::platform::native::win { -inline Point PiToDip(const POINT& pi_point) { - return Point(PixelToDipX(pi_point.x), PixelToDipY(pi_point.y)); -} - WinNativeWindow::WinNativeWindow(WinUiApplication* application, WindowClass* window_class, DWORD window_style, WinNativeWindow* parent) |