aboutsummaryrefslogtreecommitdiff
path: root/include/cru/win
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/win')
-rw-r--r--include/cru/win/graphics/direct/Brush.hpp (renamed from include/cru/win/graph/direct/Brush.hpp)6
-rw-r--r--include/cru/win/graphics/direct/ComResource.hpp (renamed from include/cru/win/graph/direct/ComResource.hpp)4
-rw-r--r--include/cru/win/graphics/direct/ConvertUtil.hpp (renamed from include/cru/win/graph/direct/ConvertUtil.hpp)6
-rw-r--r--include/cru/win/graphics/direct/Exception.hpp (renamed from include/cru/win/graph/direct/Exception.hpp)4
-rw-r--r--include/cru/win/graphics/direct/Factory.hpp (renamed from include/cru/win/graph/direct/Factory.hpp)6
-rw-r--r--include/cru/win/graphics/direct/Font.hpp (renamed from include/cru/win/graph/direct/Font.hpp)6
-rw-r--r--include/cru/win/graphics/direct/Geometry.hpp (renamed from include/cru/win/graph/direct/Geometry.hpp)6
-rw-r--r--include/cru/win/graphics/direct/Painter.hpp (renamed from include/cru/win/graph/direct/Painter.hpp)8
-rw-r--r--include/cru/win/graphics/direct/Resource.hpp (renamed from include/cru/win/graph/direct/Resource.hpp)6
-rw-r--r--include/cru/win/graphics/direct/TextLayout.hpp (renamed from include/cru/win/graph/direct/TextLayout.hpp)8
-rw-r--r--include/cru/win/graphics/direct/WindowPainter.hpp21
-rw-r--r--include/cru/win/graphics/direct/WindowRenderTarget.hpp42
-rw-r--r--include/cru/win/gui/Base.hpp (renamed from include/cru/win/native/Base.hpp)9
-rw-r--r--include/cru/win/gui/Cursor.hpp (renamed from include/cru/win/native/Cursor.hpp)9
-rw-r--r--include/cru/win/gui/Exception.hpp (renamed from include/cru/win/native/Exception.hpp)4
-rw-r--r--include/cru/win/gui/GodWindow.hpp (renamed from include/cru/win/native/GodWindow.hpp)15
-rw-r--r--include/cru/win/gui/InputMethod.hpp (renamed from include/cru/win/native/InputMethod.hpp)31
-rw-r--r--include/cru/win/gui/Keyboard.hpp9
-rw-r--r--include/cru/win/gui/Resource.hpp (renamed from include/cru/win/native/Resource.hpp)4
-rw-r--r--include/cru/win/gui/UiApplication.hpp (renamed from include/cru/win/native/UiApplication.hpp)22
-rw-r--r--include/cru/win/gui/Window.hpp (renamed from include/cru/win/native/Window.hpp)96
-rw-r--r--include/cru/win/gui/WindowClass.hpp (renamed from include/cru/win/native/WindowClass.hpp)4
-rw-r--r--include/cru/win/gui/WindowNativeMessageEventArgs.hpp (renamed from include/cru/win/native/WindowNativeMessageEventArgs.hpp)4
-rw-r--r--include/cru/win/native/Keyboard.hpp9
-rw-r--r--include/cru/win/native/WindowRenderTarget.hpp47
25 files changed, 198 insertions, 188 deletions
diff --git a/include/cru/win/graph/direct/Brush.hpp b/include/cru/win/graphics/direct/Brush.hpp
index df1debe3..fbff83b5 100644
--- a/include/cru/win/graph/direct/Brush.hpp
+++ b/include/cru/win/graphics/direct/Brush.hpp
@@ -2,9 +2,9 @@
#include "ComResource.hpp"
#include "Resource.hpp"
-#include "cru/platform/graph/Brush.hpp"
+#include "cru/platform/graphics/Brush.hpp"
-namespace cru::platform::graph::win::direct {
+namespace cru::platform::graphics::win::direct {
struct ID2DBrush : virtual IBrush {
virtual ID2D1Brush* GetD2DBrushInterface() const = 0;
};
@@ -36,4 +36,4 @@ class D2DSolidColorBrush : public DirectGraphResource,
Microsoft::WRL::ComPtr<ID2D1SolidColorBrush> brush_;
};
-} // namespace cru::platform::graph::win::direct
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/graph/direct/ComResource.hpp b/include/cru/win/graphics/direct/ComResource.hpp
index 2ac332cd..34ea39ed 100644
--- a/include/cru/win/graph/direct/ComResource.hpp
+++ b/include/cru/win/graphics/direct/ComResource.hpp
@@ -3,9 +3,9 @@
#include "cru/common/Base.hpp"
-namespace cru::platform::graph::win::direct {
+namespace cru::platform::graphics::win::direct {
template <typename TInterface>
struct IComResource : virtual Interface {
virtual TInterface* GetComInterface() const = 0;
};
-} // namespace cru::platform::graph::win::direct
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/graph/direct/ConvertUtil.hpp b/include/cru/win/graphics/direct/ConvertUtil.hpp
index 12a04c7b..0d8da8a1 100644
--- a/include/cru/win/graph/direct/ConvertUtil.hpp
+++ b/include/cru/win/graphics/direct/ConvertUtil.hpp
@@ -1,9 +1,9 @@
#pragma once
#include "../../WinPreConfig.hpp"
-#include "cru/platform/graph/Base.hpp"
+#include "cru/platform/graphics/Base.hpp"
-namespace cru::platform::graph::win::direct {
+namespace cru::platform::graphics::win::direct {
inline D2D1_MATRIX_3X2_F Convert(const platform::Matrix& matrix) {
D2D1_MATRIX_3X2_F m;
m._11 = matrix.m11;
@@ -104,4 +104,4 @@ inline bool operator==(const D2D1_ELLIPSE& left, const D2D1_ELLIPSE& right) {
inline bool operator!=(const D2D1_ELLIPSE& left, const D2D1_ELLIPSE& right) {
return !(left == right);
}
-} // namespace cru::platform::graph::win::direct
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/graph/direct/Exception.hpp b/include/cru/win/graphics/direct/Exception.hpp
index 8b62e8fa..72493f2f 100644
--- a/include/cru/win/graph/direct/Exception.hpp
+++ b/include/cru/win/graphics/direct/Exception.hpp
@@ -1,7 +1,7 @@
#pragma once
#include "../../Exception.hpp"
-namespace cru::platform::graph::win::direct {
+namespace cru::platform::graphics::win::direct {
using platform::win::HResultError;
using platform::win::ThrowIfFailed;
-} // namespace cru::platform::graph::win::direct \ No newline at end of file
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/graph/direct/Factory.hpp b/include/cru/win/graphics/direct/Factory.hpp
index e70454f5..70f3ede1 100644
--- a/include/cru/win/graph/direct/Factory.hpp
+++ b/include/cru/win/graphics/direct/Factory.hpp
@@ -1,9 +1,9 @@
#pragma once
#include "Resource.hpp"
-#include "cru/platform/graph/Factory.hpp"
+#include "cru/platform/graphics/Factory.hpp"
-namespace cru::platform::graph::win::direct {
+namespace cru::platform::graphics::win::direct {
class DirectGraphFactory : public DirectResource, public virtual IGraphFactory {
public:
DirectGraphFactory();
@@ -55,4 +55,4 @@ class DirectGraphFactory : public DirectResource, public virtual IGraphFactory {
Microsoft::WRL::ComPtr<IDWriteFactory> dwrite_factory_;
Microsoft::WRL::ComPtr<IDWriteFontCollection> dwrite_system_font_collection_;
};
-} // namespace cru::platform::graph::win::direct
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/graph/direct/Font.hpp b/include/cru/win/graphics/direct/Font.hpp
index 2195f3e4..fd3921a3 100644
--- a/include/cru/win/graph/direct/Font.hpp
+++ b/include/cru/win/graphics/direct/Font.hpp
@@ -2,11 +2,11 @@
#include "ComResource.hpp"
#include "Resource.hpp"
-#include "cru/platform/graph/Font.hpp"
+#include "cru/platform/graphics/Font.hpp"
#include <string_view>
-namespace cru::platform::graph::win::direct {
+namespace cru::platform::graphics::win::direct {
class DWriteFont : public DirectGraphResource,
public virtual IFont,
public virtual IComResource<IDWriteTextFormat> {
@@ -30,4 +30,4 @@ class DWriteFont : public DirectGraphResource,
std::u16string font_family_;
Microsoft::WRL::ComPtr<IDWriteTextFormat> text_format_;
};
-} // namespace cru::platform::graph::win::direct
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/graph/direct/Geometry.hpp b/include/cru/win/graphics/direct/Geometry.hpp
index 87987d3e..edfec590 100644
--- a/include/cru/win/graph/direct/Geometry.hpp
+++ b/include/cru/win/graphics/direct/Geometry.hpp
@@ -2,9 +2,9 @@
#include "ComResource.hpp"
#include "Resource.hpp"
-#include "cru/platform/graph/Geometry.hpp"
+#include "cru/platform/graphics/Geometry.hpp"
-namespace cru::platform::graph::win::direct {
+namespace cru::platform::graphics::win::direct {
class D2DGeometryBuilder : public DirectGraphResource,
public virtual IGeometryBuilder {
public:
@@ -54,4 +54,4 @@ class D2DGeometry : public DirectGraphResource,
private:
Microsoft::WRL::ComPtr<ID2D1PathGeometry> geometry_;
};
-} // namespace cru::platform::graph::win::direct
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/graph/direct/Painter.hpp b/include/cru/win/graphics/direct/Painter.hpp
index a50f962d..b34c1563 100644
--- a/include/cru/win/graph/direct/Painter.hpp
+++ b/include/cru/win/graphics/direct/Painter.hpp
@@ -2,11 +2,11 @@
#include "ComResource.hpp"
#include "Resource.hpp"
-#include "cru/platform/graph/Painter.hpp"
+#include "cru/platform/graphics/Painter.hpp"
#include <vector>
-namespace cru::platform::graph::win::direct {
+namespace cru::platform::graphics::win::direct {
class D2DPainter : public DirectResource,
public virtual IPainter,
public virtual IComResource<ID2D1RenderTarget> {
@@ -27,6 +27,8 @@ class D2DPainter : public DirectResource,
void Clear(const Color& color) override;
+ void DrawLine(const Point& start, const Point& end, IBrush* brush,
+ float width) override;
void StrokeRectangle(const Rect& rectangle, IBrush* brush,
float width) override;
void FillRectangle(const Rect& rectangle, IBrush* brush) override;
@@ -57,4 +59,4 @@ class D2DPainter : public DirectResource,
bool is_drawing_ = true;
};
-} // namespace cru::platform::graph::win::direct
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/graph/direct/Resource.hpp b/include/cru/win/graphics/direct/Resource.hpp
index 6162ebd8..f60f373e 100644
--- a/include/cru/win/graph/direct/Resource.hpp
+++ b/include/cru/win/graphics/direct/Resource.hpp
@@ -1,11 +1,11 @@
#pragma once
#include "../../WinPreConfig.hpp"
-#include "cru/platform/graph/Resource.hpp"
+#include "cru/platform/graphics/Resource.hpp"
#include <string_view>
-namespace cru::platform::graph::win::direct {
+namespace cru::platform::graphics::win::direct {
class DirectGraphFactory;
class DirectResource : public Object, public virtual INativeResource {
@@ -46,4 +46,4 @@ class DirectGraphResource : public DirectResource,
private:
DirectGraphFactory* factory_;
};
-} // namespace cru::platform::graph::win::direct
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/graph/direct/TextLayout.hpp b/include/cru/win/graphics/direct/TextLayout.hpp
index 016009ab..aa040278 100644
--- a/include/cru/win/graph/direct/TextLayout.hpp
+++ b/include/cru/win/graphics/direct/TextLayout.hpp
@@ -2,12 +2,12 @@
#include "ComResource.hpp"
#include "Resource.hpp"
-#include "cru/platform/graph/TextLayout.hpp"
+#include "cru/platform/graphics/TextLayout.hpp"
#include <limits>
#include <memory>
-namespace cru::platform::graph::win::direct {
+namespace cru::platform::graphics::win::direct {
class DWriteFont;
class DWriteTextLayout : public DirectGraphResource,
@@ -38,7 +38,7 @@ class DWriteTextLayout : public DirectGraphResource,
void SetMaxWidth(float max_width) override;
void SetMaxHeight(float max_height) override;
- Rect GetTextBounds() override;
+ Rect GetTextBounds(bool includingTrailingSpace = false) override;
// Return empty vector if text_range.count is 0. Text range could be in
// reverse direction, it should be normalized first in implementation.
std::vector<Rect> TextRangeRect(const TextRange& text_range) override;
@@ -52,4 +52,4 @@ class DWriteTextLayout : public DirectGraphResource,
float max_height_ = std::numeric_limits<float>::max();
Microsoft::WRL::ComPtr<IDWriteTextLayout> text_layout_;
};
-} // namespace cru::platform::graph::win::direct
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/graphics/direct/WindowPainter.hpp b/include/cru/win/graphics/direct/WindowPainter.hpp
new file mode 100644
index 00000000..b5faf7b5
--- /dev/null
+++ b/include/cru/win/graphics/direct/WindowPainter.hpp
@@ -0,0 +1,21 @@
+#pragma once
+#include "Painter.hpp"
+#include "WindowRenderTarget.hpp"
+
+namespace cru::platform::graphics::win::direct {
+class D2DWindowPainter : public graphics::win::direct::D2DPainter {
+ public:
+ explicit D2DWindowPainter(D2DWindowRenderTarget* window);
+
+ CRU_DELETE_COPY(D2DWindowPainter)
+ CRU_DELETE_MOVE(D2DWindowPainter)
+
+ ~D2DWindowPainter() override;
+
+ protected:
+ void DoEndDraw() override;
+
+ private:
+ D2DWindowRenderTarget* render_target_;
+};
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/graphics/direct/WindowRenderTarget.hpp b/include/cru/win/graphics/direct/WindowRenderTarget.hpp
new file mode 100644
index 00000000..75b1bf20
--- /dev/null
+++ b/include/cru/win/graphics/direct/WindowRenderTarget.hpp
@@ -0,0 +1,42 @@
+#pragma once
+#include "Factory.hpp"
+
+namespace cru::platform::graphics::win::direct {
+// Represents a window render target.
+class D2DWindowRenderTarget : public Object {
+ public:
+ D2DWindowRenderTarget(gsl::not_null<DirectGraphFactory*> factory, HWND hwnd);
+
+ CRU_DELETE_COPY(D2DWindowRenderTarget)
+ CRU_DELETE_MOVE(D2DWindowRenderTarget)
+
+ ~D2DWindowRenderTarget() override = default;
+
+ public:
+ graphics::win::direct::DirectGraphFactory* GetDirectFactory() const {
+ return factory_;
+ }
+
+ ID2D1DeviceContext* GetD2D1DeviceContext() {
+ return d2d1_device_context_.Get();
+ }
+
+ void SetDpi(float x, float y);
+
+ // Resize the underlying buffer.
+ void ResizeBuffer(int width, int height);
+
+ // Present the data of the underlying buffer to the window.
+ void Present();
+
+ private:
+ void CreateTargetBitmap();
+
+ private:
+ DirectGraphFactory* factory_;
+ HWND hwnd_;
+ Microsoft::WRL::ComPtr<ID2D1DeviceContext> d2d1_device_context_;
+ Microsoft::WRL::ComPtr<IDXGISwapChain1> dxgi_swap_chain_;
+ Microsoft::WRL::ComPtr<ID2D1Bitmap1> target_bitmap_;
+};
+} // namespace cru::platform::graphics::win::direct
diff --git a/include/cru/win/native/Base.hpp b/include/cru/win/gui/Base.hpp
index a50c6dd1..00782663 100644
--- a/include/cru/win/native/Base.hpp
+++ b/include/cru/win/gui/Base.hpp
@@ -3,17 +3,14 @@
#include "cru/common/Base.hpp"
-namespace cru::platform::native::win {
+namespace cru::platform::gui::win {
class GodWindow;
class TimerManager;
class WinCursor;
class WinCursorManager;
class WindowClass;
class WindowManager;
-class WindowRenderTarget;
class WinNativeWindow;
-class WinNativeWindowResolver;
class WinUiApplication;
-class WinInputMethodManager;
-class WinInputMethodContextRef;
-} // namespace cru::platform::native::win
+class WinInputMethodContext;
+} // namespace cru::platform::gui::win
diff --git a/include/cru/win/native/Cursor.hpp b/include/cru/win/gui/Cursor.hpp
index 373b9170..e7c76879 100644
--- a/include/cru/win/native/Cursor.hpp
+++ b/include/cru/win/gui/Cursor.hpp
@@ -1,13 +1,13 @@
#pragma once
#include "Resource.hpp"
-#include "cru/platform/native/Cursor.hpp"
+#include "cru/platform/gui/Cursor.hpp"
#include <memory>
-namespace cru::platform::native::win {
+namespace cru::platform::gui::win {
class WinCursor : public WinNativeResource, public virtual ICursor {
- CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::native::win::WinCursor")
+ CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinCursor")
public:
WinCursor(HCURSOR handle, bool auto_destroy);
@@ -45,5 +45,6 @@ class WinCursorManager : public WinNativeResource,
private:
std::shared_ptr<WinCursor> sys_arrow_;
std::shared_ptr<WinCursor> sys_hand_;
+ std::shared_ptr<WinCursor> sys_ibeam_;
};
-} // namespace cru::platform::native::win
+} // namespace cru::platform::gui::win
diff --git a/include/cru/win/native/Exception.hpp b/include/cru/win/gui/Exception.hpp
index 6a5265c1..895e6c14 100644
--- a/include/cru/win/native/Exception.hpp
+++ b/include/cru/win/gui/Exception.hpp
@@ -1,7 +1,7 @@
#pragma once
#include "../Exception.hpp"
-namespace cru::platform::native::win {
+namespace cru::platform::gui::win {
using platform::win::Win32Error;
using platform::win::HResultError;
-} // namespace cru::platform::native::win
+} // namespace cru::platform::gui::win
diff --git a/include/cru/win/native/GodWindow.hpp b/include/cru/win/gui/GodWindow.hpp
index 8b20e01f..0343b159 100644
--- a/include/cru/win/native/GodWindow.hpp
+++ b/include/cru/win/gui/GodWindow.hpp
@@ -1,11 +1,14 @@
#pragma once
#include "Base.hpp"
+#include "WindowNativeMessageEventArgs.hpp"
+#include "cru/common/Event.hpp"
+
#include <memory>
-namespace cru::platform::native::win {
+namespace cru::platform::gui::win {
class GodWindow : public Object {
- CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::native::win::GodWindow")
+ CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::GodWindow")
public:
explicit GodWindow(WinUiApplication* application);
@@ -20,10 +23,16 @@ class GodWindow : public Object {
bool HandleGodWindowMessage(HWND hwnd, UINT msg, WPARAM w_param,
LPARAM l_param, LRESULT* result);
+ IEvent<WindowNativeMessageEventArgs&>* MessageEvent() {
+ return &message_event_;
+ }
+
private:
WinUiApplication* application_;
std::unique_ptr<WindowClass> god_window_class_;
HWND hwnd_;
+
+ Event<WindowNativeMessageEventArgs&> message_event_;
};
-} // namespace cru::platform::native::win
+} // namespace cru::platform::gui::win
diff --git a/include/cru/win/native/InputMethod.hpp b/include/cru/win/gui/InputMethod.hpp
index 113f460d..51a007d8 100644
--- a/include/cru/win/native/InputMethod.hpp
+++ b/include/cru/win/gui/InputMethod.hpp
@@ -6,13 +6,13 @@
#include "Resource.hpp"
#include "WindowNativeMessageEventArgs.hpp"
-#include "cru/platform/native/InputMethod.hpp"
+#include "cru/platform/gui/InputMethod.hpp"
#include <imm.h>
-namespace cru::platform::native::win {
+namespace cru::platform::gui::win {
class AutoHIMC : public Object {
- CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::native::win::AutoHIMC")
+ CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::AutoHIMC")
public:
explicit AutoHIMC(HWND hwnd);
@@ -35,7 +35,7 @@ class AutoHIMC : public Object {
class WinInputMethodContext : public WinNativeResource,
public virtual IInputMethodContext {
- CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::native::win::WinInputMethodContext")
+ CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinInputMethodContext")
public:
WinInputMethodContext(gsl::not_null<WinNativeWindow*> window);
@@ -72,31 +72,16 @@ class WinInputMethodContext : public WinNativeResource,
std::u16string GetResultString();
- std::optional<AutoHIMC> TryGetHIMC();
+ AutoHIMC GetHIMC();
private:
- std::shared_ptr<INativeWindowResolver> native_window_resolver_;
+ WinNativeWindow* native_window_;
- std::vector<EventRevokerGuard> event_revoker_guards_;
+ EventRevokerListGuard event_guard_;
Event<std::nullptr_t> composition_start_event_;
Event<std::nullptr_t> composition_end_event_;
Event<std::nullptr_t> composition_event_;
Event<std::u16string_view> text_event_;
};
-
-class WinInputMethodManager : public WinNativeResource,
- public virtual IInputMethodManager {
- public:
- WinInputMethodManager(WinUiApplication* application);
-
- CRU_DELETE_COPY(WinInputMethodManager)
- CRU_DELETE_MOVE(WinInputMethodManager)
-
- ~WinInputMethodManager() override;
-
- public:
- std::unique_ptr<IInputMethodContext> GetContext(
- INativeWindow* window) override;
-};
-} // namespace cru::platform::native::win
+} // namespace cru::platform::gui::win
diff --git a/include/cru/win/gui/Keyboard.hpp b/include/cru/win/gui/Keyboard.hpp
new file mode 100644
index 00000000..5b98833c
--- /dev/null
+++ b/include/cru/win/gui/Keyboard.hpp
@@ -0,0 +1,9 @@
+#pragma once
+#include "Base.hpp"
+
+#include "cru/platform/gui/Keyboard.hpp"
+
+namespace cru::platform::gui::win {
+KeyCode VirtualKeyToKeyCode(int virtual_key);
+KeyModifier RetrieveKeyMofifier();
+} // namespace cru::platform::gui::win
diff --git a/include/cru/win/native/Resource.hpp b/include/cru/win/gui/Resource.hpp
index 0de0e1a8..1f6f0a4a 100644
--- a/include/cru/win/native/Resource.hpp
+++ b/include/cru/win/gui/Resource.hpp
@@ -3,7 +3,7 @@
#include "cru/platform/Resource.hpp"
-namespace cru::platform::native::win {
+namespace cru::platform::gui::win {
class WinNativeResource : public Object, public virtual INativeResource {
public:
static constexpr std::u16string_view k_platform_id = u"Windows";
@@ -20,4 +20,4 @@ class WinNativeResource : public Object, public virtual INativeResource {
public:
std::u16string_view GetPlatformId() const final { return k_platform_id; }
};
-} // namespace cru::platform::native::win
+} // namespace cru::platform::gui::win
diff --git a/include/cru/win/native/UiApplication.hpp b/include/cru/win/gui/UiApplication.hpp
index cbc08af7..4cf46858 100644
--- a/include/cru/win/native/UiApplication.hpp
+++ b/include/cru/win/gui/UiApplication.hpp
@@ -1,15 +1,16 @@
#pragma once
#include "Resource.hpp"
-#include "cru/platform/native/UiApplication.hpp"
+#include "cru/platform/gui/Base.hpp"
+#include "cru/platform/gui/UiApplication.hpp"
#include <memory>
-namespace cru::platform::graph::win::direct {
+namespace cru::platform::graphics::win::direct {
class DirectGraphFactory;
}
-namespace cru::platform::native::win {
+namespace cru::platform::gui::win {
class WinUiApplication : public WinNativeResource,
public virtual IUiApplication {
public:
@@ -32,7 +33,7 @@ class WinUiApplication : public WinNativeResource,
void AddOnQuitHandler(std::function<void()> handler) override;
- void InvokeLater(std::function<void()> action) override;
+ long long SetImmediate(std::function<void()> action) override;
long long SetTimeout(std::chrono::milliseconds milliseconds,
std::function<void()> action) override;
long long SetInterval(std::chrono::milliseconds milliseconds,
@@ -40,17 +41,15 @@ class WinUiApplication : public WinNativeResource,
void CancelTimer(long long id) override;
std::vector<INativeWindow*> GetAllWindow() override;
- std::shared_ptr<INativeWindowResolver> CreateWindow(
- INativeWindow* parent) override;
+ INativeWindow* CreateWindow(INativeWindow* parent, CreateWindowFlag flag) override;
- cru::platform::graph::IGraphFactory* GetGraphFactory() override;
+ cru::platform::graphics::IGraphFactory* GetGraphFactory() override;
- cru::platform::graph::win::direct::DirectGraphFactory* GetDirectFactory() {
+ cru::platform::graphics::win::direct::DirectGraphFactory* GetDirectFactory() {
return graph_factory_.get();
}
ICursorManager* GetCursorManager() override;
- IInputMethodManager* GetInputMethodManager() override;
HINSTANCE GetInstanceHandle() const { return instance_handle_; }
@@ -61,7 +60,7 @@ class WinUiApplication : public WinNativeResource,
private:
HINSTANCE instance_handle_;
- std::unique_ptr<cru::platform::graph::win::direct::DirectGraphFactory>
+ std::unique_ptr<cru::platform::graphics::win::direct::DirectGraphFactory>
graph_factory_;
std::unique_ptr<GodWindow> god_window_;
@@ -69,8 +68,7 @@ class WinUiApplication : public WinNativeResource,
std::unique_ptr<WindowManager> window_manager_;
std::unique_ptr<WinCursorManager> cursor_manager_;
- std::unique_ptr<WinInputMethodManager> input_method_manager_;
std::vector<std::function<void()>> quit_handlers_;
};
-} // namespace cru::platform::native::win
+} // namespace cru::platform::gui::win
diff --git a/include/cru/win/native/Window.hpp b/include/cru/win/gui/Window.hpp
index 3e0b11cd..3ba9ef68 100644
--- a/include/cru/win/native/Window.hpp
+++ b/include/cru/win/gui/Window.hpp
@@ -2,13 +2,16 @@
#include "Resource.hpp"
#include "WindowNativeMessageEventArgs.hpp"
-#include "cru/platform/native/Window.hpp"
+#include "cru/platform/GraphBase.hpp"
+#include "cru/platform/gui/Base.hpp"
+#include "cru/platform/gui/Window.hpp"
+#include "cru/win/graphics/direct/WindowRenderTarget.hpp"
#include <memory>
-namespace cru::platform::native::win {
+namespace cru::platform::gui::win {
class WinNativeWindow : public WinNativeResource, public virtual INativeWindow {
- CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::native::win::WinNativeWindow")
+ CRU_DEFINE_CLASS_LOG_TAG(u"cru::platform::gui::win::WinNativeWindow")
public:
WinNativeWindow(WinUiApplication* application, WindowClass* window_class,
@@ -20,10 +23,6 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow {
~WinNativeWindow() override;
public:
- std::shared_ptr<INativeWindowResolver> GetResolver() override {
- return std::static_pointer_cast<INativeWindowResolver>(resolver_);
- }
-
void Close() override;
WinNativeWindow* GetParent() override { return parent_window_; }
@@ -48,7 +47,7 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow {
bool ReleaseMouse() override;
void RequestRepaint() override;
- std::unique_ptr<graph::IPainter> BeginPaint() override;
+ std::unique_ptr<graphics::IPainter> BeginPaint() override;
void SetCursor(std::shared_ptr<ICursor> cursor) override;
@@ -60,18 +59,18 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow {
return &mouse_enter_leave_event_;
}
IEvent<Point>* MouseMoveEvent() override { return &mouse_move_event_; }
- IEvent<platform::native::NativeMouseButtonEventArgs>* MouseDownEvent()
+ IEvent<platform::gui::NativeMouseButtonEventArgs>* MouseDownEvent()
override {
return &mouse_down_event_;
}
- IEvent<platform::native::NativeMouseButtonEventArgs>* MouseUpEvent()
+ IEvent<platform::gui::NativeMouseButtonEventArgs>* MouseUpEvent()
override {
return &mouse_up_event_;
}
- IEvent<platform::native::NativeKeyEventArgs>* KeyDownEvent() override {
+ IEvent<platform::gui::NativeKeyEventArgs>* KeyDownEvent() override {
return &key_down_event_;
}
- IEvent<platform::native::NativeKeyEventArgs>* KeyUpEvent() override {
+ IEvent<platform::gui::NativeKeyEventArgs>* KeyUpEvent() override {
return &key_up_event_;
}
@@ -79,16 +78,40 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow {
return &native_message_event_;
}
+ IInputMethodContext* GetInputMethodContext() override;
+
// Get the handle of the window. Return null if window is invalid.
HWND GetWindowHandle() const { return hwnd_; }
bool HandleNativeWindowMessage(HWND hwnd, UINT msg, WPARAM w_param,
LPARAM l_param, LRESULT* result);
- WindowRenderTarget* GetWindowRenderTarget() const {
+ graphics::win::direct::D2DWindowRenderTarget* GetWindowRenderTarget() const {
return window_render_target_.get();
}
+ //*************** region: dpi ***************
+ float GetDpi() const { return dpi_; }
+
+ inline int DipToPixel(const float dip) {
+ return static_cast<int>(dip * GetDpi() / 96.0f);
+ }
+
+ inline POINT DipToPixel(const Point& dip_point) {
+ POINT result;
+ result.x = DipToPixel(dip_point.x);
+ result.y = DipToPixel(dip_point.y);
+ return result;
+ }
+
+ inline float PixelToDip(const int pixel) {
+ return static_cast<float>(pixel) * 96.0f / GetDpi();
+ }
+
+ inline Point PixelToDip(const POINT& pi_point) {
+ return Point(PixelToDip(pi_point.x), PixelToDip(pi_point.y));
+ }
+
private:
// Get the client rect in pixel.
RECT GetClientRectPixel();
@@ -104,8 +127,8 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow {
void OnMouseMoveInternal(POINT point);
void OnMouseLeaveInternal();
- void OnMouseDownInternal(platform::native::MouseButton button, POINT point);
- void OnMouseUpInternal(platform::native::MouseButton button, POINT point);
+ void OnMouseDownInternal(platform::gui::MouseButton button, POINT point);
+ void OnMouseUpInternal(platform::gui::MouseButton button, POINT point);
void OnMouseWheelInternal(short delta, POINT point);
void OnKeyDownInternal(int virtual_code);
@@ -124,53 +147,32 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow {
// again.
bool sync_flag_ = false;
- std::shared_ptr<WinNativeWindowResolver> resolver_;
-
HWND hwnd_;
WinNativeWindow* parent_window_;
+ float dpi_;
+
bool has_focus_ = false;
bool is_mouse_in_ = false;
- std::unique_ptr<WindowRenderTarget> window_render_target_;
+ std::unique_ptr<graphics::win::direct::D2DWindowRenderTarget>
+ window_render_target_;
std::shared_ptr<WinCursor> cursor_;
+ std::unique_ptr<WinInputMethodContext> input_method_context_;
+
Event<std::nullptr_t> destroy_event_;
Event<std::nullptr_t> paint_event_;
Event<Size> resize_event_;
Event<FocusChangeType> focus_event_;
Event<MouseEnterLeaveType> mouse_enter_leave_event_;
Event<Point> mouse_move_event_;
- Event<platform::native::NativeMouseButtonEventArgs> mouse_down_event_;
- Event<platform::native::NativeMouseButtonEventArgs> mouse_up_event_;
- Event<platform::native::NativeKeyEventArgs> key_down_event_;
- Event<platform::native::NativeKeyEventArgs> key_up_event_;
+ Event<platform::gui::NativeMouseButtonEventArgs> mouse_down_event_;
+ Event<platform::gui::NativeMouseButtonEventArgs> mouse_up_event_;
+ Event<platform::gui::NativeKeyEventArgs> key_down_event_;
+ Event<platform::gui::NativeKeyEventArgs> key_up_event_;
Event<WindowNativeMessageEventArgs&> native_message_event_;
};
-
-class WinNativeWindowResolver : public WinNativeResource,
- public virtual INativeWindowResolver {
- friend WinNativeWindow::~WinNativeWindow();
-
- public:
- WinNativeWindowResolver(WinNativeWindow* window) : window_(window) {}
-
- CRU_DELETE_COPY(WinNativeWindowResolver)
- CRU_DELETE_MOVE(WinNativeWindowResolver)
-
- ~WinNativeWindowResolver() override = default;
-
- public:
- INativeWindow* Resolve() override { return window_; }
-
- private:
- void Reset();
-
- private:
- WinNativeWindow* window_;
-};
-
-WinNativeWindow* Resolve(gsl::not_null<INativeWindowResolver*> resolver);
-} // namespace cru::platform::native::win
+} // namespace cru::platform::gui::win
diff --git a/include/cru/win/native/WindowClass.hpp b/include/cru/win/gui/WindowClass.hpp
index fdd55065..2c07b68f 100644
--- a/include/cru/win/native/WindowClass.hpp
+++ b/include/cru/win/gui/WindowClass.hpp
@@ -3,7 +3,7 @@
#include <string>
-namespace cru::platform::native::win {
+namespace cru::platform::gui::win {
class WindowClass : public Object {
public:
WindowClass(std::wstring name, WNDPROC window_proc, HINSTANCE h_instance);
@@ -21,4 +21,4 @@ class WindowClass : public Object {
std::wstring name_;
ATOM atom_;
};
-} // namespace cru::platform::native::win
+} // namespace cru::platform::gui::win
diff --git a/include/cru/win/native/WindowNativeMessageEventArgs.hpp b/include/cru/win/gui/WindowNativeMessageEventArgs.hpp
index 84a7a123..834ba3c2 100644
--- a/include/cru/win/native/WindowNativeMessageEventArgs.hpp
+++ b/include/cru/win/gui/WindowNativeMessageEventArgs.hpp
@@ -3,7 +3,7 @@
#include "cru/common/Base.hpp"
-namespace cru::platform::native::win {
+namespace cru::platform::gui::win {
struct WindowNativeMessage {
HWND hwnd;
UINT msg;
@@ -37,4 +37,4 @@ class WindowNativeMessageEventArgs : public Object {
LRESULT result_;
bool handled_ = false;
};
-} // namespace cru::platform::native::win
+} // namespace cru::platform::gui::win
diff --git a/include/cru/win/native/Keyboard.hpp b/include/cru/win/native/Keyboard.hpp
deleted file mode 100644
index 790e0015..00000000
--- a/include/cru/win/native/Keyboard.hpp
+++ /dev/null
@@ -1,9 +0,0 @@
-#pragma once
-#include "Base.hpp"
-
-#include "cru/platform/native/Keyboard.hpp"
-
-namespace cru::platform::native::win {
-KeyCode VirtualKeyToKeyCode(int virtual_key);
-KeyModifier RetrieveKeyMofifier();
-} // namespace cru::platform::native::win
diff --git a/include/cru/win/native/WindowRenderTarget.hpp b/include/cru/win/native/WindowRenderTarget.hpp
deleted file mode 100644
index 83ac1e03..00000000
--- a/include/cru/win/native/WindowRenderTarget.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-#pragma once
-#include "Base.hpp"
-
-namespace cru::platform::graph::win::direct {
-class DirectGraphFactory;
-}
-
-namespace cru::platform::native::win {
-// Represents a window render target.
-class WindowRenderTarget : public Object {
- public:
- WindowRenderTarget(graph::win::direct::DirectGraphFactory* factory,
- HWND hwnd);
-
- CRU_DELETE_COPY(WindowRenderTarget)
- CRU_DELETE_MOVE(WindowRenderTarget)
-
- ~WindowRenderTarget() override = default;
-
- public:
- graph::win::direct::DirectGraphFactory* GetDirectFactory() const {
- return factory_;
- }
-
- ID2D1DeviceContext* GetD2D1DeviceContext() {
- return d2d1_device_context_.Get();
- }
-
- // Resize the underlying buffer.
- void ResizeBuffer(int width, int height);
-
- // Set this render target as the d2d device context's target.
- void SetAsTarget();
-
- // Present the data of the underlying buffer to the window.
- void Present();
-
- private:
- void CreateTargetBitmap();
-
- private:
- graph::win::direct::DirectGraphFactory* factory_;
- Microsoft::WRL::ComPtr<ID2D1DeviceContext> d2d1_device_context_;
- Microsoft::WRL::ComPtr<IDXGISwapChain1> dxgi_swap_chain_;
- Microsoft::WRL::ComPtr<ID2D1Bitmap1> target_bitmap_;
-};
-} // namespace cru::platform::native::win