aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/base/Exception.h1
-rw-r--r--include/cru/base/StringUtil.h5
-rw-r--r--include/cru/base/platform/win/Exception.h7
-rw-r--r--include/cru/base/platform/win/Win32FileStream.h7
-rw-r--r--include/cru/platform/graphics/direct2d/Factory.h4
-rw-r--r--include/cru/platform/graphics/direct2d/Font.h6
-rw-r--r--include/cru/platform/graphics/direct2d/Resource.h4
-rw-r--r--include/cru/platform/graphics/direct2d/TextLayout.h9
-rw-r--r--include/cru/platform/gui/win/Clipboard.h4
-rw-r--r--include/cru/platform/gui/win/GodWindow.h1
-rw-r--r--include/cru/platform/gui/win/InputMethod.h6
-rw-r--r--include/cru/platform/gui/win/Resource.h4
-rw-r--r--include/cru/platform/gui/win/Window.h7
-rw-r--r--include/cru/toml/TomlDocument.h1
-rw-r--r--src/base/StringUtil.cpp21
-rw-r--r--src/base/log/StdioLogTarget.cpp11
-rw-r--r--src/base/platform/win/DebugLogTarget.cpp4
-rw-r--r--src/base/platform/win/Exception.cpp25
-rw-r--r--src/base/platform/win/Win32FileStream.cpp6
-rw-r--r--src/platform/graphics/direct2d/Factory.cpp6
-rw-r--r--src/platform/graphics/direct2d/Font.cpp13
-rw-r--r--src/platform/graphics/direct2d/Resource.cpp2
-rw-r--r--src/platform/graphics/direct2d/TextLayout.cpp46
-rw-r--r--src/platform/gui/win/Clipboard.cpp11
-rw-r--r--src/platform/gui/win/Cursor.cpp2
-rw-r--r--src/platform/gui/win/GodWindow.cpp2
-rw-r--r--src/platform/gui/win/InputMethod.cpp46
-rw-r--r--src/platform/gui/win/Keyboard.cpp6
-rw-r--r--src/platform/gui/win/Resource.cpp3
-rw-r--r--src/platform/gui/win/TimerManager.cpp3
-rw-r--r--src/platform/gui/win/TimerManager.h3
-rw-r--r--src/platform/gui/win/UiApplication.cpp5
-rw-r--r--src/platform/gui/win/Window.cpp68
-rw-r--r--src/platform/gui/win/WindowClass.cpp2
-rw-r--r--src/ui/ThemeResourceDictionary.cpp2
-rw-r--r--test/base/platform/win/StreamConvertTest.cpp3
-rw-r--r--test/base/platform/win/Win32FileStreamTest.cpp5
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);