diff options
37 files changed, 208 insertions, 153 deletions
diff --git a/include/cru/base/Exception.h b/include/cru/base/Exception.h index e4da91f5..c45cdc58 100644 --- a/include/cru/base/Exception.h +++ b/include/cru/base/Exception.h @@ -4,6 +4,7 @@ #include <exception> #include <optional> #include <string_view> +#include <string> namespace cru { #ifdef _MSC_VER diff --git a/include/cru/base/StringUtil.h b/include/cru/base/StringUtil.h index 8c7841d7..a69bb884 100644 --- a/include/cru/base/StringUtil.h +++ b/include/cru/base/StringUtil.h @@ -380,4 +380,9 @@ Index Utf8IndexCodeUnitToCodePoint(const Utf8CodeUnit* ptr, Index size, Index po Index Utf8IndexCodePointToCodeUnit(const Utf8CodeUnit* ptr, Index size, Index position); Index Utf16IndexCodeUnitToCodePoint(const Utf16CodeUnit* ptr, Index size, Index position); Index Utf16IndexCodePointToCodeUnit(const Utf16CodeUnit* ptr, Index size, Index position); + +#ifdef _WIN32 +std::wstring ToUtf16(std::string_view str); +std::string ToUtf8(std::wstring_view str); +#endif } // namespace cru::string diff --git a/include/cru/base/platform/win/Exception.h b/include/cru/base/platform/win/Exception.h index 12f3d108..21851bb9 100644 --- a/include/cru/base/platform/win/Exception.h +++ b/include/cru/base/platform/win/Exception.h @@ -8,9 +8,6 @@ #include "../../Exception.h" -#include <stdexcept> -#include <string_view> - namespace cru::platform::win { class CRU_BASE_API HResultError : public Exception { public: @@ -35,8 +32,8 @@ class CRU_BASE_API Win32Error : public Exception { public: // ::GetLastError is automatically called to get the error code. // The same as Win32Error(::GetLastError(), message) - explicit Win32Error(String message); - Win32Error(DWORD error_code, String message); + explicit Win32Error(std::string_view message); + Win32Error(DWORD error_code, std::string_view message); DWORD GetErrorCode() const { return error_code_; } diff --git a/include/cru/base/platform/win/Win32FileStream.h b/include/cru/base/platform/win/Win32FileStream.h index 61f1a33d..d0339b11 100644 --- a/include/cru/base/platform/win/Win32FileStream.h +++ b/include/cru/base/platform/win/Win32FileStream.h @@ -2,7 +2,6 @@ #ifdef CRU_PLATFORM_WINDOWS -#include "../../String.h" #include "../../io/OpenFileFlag.h" #include "../../io/Stream.h" @@ -13,7 +12,7 @@ class Win32FileStreamPrivate; class CRU_BASE_API Win32FileStream : public io::Stream { public: - Win32FileStream(String path, io::OpenFileFlag flags); + Win32FileStream(std::string path, io::OpenFileFlag flags); ~Win32FileStream() override; protected: @@ -22,7 +21,7 @@ class CRU_BASE_API Win32FileStream : public io::Stream { Index DoWrite(const std::byte* buffer, Index offset, Index size) override; public: - String GetPath() const { return path_; } + std::string GetPath() const { return path_; } io::OpenFileFlag GetOpenFileFlags() const { return flags_; } details::Win32FileStreamPrivate* GetPrivate_() { return p_; } @@ -33,7 +32,7 @@ class CRU_BASE_API Win32FileStream : public io::Stream { void DoClose(); private: - String path_; + std::string path_; io::OpenFileFlag flags_; details::Win32FileStreamPrivate* p_; diff --git a/include/cru/platform/graphics/direct2d/Factory.h b/include/cru/platform/graphics/direct2d/Factory.h index 7abdc31f..e96950fd 100644 --- a/include/cru/platform/graphics/direct2d/Factory.h +++ b/include/cru/platform/graphics/direct2d/Factory.h @@ -44,11 +44,11 @@ class CRU_WIN_GRAPHICS_DIRECT_API DirectGraphicsFactory std::unique_ptr<IGeometryBuilder> CreateGeometryBuilder() override; - std::unique_ptr<IFont> CreateFont(String font_family, + std::unique_ptr<IFont> CreateFont(std::string font_family, float font_size) override; std::unique_ptr<ITextLayout> CreateTextLayout(std::shared_ptr<IFont> font, - String text) override; + std::string text) override; IImageFactory* GetImageFactory() override; diff --git a/include/cru/platform/graphics/direct2d/Font.h b/include/cru/platform/graphics/direct2d/Font.h index 841a57b5..86576592 100644 --- a/include/cru/platform/graphics/direct2d/Font.h +++ b/include/cru/platform/graphics/direct2d/Font.h @@ -12,7 +12,7 @@ class CRU_WIN_GRAPHICS_DIRECT_API DWriteFont public virtual IFont, public virtual IComResource<IDWriteTextFormat> { public: - DWriteFont(DirectGraphicsFactory* factory, String font_family, + DWriteFont(DirectGraphicsFactory* factory, std::string font_family, float font_size); CRU_DELETE_COPY(DWriteFont) @@ -25,11 +25,11 @@ class CRU_WIN_GRAPHICS_DIRECT_API DWriteFont return text_format_.Get(); } - String GetFontName() override; + std::string GetFontName() override; float GetFontSize() override; private: - String font_family_; + std::string font_family_; Microsoft::WRL::ComPtr<IDWriteTextFormat> text_format_; }; } // namespace cru::platform::graphics::direct2d diff --git a/include/cru/platform/graphics/direct2d/Resource.h b/include/cru/platform/graphics/direct2d/Resource.h index 6d2f968c..63459294 100644 --- a/include/cru/platform/graphics/direct2d/Resource.h +++ b/include/cru/platform/graphics/direct2d/Resource.h @@ -12,7 +12,7 @@ class CRU_WIN_GRAPHICS_DIRECT_API DirectResource : public Object, public virtual IPlatformResource { public: - static String kPlatformId; + static std::string kPlatformId; protected: DirectResource() = default; @@ -24,7 +24,7 @@ class CRU_WIN_GRAPHICS_DIRECT_API DirectResource ~DirectResource() override = default; public: - String GetPlatformId() const final { return kPlatformId; } + std::string GetPlatformId() const final { return kPlatformId; } }; class CRU_WIN_GRAPHICS_DIRECT_API DirectGraphicsResource diff --git a/include/cru/platform/graphics/direct2d/TextLayout.h b/include/cru/platform/graphics/direct2d/TextLayout.h index 9f2e75a9..a41c3c6c 100644 --- a/include/cru/platform/graphics/direct2d/TextLayout.h +++ b/include/cru/platform/graphics/direct2d/TextLayout.h @@ -16,7 +16,7 @@ class CRU_WIN_GRAPHICS_DIRECT_API DWriteTextLayout public virtual IComResource<IDWriteTextLayout> { public: DWriteTextLayout(DirectGraphicsFactory* factory, std::shared_ptr<IFont> font, - String text); + std::string text); CRU_DELETE_COPY(DWriteTextLayout) CRU_DELETE_MOVE(DWriteTextLayout) @@ -29,8 +29,8 @@ class CRU_WIN_GRAPHICS_DIRECT_API DWriteTextLayout } public: - String GetText() override; - void SetText(String new_text) override; + std::string GetText() override; + void SetText(std::string new_text) override; std::shared_ptr<IFont> GetFont() override; void SetFont(std::shared_ptr<IFont> font) override; @@ -54,7 +54,8 @@ class CRU_WIN_GRAPHICS_DIRECT_API DWriteTextLayout private: bool edit_mode_ = false; - String text_; + std::string text_; + std::wstring utf16_text_; std::shared_ptr<DWriteFont> font_; float max_width_ = std::numeric_limits<float>::max(); float max_height_ = std::numeric_limits<float>::max(); diff --git a/include/cru/platform/gui/win/Clipboard.h b/include/cru/platform/gui/win/Clipboard.h index ebaa3f4f..50a3aeea 100644 --- a/include/cru/platform/gui/win/Clipboard.h +++ b/include/cru/platform/gui/win/Clipboard.h @@ -16,8 +16,8 @@ class WinClipboard : public WinNativeResource, public virtual IClipboard { ~WinClipboard() override; public: - String GetText() override; - void SetText(String text) override; + std::string GetText() override; + void SetText(std::string text) override; private: WinUiApplication* application_; diff --git a/include/cru/platform/gui/win/GodWindow.h b/include/cru/platform/gui/win/GodWindow.h index 05f9a13d..ceb6fe2d 100644 --- a/include/cru/platform/gui/win/GodWindow.h +++ b/include/cru/platform/gui/win/GodWindow.h @@ -3,7 +3,6 @@ #include "WindowNativeMessageEventArgs.h" #include "cru/base/Event.h" -#include "cru/base/String.h" #include <memory> diff --git a/include/cru/platform/gui/win/InputMethod.h b/include/cru/platform/gui/win/InputMethod.h index 565a4cd0..a69490c7 100644 --- a/include/cru/platform/gui/win/InputMethod.h +++ b/include/cru/platform/gui/win/InputMethod.h @@ -66,12 +66,12 @@ class CRU_WIN_GUI_API WinInputMethodContext IEvent<std::nullptr_t>* CompositionEvent() override; - IEvent<StringView>* TextEvent() override; + IEvent<std::string>* TextEvent() override; private: void OnWindowNativeMessage(WindowNativeMessageEventArgs& args); - String GetResultString(); + std::string GetResultString(); AutoHIMC GetHIMC(); @@ -83,6 +83,6 @@ class CRU_WIN_GUI_API WinInputMethodContext Event<std::nullptr_t> composition_start_event_; Event<std::nullptr_t> composition_end_event_; Event<std::nullptr_t> composition_event_; - Event<StringView> text_event_; + Event<std::string> text_event_; }; } // namespace cru::platform::gui::win diff --git a/include/cru/platform/gui/win/Resource.h b/include/cru/platform/gui/win/Resource.h index ed43bec3..16cde194 100644 --- a/include/cru/platform/gui/win/Resource.h +++ b/include/cru/platform/gui/win/Resource.h @@ -7,7 +7,7 @@ namespace cru::platform::gui::win { class CRU_WIN_GUI_API WinNativeResource : public Object, public virtual IPlatformResource { public: - static String kPlatformId; + static std::string kPlatformId; protected: WinNativeResource() = default; @@ -19,6 +19,6 @@ class CRU_WIN_GUI_API WinNativeResource : public Object, ~WinNativeResource() override = default; public: - String GetPlatformId() const final { return kPlatformId; } + std::string GetPlatformId() const final { return kPlatformId; } }; } // namespace cru::platform::gui::win diff --git a/include/cru/platform/gui/win/Window.h b/include/cru/platform/gui/win/Window.h index 74d58228..cd720fbd 100644 --- a/include/cru/platform/gui/win/Window.h +++ b/include/cru/platform/gui/win/Window.h @@ -2,7 +2,6 @@ #include "Resource.h" #include "WindowNativeMessageEventArgs.h" -#include "cru/platform/gui/Base.h" #include "cru/platform/gui/Window.h" #include "cru/platform/graphics/direct2d/WindowRenderTarget.h" @@ -30,8 +29,8 @@ class CRU_WIN_GUI_API WinNativeWindow : public WinNativeResource, WindowStyleFlag GetStyleFlag() override { return style_flag_; } void SetStyleFlag(WindowStyleFlag flag) override; - String GetTitle() override; - void SetTitle(String title) override; + std::string GetTitle() override; + void SetTitle(std::string title) override; WindowVisibilityType GetVisibility() override { return visibility_; } void SetVisibility(WindowVisibilityType visibility) override; @@ -181,7 +180,7 @@ class CRU_WIN_GUI_API WinNativeWindow : public WinNativeResource, WindowStyleFlag style_flag_{}; WindowVisibilityType visibility_ = WindowVisibilityType::Hide; Rect client_rect_{100, 100, 400, 300}; - String title_; + std::string title_; HWND hwnd_ = nullptr; WinNativeWindow* parent_window_ = nullptr; diff --git a/include/cru/toml/TomlDocument.h b/include/cru/toml/TomlDocument.h index 4cd3ab3e..22442096 100644 --- a/include/cru/toml/TomlDocument.h +++ b/include/cru/toml/TomlDocument.h @@ -6,6 +6,7 @@ #include <optional> #include <unordered_map> +#include <string> namespace cru::toml { class CRU_TOML_API TomlSection { diff --git a/src/base/StringUtil.cpp b/src/base/StringUtil.cpp index 4cd662d1..5c8686dd 100644 --- a/src/base/StringUtil.cpp +++ b/src/base/StringUtil.cpp @@ -404,4 +404,25 @@ Index Utf16IndexCodePointToCodeUnit(const Utf16CodeUnit* ptr, Index size, position); } +#ifdef _WIN32 +std::wstring ToUtf16(std::string_view str) { + Utf8CodePointIterator iter(str.data(),str.size()); + std::wstring result; + for (auto c : iter) { + Utf16EncodeCodePointAppend(c, [&result](char16_t c) { result += c; }); + } + return result; +} + +std::string ToUtf8(std::wstring_view str) { + Utf16CodePointIterator iter(reinterpret_cast<const char16_t*>( str.data()),str.size()); + std::string result; + for (auto c : iter) { + Utf8EncodeCodePointAppend(c, [&result](char c) { result += c; }); + } + return result; +} + +#endif + } // namespace cru::string diff --git a/src/base/log/StdioLogTarget.cpp b/src/base/log/StdioLogTarget.cpp index 03d2d76e..34813426 100644 --- a/src/base/log/StdioLogTarget.cpp +++ b/src/base/log/StdioLogTarget.cpp @@ -1,10 +1,7 @@ #include "cru/base/log/StdioLogTarget.h" -#ifdef _WIN32 -#include "cru/base/String.h" -#endif - #include <iostream> +#include "cru/base/StringUtil.h" namespace cru::log { StdioLogTarget::StdioLogTarget() {} @@ -13,11 +10,11 @@ StdioLogTarget::~StdioLogTarget() {} void StdioLogTarget::Write(log::LogLevel level, std::string message) { #ifdef CRU_PLATFORM_WINDOWS - String s = String::FromUtf8(message); + auto s = string::ToUtf16(message); if (level == log::LogLevel::Error) { - std::wcerr.write(reinterpret_cast<const wchar_t*>(s.data()), s.size()); + std::wcerr << s << std::endl; } else { - std::wcout.write(reinterpret_cast<const wchar_t*>(s.data()), s.size()); + std::wcout << s << std::endl; } #else if (level == log::LogLevel::Error) { diff --git a/src/base/platform/win/DebugLogTarget.cpp b/src/base/platform/win/DebugLogTarget.cpp index afbab620..3b73b332 100644 --- a/src/base/platform/win/DebugLogTarget.cpp +++ b/src/base/platform/win/DebugLogTarget.cpp @@ -1,12 +1,12 @@ #include "cru/base/platform/win/DebugLogTarget.h" -#include "cru/base/String.h" +#include "cru/base/StringUtil.h" namespace cru::platform::win { void WinDebugLogTarget::Write(::cru::log::LogLevel level, std::string s) { CRU_UNUSED(level) - String m = String::FromUtf8(s); + std::wstring m = string::ToUtf16(s); ::OutputDebugStringW(reinterpret_cast<const wchar_t*>(m.c_str())); } } // namespace cru::platform::win diff --git a/src/base/platform/win/Exception.cpp b/src/base/platform/win/Exception.cpp index 941875f7..adc59e3c 100644 --- a/src/base/platform/win/Exception.cpp +++ b/src/base/platform/win/Exception.cpp @@ -1,16 +1,16 @@ #include "cru/base/platform/win/Exception.h" -#include "cru/base/Format.h" +#include <format> #include <optional> namespace cru::platform::win { -inline String HResultMakeMessage(HRESULT h_result, - std::optional<String> message) { +inline std::string HResultMakeMessage(HRESULT h_result, + std::optional<std::string_view> message) { if (message.has_value()) - return Format(u"HRESULT: {}. Message: {}", h_result, message->WinCStr()); + return std::format("HRESULT: {}. Message: {}", h_result, *message); else - return Format(u"HRESULT: {}.", h_result); + return std::format("HRESULT: {}.", h_result); } HResultError::HResultError(HRESULT h_result) @@ -19,20 +19,19 @@ HResultError::HResultError(HRESULT h_result) HResultError::HResultError(HRESULT h_result, std::string_view additional_message) - : Exception(HResultMakeMessage( - h_result, String::FromUtf8(additional_message.data(), - additional_message.size()))), + : Exception(HResultMakeMessage(h_result, additional_message)), h_result_(h_result) {} -inline String Win32MakeMessage(DWORD error_code, String message) { - return Format(u"Last error code: {}.\nMessage: {}\n", error_code, - message.WinCStr()); +inline std::string Win32MakeMessage(DWORD error_code, + std::string_view message) { + return std::format("Last error code: {}.\nMessage: {}\n", error_code, + message); } -Win32Error::Win32Error(String message) +Win32Error::Win32Error(std::string_view message) : Win32Error(::GetLastError(), message) {} -Win32Error::Win32Error(DWORD error_code, String message) +Win32Error::Win32Error(DWORD error_code, std::string_view message) : Exception(Win32MakeMessage(error_code, message)), error_code_(error_code) {} } // namespace cru::platform::win diff --git a/src/base/platform/win/Win32FileStream.cpp b/src/base/platform/win/Win32FileStream.cpp index 341fe9d3..618ce386 100644 --- a/src/base/platform/win/Win32FileStream.cpp +++ b/src/base/platform/win/Win32FileStream.cpp @@ -1,6 +1,7 @@ #include "cru/base/platform/win/Win32FileStream.h" #include "Win32FileStreamPrivate.h" +#include "cru/base/StringUtil.h" #include "cru/base/io/OpenFileFlag.h" #include "cru/base/platform/win/Exception.h" @@ -8,12 +9,11 @@ #include <coml2api.h> #include <shlwapi.h> #include <winnt.h> -#include <filesystem> namespace cru::platform::win { using namespace cru::io; -Win32FileStream::Win32FileStream(String path, OpenFileFlag flags) +Win32FileStream::Win32FileStream(std::string path, OpenFileFlag flags) : Stream(true, true, true), path_(std::move(path)), flags_(flags), @@ -40,7 +40,7 @@ Win32FileStream::Win32FileStream(String path, OpenFileFlag flags) IStream* stream; ThrowIfFailed(SHCreateStreamOnFileEx( - path_.WinCStr(), grfMode, FILE_ATTRIBUTE_NORMAL, + cru::string::ToUtf16(path_).c_str(), grfMode, FILE_ATTRIBUTE_NORMAL, flags & io::OpenFileFlags::Create ? TRUE : FALSE, NULL, &stream)); p_->stream_ = stream; diff --git a/src/platform/graphics/direct2d/Factory.cpp b/src/platform/graphics/direct2d/Factory.cpp index cf65c2a5..af3f174d 100644 --- a/src/platform/graphics/direct2d/Factory.cpp +++ b/src/platform/graphics/direct2d/Factory.cpp @@ -82,13 +82,13 @@ DirectGraphicsFactory::CreateGeometryBuilder() { return std::make_unique<D2DGeometryBuilder>(this); } -std::unique_ptr<IFont> DirectGraphicsFactory::CreateFont(String font_family, - float font_size) { +std::unique_ptr<IFont> DirectGraphicsFactory::CreateFont( + std::string font_family, float font_size) { return std::make_unique<DWriteFont>(this, std::move(font_family), font_size); } std::unique_ptr<ITextLayout> DirectGraphicsFactory::CreateTextLayout( - std::shared_ptr<IFont> font, String text) { + std::shared_ptr<IFont> font, std::string text) { return std::make_unique<DWriteTextLayout>(this, std::move(font), std::move(text)); } diff --git a/src/platform/graphics/direct2d/Font.cpp b/src/platform/graphics/direct2d/Font.cpp index 34bb2ea5..f8dfbf38 100644 --- a/src/platform/graphics/direct2d/Font.cpp +++ b/src/platform/graphics/direct2d/Font.cpp @@ -1,5 +1,6 @@ #include "cru/platform/graphics/direct2d/Font.h" +#include "cru/base/StringUtil.h" #include "cru/platform/graphics/direct2d/Exception.h" #include "cru/platform/graphics/direct2d/Factory.h" @@ -7,7 +8,7 @@ #include <utility> namespace cru::platform::graphics::direct2d { -DWriteFont::DWriteFont(DirectGraphicsFactory* factory, String font_family, +DWriteFont::DWriteFont(DirectGraphicsFactory* factory, std::string font_family, float font_size) : DirectGraphicsResource(factory), font_family_(std::move(font_family)) { // Get locale @@ -15,19 +16,19 @@ DWriteFont::DWriteFont(DirectGraphicsFactory* factory, String font_family, if (!::GetUserDefaultLocaleName(buffer.data(), static_cast<int>(buffer.size()))) throw platform::win::Win32Error( - ::GetLastError(), u"Failed to get locale when create dwrite font."); + ::GetLastError(), "Failed to get locale when create dwrite font."); ThrowIfFailed(factory->GetDWriteFactory()->CreateTextFormat( - reinterpret_cast<const wchar_t*>(font_family_.c_str()), nullptr, - DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, - DWRITE_FONT_STRETCH_NORMAL, font_size, buffer.data(), &text_format_)); + string::ToUtf16(font_family_).c_str(), nullptr, DWRITE_FONT_WEIGHT_NORMAL, + DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, font_size, + buffer.data(), &text_format_)); ThrowIfFailed(text_format_->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING)); ThrowIfFailed( text_format_->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_NEAR)); } -String DWriteFont::GetFontName() { return font_family_; } +std::string DWriteFont::GetFontName() { return font_family_; } float DWriteFont::GetFontSize() { return text_format_->GetFontSize(); } } // namespace cru::platform::graphics::direct2d diff --git a/src/platform/graphics/direct2d/Resource.cpp b/src/platform/graphics/direct2d/Resource.cpp index b81aa69e..2f1b7654 100644 --- a/src/platform/graphics/direct2d/Resource.cpp +++ b/src/platform/graphics/direct2d/Resource.cpp @@ -3,7 +3,7 @@ #include "cru/platform/graphics/direct2d/Factory.h" namespace cru::platform::graphics::direct2d { -String DirectResource::kPlatformId = u"Windows Direct"; +std::string DirectResource::kPlatformId = "Windows Direct"; DirectGraphicsResource::DirectGraphicsResource(DirectGraphicsFactory* factory) : factory_(factory) { diff --git a/src/platform/graphics/direct2d/TextLayout.cpp b/src/platform/graphics/direct2d/TextLayout.cpp index 06bbcaa6..906d64ec 100644 --- a/src/platform/graphics/direct2d/TextLayout.cpp +++ b/src/platform/graphics/direct2d/TextLayout.cpp @@ -1,6 +1,7 @@ #include "cru/platform/graphics/direct2d/TextLayout.h" #include <dwrite.h> +#include "cru/base/StringUtil.h" #include "cru/base/log/Logger.h" #include "cru/platform/Check.h" #include "cru/platform/graphics/direct2d/Exception.h" @@ -11,27 +12,28 @@ namespace cru::platform::graphics::direct2d { DWriteTextLayout::DWriteTextLayout(DirectGraphicsFactory* factory, - std::shared_ptr<IFont> font, String text) + std::shared_ptr<IFont> font, + std::string text) : DirectGraphicsResource(factory), text_(std::move(text)) { Expects(font); font_ = CheckPlatform<DWriteFont>(font, GetPlatformId()); + utf16_text_ = string::ToUtf16(text_); ThrowIfFailed(factory->GetDWriteFactory()->CreateTextLayout( - reinterpret_cast<const wchar_t*>(text_.c_str()), - static_cast<UINT32>(text_.size()), font_->GetComInterface(), max_width_, - max_height_, &text_layout_)); + utf16_text_.c_str(), static_cast<UINT32>(utf16_text_.size()), + font_->GetComInterface(), max_width_, max_height_, &text_layout_)); } DWriteTextLayout::~DWriteTextLayout() = default; -String DWriteTextLayout::GetText() { return text_; } +std::string DWriteTextLayout::GetText() { return text_; } -void DWriteTextLayout::SetText(String new_text) { +void DWriteTextLayout::SetText(std::string new_text) { text_ = std::move(new_text); + utf16_text_ = string::ToUtf16(text_); ThrowIfFailed(GetDirectFactory()->GetDWriteFactory()->CreateTextLayout( - reinterpret_cast<const wchar_t*>(text_.c_str()), - static_cast<UINT32>(text_.size()), font_->GetComInterface(), max_width_, - max_height_, &text_layout_)); + utf16_text_.c_str(), static_cast<UINT32>(utf16_text_.size()), + font_->GetComInterface(), max_width_, max_height_, &text_layout_)); } std::shared_ptr<IFont> DWriteTextLayout::GetFont() { @@ -70,7 +72,7 @@ Index DWriteTextLayout::GetLineIndexFromCharIndex(Index char_index) { auto line_index = 0; for (Index i = 0; i < char_index; ++i) { - if (text_[i] == u'\n') { + if (text_[i] == '\n') { line_index++; } } @@ -108,7 +110,19 @@ std::vector<Rect> DWriteTextLayout::TextRangeRect( if (text_range_arg.count == 0) { return {}; } - const auto text_range = text_range_arg.Normalize(); + const auto text_range = + Range::FromTwoSides( + string::Utf16IndexCodePointToCodeUnit( + reinterpret_cast<const char16_t*>(utf16_text_.data()), + utf16_text_.size(), + string::Utf8IndexCodeUnitToCodePoint(text_.data(), text_.size(), + text_range_arg.GetStart())), + string::Utf16IndexCodePointToCodeUnit( + reinterpret_cast<const char16_t*>(utf16_text_.data()), + utf16_text_.size(), + string::Utf8IndexCodeUnitToCodePoint(text_.data(), text_.size(), + text_range_arg.GetEnd()))) + .Normalize(); DWRITE_TEXT_METRICS text_metrics; ThrowIfFailed(text_layout_->GetMetrics(&text_metrics)); @@ -137,6 +151,10 @@ std::vector<Rect> DWriteTextLayout::TextRangeRect( } Rect DWriteTextLayout::TextSinglePoint(Index position, bool trailing) { + position = string::Utf16IndexCodePointToCodeUnit( + reinterpret_cast<const char16_t*>(utf16_text_.data()), utf16_text_.size(), + string::Utf8IndexCodeUnitToCodePoint(text_.data(), text_.size(), + position)); DWRITE_HIT_TEST_METRICS metrics; FLOAT left; FLOAT top; @@ -155,7 +173,11 @@ TextHitTestResult DWriteTextLayout::HitTest(const Point& point) { &metrics)); TextHitTestResult result; - result.position = metrics.textPosition; + result.position = string::Utf8IndexCodePointToCodeUnit( + text_.data(), text_.size(), + string::Utf16IndexCodeUnitToCodePoint( + reinterpret_cast<const char16_t*>(utf16_text_.data()), + utf16_text_.size(), metrics.textPosition)); result.trailing = trailing != 0; return result; } diff --git a/src/platform/gui/win/Clipboard.cpp b/src/platform/gui/win/Clipboard.cpp index 5525cb40..1ffb0254 100644 --- a/src/platform/gui/win/Clipboard.cpp +++ b/src/platform/gui/win/Clipboard.cpp @@ -1,4 +1,6 @@ #include "cru/platform/gui/win/Clipboard.h" +#include <string> +#include "cru/base/StringUtil.h" #include "cru/base/log/Logger.h" #include "cru/platform/gui/win/GodWindow.h" #include "cru/platform/gui/win/UiApplication.h" @@ -9,7 +11,7 @@ WinClipboard::WinClipboard(WinUiApplication* application) WinClipboard::~WinClipboard() {} -String WinClipboard::GetText() { +std::string WinClipboard::GetText() { auto god_window = application_->GetGodWindow(); if (!::OpenClipboard(god_window->GetHandle())) { @@ -36,15 +38,16 @@ String WinClipboard::GetText() { return {}; } - String result(static_cast<wchar_t*>(ptr)); + std::wstring result(static_cast<wchar_t*>(ptr)); ::GlobalUnlock(handle); ::CloseClipboard(); - return result; + return string::ToUtf8(result); } -void WinClipboard::SetText(String text) { +void WinClipboard::SetText(std::string utf8_text) { + auto text = string::ToUtf16(utf8_text); auto god_window = application_->GetGodWindow(); if (!::OpenClipboard(god_window->GetHandle())) { diff --git a/src/platform/gui/win/Cursor.cpp b/src/platform/gui/win/Cursor.cpp index 24e9c2fc..c5424eb4 100644 --- a/src/platform/gui/win/Cursor.cpp +++ b/src/platform/gui/win/Cursor.cpp @@ -27,7 +27,7 @@ WinCursor* LoadWinCursor(const wchar_t* name) { const auto handle = static_cast<HCURSOR>(::LoadImageW( NULL, name, IMAGE_CURSOR, SM_CYCURSOR, SM_CYCURSOR, LR_SHARED)); if (handle == NULL) { - throw Win32Error(::GetLastError(), u"Failed to load system cursor."); + throw Win32Error(::GetLastError(), "Failed to load system cursor."); } return new WinCursor(handle, false); } diff --git a/src/platform/gui/win/GodWindow.cpp b/src/platform/gui/win/GodWindow.cpp index 485eae72..7f24fd17 100644 --- a/src/platform/gui/win/GodWindow.cpp +++ b/src/platform/gui/win/GodWindow.cpp @@ -37,7 +37,7 @@ GodWindow::GodWindow(WinUiApplication* application) { HWND_MESSAGE, nullptr, h_instance, nullptr); if (hwnd_ == nullptr) - throw Win32Error(::GetLastError(), u"Failed to create god window."); + throw Win32Error(::GetLastError(), "Failed to create god window."); } GodWindow::~GodWindow() { diff --git a/src/platform/gui/win/InputMethod.cpp b/src/platform/gui/win/InputMethod.cpp index 94795c8c..6f5955fb 100644 --- a/src/platform/gui/win/InputMethod.cpp +++ b/src/platform/gui/win/InputMethod.cpp @@ -2,9 +2,7 @@ #include "cru/base/StringUtil.h" #include "cru/base/log/Logger.h" -#include "cru/platform/Check.h" #include "cru/platform/gui/DebugFlags.h" -#include "cru/platform/gui/win/Exception.h" #include "cru/platform/gui/win/Window.h" #include <vector> @@ -104,19 +102,19 @@ CompositionClauses GetCompositionClauses(HIMC imm_context, int target_start, return result; } -String GetString(HIMC imm_context) { +std::wstring GetString(HIMC imm_context) { LONG string_size = ::ImmGetCompositionString(imm_context, GCS_COMPSTR, NULL, 0); - String result((string_size / sizeof(char16_t)), 0); + std::wstring result((string_size / sizeof(wchar_t)), 0); ::ImmGetCompositionString(imm_context, GCS_COMPSTR, result.data(), string_size); return result; } -String GetResultString(HIMC imm_context) { +std::wstring GetResultString(HIMC imm_context) { LONG string_size = ::ImmGetCompositionString(imm_context, GCS_RESULTSTR, NULL, 0); - String result((string_size / sizeof(char16_t)), 0); + std::wstring result((string_size / sizeof(wchar_t)), 0); ::ImmGetCompositionString(imm_context, GCS_RESULTSTR, result.data(), string_size); return result; @@ -126,17 +124,35 @@ CompositionText GetCompositionInfo(HIMC imm_context) { // We only care about GCS_COMPATTR, GCS_COMPCLAUSE and GCS_CURSORPOS, and // convert them into underlines and selection range respectively. - auto text = GetString(imm_context); + auto utf16_text = GetString(imm_context); + auto text = string::ToUtf8(utf16_text); - int length = static_cast<int>(text.length()); + int length = static_cast<int>(utf16_text.length()); // Find out the range selected by the user. int target_start = length; int target_end = length; GetCompositionTargetRange(imm_context, &target_start, &target_end); auto clauses = GetCompositionClauses(imm_context, target_start, target_end); + for (auto& clause : clauses) { + clause.start = string::Utf8IndexCodePointToCodeUnit( + text.data(), text.size(), + string::Utf16IndexCodeUnitToCodePoint( + reinterpret_cast<const char16_t*>(utf16_text.data()), + utf16_text.size(), clause.start)); + clause.end = string::Utf8IndexCodePointToCodeUnit( + text.data(), text.size(), + string::Utf16IndexCodeUnitToCodePoint( + reinterpret_cast<const char16_t*>(utf16_text.data()), + utf16_text.size(), clause.end)); + } - int cursor = ::ImmGetCompositionString(imm_context, GCS_CURSORPOS, NULL, 0); + int cursor = string::Utf8IndexCodePointToCodeUnit( + text.data(), text.size(), + string::Utf16IndexCodeUnitToCodePoint( + reinterpret_cast<const char16_t*>(utf16_text.data()), + utf16_text.size(), + ::ImmGetCompositionString(imm_context, GCS_CURSORPOS, NULL, 0))); return CompositionText{std::move(text), std::move(clauses), TextRange{cursor}}; @@ -215,7 +231,7 @@ IEvent<std::nullptr_t>* WinInputMethodContext::CompositionEvent() { return &composition_event_; } -IEvent<StringView>* WinInputMethodContext::TextEvent() { return &text_event_; } +IEvent<std::string>* WinInputMethodContext::TextEvent() { return &text_event_; } void WinInputMethodContext::OnWindowNativeMessage( WindowNativeMessageEventArgs& args) { @@ -223,7 +239,7 @@ void WinInputMethodContext::OnWindowNativeMessage( switch (message.msg) { case WM_CHAR: { auto c = static_cast<char16_t>(message.w_param); - if (IsUtf16SurrogatePairCodeUnit(c)) { + if (cru::string::IsUtf16SurrogatePairCodeUnit(c)) { // I don't think this will happen because normal key strike without ime // should only trigger ascci character. If it is a charater from // supplementary planes, it should be handled with ime messages. @@ -233,9 +249,7 @@ void WinInputMethodContext::OnWindowNativeMessage( } else { if (c != '\b') { // ignore backspace if (c == '\r') c = '\n'; // Change \r to \n - - char16_t s[1] = {c}; - text_event_.Raise({s, 1}); + text_event_.Raise(std::string{static_cast<char>(c)}); } } args.HandleWithResult(0); @@ -271,10 +285,10 @@ void WinInputMethodContext::OnWindowNativeMessage( } } -String WinInputMethodContext::GetResultString() { +std::string WinInputMethodContext::GetResultString() { auto himc = GetHIMC(); auto result = win::GetResultString(himc.Get()); - return result; + return string::ToUtf8(result); } AutoHIMC WinInputMethodContext::GetHIMC() { diff --git a/src/platform/gui/win/Keyboard.cpp b/src/platform/gui/win/Keyboard.cpp index 85a6576a..f4286fbc 100644 --- a/src/platform/gui/win/Keyboard.cpp +++ b/src/platform/gui/win/Keyboard.cpp @@ -66,9 +66,9 @@ KeyCode VirtualKeyToKeyCode(int virtual_key) { KeyModifier RetrieveKeyMofifier() { KeyModifier result{0}; - if (::GetKeyState(VK_SHIFT) < 0) result |= KeyModifiers::shift; - if (::GetKeyState(VK_CONTROL) < 0) result |= KeyModifiers::ctrl; - if (::GetKeyState(VK_MENU) < 0) result |= KeyModifiers::alt; + if (::GetKeyState(VK_SHIFT) < 0) result |= KeyModifiers::Shift; + if (::GetKeyState(VK_CONTROL) < 0) result |= KeyModifiers::Ctrl; + if (::GetKeyState(VK_MENU) < 0) result |= KeyModifiers::Alt; return result; } } // namespace cru::platform::gui::win diff --git a/src/platform/gui/win/Resource.cpp b/src/platform/gui/win/Resource.cpp index 45189464..6fb4d634 100644 --- a/src/platform/gui/win/Resource.cpp +++ b/src/platform/gui/win/Resource.cpp @@ -1,6 +1,5 @@ #include "cru/platform/gui/win/Resource.h" -#include "cru/platform/gui/win/Window.h" namespace cru::platform::gui::win { -String WinNativeResource::kPlatformId = u"Windows"; +std::string WinNativeResource::kPlatformId = "Windows"; } diff --git a/src/platform/gui/win/TimerManager.cpp b/src/platform/gui/win/TimerManager.cpp index c6128b85..3fc9afe4 100644 --- a/src/platform/gui/win/TimerManager.cpp +++ b/src/platform/gui/win/TimerManager.cpp @@ -4,7 +4,6 @@ #include "cru/platform/gui/win/Exception.h" #include <functional> -#include <type_traits> namespace cru::platform::gui::win { constexpr int kSetImmediateWindowMessageId = WM_USER + 2000; @@ -25,7 +24,7 @@ long long TimerManager::SetTimer(TimerType type, int period, static_cast<UINT_PTR>(id), 0)) { throw Win32Error( ::GetLastError(), - u"Failed to post window message to god window for set immediate."); + "Failed to post window message to god window for set immediate."); } } else { CreateNativeTimer(&timer_info); diff --git a/src/platform/gui/win/TimerManager.h b/src/platform/gui/win/TimerManager.h index b3f4aa38..2492a048 100644 --- a/src/platform/gui/win/TimerManager.h +++ b/src/platform/gui/win/TimerManager.h @@ -1,14 +1,11 @@ #pragma once #include "cru/base/Event.h" -#include "cru/platform/win/WinPreConfig.h" #include "cru/base/Base.h" #include "cru/platform/gui/win/GodWindow.h" #include "cru/platform/gui/win/WindowNativeMessageEventArgs.h" -#include <chrono> #include <functional> -#include <optional> #include <unordered_map> namespace cru::platform::gui::win { diff --git a/src/platform/gui/win/UiApplication.cpp b/src/platform/gui/win/UiApplication.cpp index 5be1a5d2..9909cd47 100644 --- a/src/platform/gui/win/UiApplication.cpp +++ b/src/platform/gui/win/UiApplication.cpp @@ -2,15 +2,12 @@ #include "TimerManager.h" #include "WindowManager.h" -#include "cru/base/log/Logger.h" -#include "cru/platform/Check.h" #include "cru/platform/graphics/direct2d/Factory.h" #include "cru/platform/gui/win/Base.h" #include "cru/platform/gui/win/Clipboard.h" #include "cru/platform/gui/win/Cursor.h" #include "cru/platform/gui/win/Exception.h" #include "cru/platform/gui/win/GodWindow.h" -#include "cru/platform/gui/win/InputMethod.h" #include "cru/platform/gui/win/Window.h" namespace cru::platform::gui { @@ -27,7 +24,7 @@ WinUiApplication::WinUiApplication() { instance_handle_ = ::GetModuleHandleW(nullptr); if (!instance_handle_) - throw Win32Error(u"Failed to get module(instance) handle."); + throw Win32Error("Failed to get module(instance) handle."); ::SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE); diff --git a/src/platform/gui/win/Window.cpp b/src/platform/gui/win/Window.cpp index eeb2cde4..9a9a7275 100644 --- a/src/platform/gui/win/Window.cpp +++ b/src/platform/gui/win/Window.cpp @@ -1,13 +1,14 @@ #include "cru/platform/gui/win/Window.h" #include "WindowManager.h" +#include "cru/base/StringUtil.h" #include "cru/base/log/Logger.h" #include "cru/platform/Check.h" #include "cru/platform/graphics/NullPainter.h" -#include "cru/platform/gui/Base.h" +#include "cru/platform/graphics/direct2d/WindowPainter.h" #include "cru/platform/gui/DebugFlags.h" +#include "cru/platform/gui/Input.h" #include "cru/platform/gui/Window.h" -#include "cru/platform/graphics/direct2d/WindowPainter.h" #include "cru/platform/gui/win/Cursor.h" #include "cru/platform/gui/win/Exception.h" #include "cru/platform/gui/win/InputMethod.h" @@ -42,7 +43,7 @@ Rect CalcWindowRectFromClient(const Rect& rect, WindowStyleFlag style_flag, r.right = DipToPixel(rect.GetRight(), dpi); r.bottom = DipToPixel(rect.GetBottom(), dpi); if (!AdjustWindowRectEx(&r, CalcWindowStyle(style_flag), FALSE, 0)) - throw Win32Error(::GetLastError(), u"Failed to invoke AdjustWindowRectEx."); + throw Win32Error(::GetLastError(), "Failed to invoke AdjustWindowRectEx."); Rect result = Rect::FromVertices(PixelToDip(r.left, dpi), PixelToDip(r.top, dpi), @@ -55,7 +56,7 @@ Rect CalcClientRectFromWindow(const Rect& rect, WindowStyleFlag style_flag, RECT o{100, 100, 500, 500}; RECT s = o; if (!AdjustWindowRectEx(&s, CalcWindowStyle(style_flag), FALSE, 0)) - throw Win32Error(::GetLastError(), u"Failed to invoke AdjustWindowRectEx."); + throw Win32Error(::GetLastError(), "Failed to invoke AdjustWindowRectEx."); Rect result = rect; result.Shrink(Thickness(PixelToDip(s.left - o.left, dpi), @@ -87,13 +88,14 @@ void WinNativeWindow::SetParent(INativeWindow* parent) { } } -String WinNativeWindow::GetTitle() { return title_; } +std::string WinNativeWindow::GetTitle() { return title_; } -void WinNativeWindow::SetTitle(String title) { +void WinNativeWindow::SetTitle(std::string title) { title_ = title; if (hwnd_) { - ::SetWindowTextW(hwnd_, title_.WinCStr()); + auto utf16_text = string::ToUtf16(title); + ::SetWindowTextW(hwnd_, utf16_text.c_str()); } } @@ -135,7 +137,7 @@ void WinNativeWindow::SetClientSize(const Size& size) { if (!SetWindowPos(hwnd_, nullptr, 0, 0, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOMOVE)) - throw Win32Error(::GetLastError(), u"Failed to invoke SetWindowPos."); + throw Win32Error(::GetLastError(), "Failed to invoke SetWindowPos."); } } @@ -150,7 +152,7 @@ void WinNativeWindow::SetClientRect(const Rect& rect) { if (!SetWindowPos(hwnd_, nullptr, 0, 0, r.right - r.left, r.bottom - r.top, SWP_NOZORDER | SWP_NOMOVE)) - throw Win32Error(::GetLastError(), u"Failed to invoke SetWindowPos."); + throw Win32Error(::GetLastError(), "Failed to invoke SetWindowPos."); } } @@ -158,7 +160,7 @@ Rect WinNativeWindow::GetWindowRect() { if (hwnd_) { RECT rect; if (!::GetWindowRect(hwnd_, &rect)) - throw Win32Error(::GetLastError(), u"Failed to invoke GetWindowRect."); + throw Win32Error(::GetLastError(), "Failed to invoke GetWindowRect."); return Rect::FromVertices(PixelToDip(rect.left), PixelToDip(rect.top), PixelToDip(rect.right), PixelToDip(rect.bottom)); @@ -174,7 +176,7 @@ void WinNativeWindow::SetWindowRect(const Rect& rect) { if (!SetWindowPos(hwnd_, nullptr, DipToPixel(rect.left), DipToPixel(rect.top), DipToPixel(rect.GetRight()), DipToPixel(rect.GetBottom()), SWP_NOZORDER)) - throw Win32Error(::GetLastError(), u"Failed to invoke SetWindowPos."); + throw Win32Error(::GetLastError(), "Failed to invoke SetWindowPos."); } } @@ -189,9 +191,9 @@ bool WinNativeWindow::RequestFocus() { Point WinNativeWindow::GetMousePosition() { POINT p; if (!::GetCursorPos(&p)) - throw Win32Error(::GetLastError(), u"Failed to get cursor position."); + throw Win32Error(::GetLastError(), "Failed to get cursor position."); if (!::ScreenToClient(hwnd_, &p)) - throw Win32Error(::GetLastError(), u"Failed to call ScreenToClient."); + throw Win32Error(::GetLastError(), "Failed to call ScreenToClient."); return PixelToDip(p); } @@ -210,9 +212,9 @@ void WinNativeWindow::RequestRepaint() { CRU_LOG_TAG_DEBUG("A repaint is requested."); } if (!::InvalidateRect(hwnd_, nullptr, FALSE)) - throw Win32Error(::GetLastError(), u"Failed to invalidate window."); + throw Win32Error(::GetLastError(), "Failed to invalidate window."); if (!::UpdateWindow(hwnd_)) - throw Win32Error(::GetLastError(), u"Failed to update window."); + throw Win32Error(::GetLastError(), "Failed to update window."); } std::unique_ptr<graphics::IPainter> WinNativeWindow::BeginPaint() { @@ -243,34 +245,34 @@ void WinNativeWindow::SetCursor(std::shared_ptr<ICursor> cursor) { if (GetVisibility() != WindowVisibilityType::Show) return; - auto lg = [](StringView reason) { + auto lg = [](std::string_view reason) { CRU_LOG_TAG_WARN( "Failed to set cursor because {} when window is visible. (We need to " "update cursor if it is inside the window.) Last error code: {}.", - reason.ToUtf8(), ::GetLastError()); + reason, ::GetLastError()); }; ::POINT point; if (!::GetCursorPos(&point)) { - lg(u"failed to get cursor pos"); + lg("failed to get cursor pos"); return; } ::RECT rect; if (!::GetClientRect(hwnd_, &rect)) { - lg(u"failed to get window's client rect"); + lg("failed to get window's client rect"); return; } ::POINT lefttop{rect.left, rect.top}; ::POINT rightbottom{rect.right, rect.bottom}; if (!::ClientToScreen(hwnd_, &lefttop)) { - lg(u"failed to call ClientToScreen on lefttop"); + lg("failed to call ClientToScreen on lefttop"); return; } if (!::ClientToScreen(hwnd_, &rightbottom)) { - lg(u"failed to call ClientToScreen on rightbottom"); + lg("failed to call ClientToScreen on rightbottom"); return; } @@ -283,8 +285,7 @@ void WinNativeWindow::SetCursor(std::shared_ptr<ICursor> cursor) { void WinNativeWindow::SetToForeground() { if (hwnd_) { if (!::SetForegroundWindow(hwnd_)) - throw Win32Error(::GetLastError(), - u"Failed to set window to foreground."); + throw Win32Error(::GetLastError(), "Failed to set window to foreground."); } } @@ -331,7 +332,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg, POINT point; point.x = GET_X_LPARAM(l_param); point.y = GET_Y_LPARAM(l_param); - OnMouseDownInternal(platform::gui::mouse_buttons::left, point); + OnMouseDownInternal(platform::gui::MouseButtons::Left, point); *result = 0; return true; } @@ -339,7 +340,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg, POINT point; point.x = GET_X_LPARAM(l_param); point.y = GET_Y_LPARAM(l_param); - OnMouseUpInternal(platform::gui::mouse_buttons::left, point); + OnMouseUpInternal(platform::gui::MouseButtons::Left, point); *result = 0; return true; } @@ -347,7 +348,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg, POINT point; point.x = GET_X_LPARAM(l_param); point.y = GET_Y_LPARAM(l_param); - OnMouseDownInternal(platform::gui::mouse_buttons::right, point); + OnMouseDownInternal(platform::gui::MouseButtons::Right, point); *result = 0; return true; } @@ -355,7 +356,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg, POINT point; point.x = GET_X_LPARAM(l_param); point.y = GET_Y_LPARAM(l_param); - OnMouseUpInternal(platform::gui::mouse_buttons::right, point); + OnMouseUpInternal(platform::gui::MouseButtons::Right, point); *result = 0; return true; } @@ -363,7 +364,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg, POINT point; point.x = GET_X_LPARAM(l_param); point.y = GET_Y_LPARAM(l_param); - OnMouseDownInternal(platform::gui::mouse_buttons::middle, point); + OnMouseDownInternal(platform::gui::MouseButtons::Middle, point); *result = 0; return true; } @@ -371,7 +372,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg, POINT point; point.x = GET_X_LPARAM(l_param); point.y = GET_Y_LPARAM(l_param); - OnMouseUpInternal(platform::gui::mouse_buttons::middle, point); + OnMouseUpInternal(platform::gui::MouseButtons::Middle, point); *result = 0; return true; } @@ -455,7 +456,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg, RECT WinNativeWindow::GetClientRectPixel() { RECT rect; if (!::GetClientRect(hwnd_, &rect)) - throw Win32Error(::GetLastError(), u"Failed to invoke GetClientRect."); + throw Win32Error(::GetLastError(), "Failed to invoke GetClientRect."); return rect; } @@ -470,11 +471,11 @@ void WinNativeWindow::RecreateWindow() { nullptr, application_->GetInstanceHandle(), nullptr); if (hwnd_ == nullptr) - throw Win32Error(::GetLastError(), u"Failed to create window."); + throw Win32Error(::GetLastError(), "Failed to create window."); auto dpi = ::GetDpiForWindow(hwnd_); if (dpi == 0) - throw Win32Error(::GetLastError(), u"Failed to get dpi of window."); + throw Win32Error(::GetLastError(), "Failed to get dpi of window."); dpi_ = static_cast<float>(dpi); CRU_LOG_TAG_DEBUG("Dpi of window is {}.", dpi_); @@ -483,7 +484,8 @@ void WinNativeWindow::RecreateWindow() { SetCursor(application_->GetCursorManager()->GetSystemCursor( cru::platform::gui::SystemCursorType::Arrow)); - ::SetWindowTextW(hwnd_, title_.WinCStr()); + auto utf16_title = string::ToUtf16(title_); + ::SetWindowTextW(hwnd_, utf16_title.c_str()); window_render_target_ = std::make_unique<graphics::direct2d::D2DWindowRenderTarget>( diff --git a/src/platform/gui/win/WindowClass.cpp b/src/platform/gui/win/WindowClass.cpp index cac50eda..67ff4710 100644 --- a/src/platform/gui/win/WindowClass.cpp +++ b/src/platform/gui/win/WindowClass.cpp @@ -23,6 +23,6 @@ WindowClass::WindowClass(std::wstring name, WNDPROC window_proc, atom_ = ::RegisterClassExW(&window_class); if (atom_ == 0) - throw Win32Error(::GetLastError(), u"Failed to create window class."); + throw Win32Error(::GetLastError(), "Failed to create window class."); } } // namespace cru::platform::gui::win diff --git a/src/ui/ThemeResourceDictionary.cpp b/src/ui/ThemeResourceDictionary.cpp index 587a14c5..b9c7c284 100644 --- a/src/ui/ThemeResourceDictionary.cpp +++ b/src/ui/ThemeResourceDictionary.cpp @@ -9,7 +9,7 @@ namespace cru::ui { std::unique_ptr<ThemeResourceDictionary> ThemeResourceDictionary::FromFile( std::filesystem::path file_path) { - io::CFileStream stream(file_path.c_str(), "r"); + io::CFileStream stream(file_path.generic_string().c_str(), "r"); auto xml_string = stream.ReadToEndAsUtf8String(); auto parser = xml::XmlParser(xml_string); return std::make_unique<ThemeResourceDictionary>(parser.Parse(), false); diff --git a/test/base/platform/win/StreamConvertTest.cpp b/test/base/platform/win/StreamConvertTest.cpp index 90ebb568..c0c5535c 100644 --- a/test/base/platform/win/StreamConvertTest.cpp +++ b/test/base/platform/win/StreamConvertTest.cpp @@ -1,3 +1,4 @@ +#include "cru/base/StringUtil.h" #include "cru/base/io/OpenFileFlag.h" #include "cru/base/platform/win/Exception.h" #include "cru/base/platform/win/StreamConvert.h" @@ -18,7 +19,7 @@ TEST_CASE("StreamConvert FileStreamWork", "[stream]") { .native(); _wmktemp(temp_file_path.data()); - String path = temp_file_path; + std::string path = string::ToUtf8(temp_file_path); Win32FileStream file(path, OpenFileFlags::Write | OpenFileFlags::Create); file.Write("abc", 3); diff --git a/test/base/platform/win/Win32FileStreamTest.cpp b/test/base/platform/win/Win32FileStreamTest.cpp index dc2f49d4..798320f7 100644 --- a/test/base/platform/win/Win32FileStreamTest.cpp +++ b/test/base/platform/win/Win32FileStreamTest.cpp @@ -1,3 +1,4 @@ +#include "cru/base/StringUtil.h" #include "cru/base/io/OpenFileFlag.h" #include "cru/base/platform/win/Win32FileStream.h" @@ -16,14 +17,14 @@ TEST_CASE("Win32FileStream Work", "[stream]") { .native(); _wmktemp(temp_file_path.data()); - String path = temp_file_path; + std::string path = string::ToUtf8(temp_file_path); Win32FileStream file(path, OpenFileFlags::Write | OpenFileFlags::Create); auto write_count = file.Write("abc", 3); REQUIRE(write_count == 3); file.Close(); - REQUIRE(std::filesystem::file_size(path.ToUtf8()) == 3); + REQUIRE(std::filesystem::file_size(path) == 3); Win32FileStream file2(path, OpenFileFlags::Read); auto buffer = std::make_unique<std::byte[]>(3); |