diff options
Diffstat (limited to 'src/osx')
-rw-r--r-- | src/osx/Convert.cpp | 4 | ||||
-rw-r--r-- | src/osx/graphics/quartz/Font.cpp | 3 | ||||
-rw-r--r-- | src/osx/graphics/quartz/TextLayout.cpp | 3 | ||||
-rw-r--r-- | src/osx/gui/UiApplication.mm | 26 | ||||
-rw-r--r-- | src/osx/gui/Window.mm | 2 |
5 files changed, 36 insertions, 2 deletions
diff --git a/src/osx/Convert.cpp b/src/osx/Convert.cpp index 51ebedf4..a237a46f 100644 --- a/src/osx/Convert.cpp +++ b/src/osx/Convert.cpp @@ -1,6 +1,6 @@ #include "cru/osx/Convert.hpp" -namespace cru::cru::platform::osx { +namespace cru::platform::osx { CFStringRef Convert(const String& string) { return CFStringCreateWithBytes( nullptr, reinterpret_cast<const UInt8*>(string.data()), @@ -12,7 +12,7 @@ String Convert(CFStringRef string) { kCFStringEncodingUTF16, 0); auto l = CFDataGetLength(d); - auto s = String(reinterpret_cast<const std::uint16_t*>(CFDataGetBytePtr(d)), + auto s = String(reinterpret_cast<const char16_t*>(CFDataGetBytePtr(d)), CFDataGetLength(d) / 2); CFRelease(d); diff --git a/src/osx/graphics/quartz/Font.cpp b/src/osx/graphics/quartz/Font.cpp index 600f8309..596489e4 100644 --- a/src/osx/graphics/quartz/Font.cpp +++ b/src/osx/graphics/quartz/Font.cpp @@ -1,9 +1,12 @@ #include "cru/osx/graphics/quartz/Font.hpp" +#include "cru/osx/Convert.hpp" #include "cru/osx/graphics/quartz/Convert.hpp" #include "cru/osx/graphics/quartz/Resource.hpp" namespace cru::platform::graphics::osx::quartz { +using cru::platform::osx::Convert; + OsxCTFont::OsxCTFont(IGraphicsFactory* graphics_factory, const String& name, float size) : OsxQuartzResource(graphics_factory) { diff --git a/src/osx/graphics/quartz/TextLayout.cpp b/src/osx/graphics/quartz/TextLayout.cpp index 577eba58..6c6644e5 100644 --- a/src/osx/graphics/quartz/TextLayout.cpp +++ b/src/osx/graphics/quartz/TextLayout.cpp @@ -1,4 +1,5 @@ #include "cru/osx/graphics/quartz/TextLayout.hpp" +#include "cru/osx/Convert.hpp" #include "cru/osx/graphics/quartz/Convert.hpp" #include "cru/osx/graphics/quartz/Resource.hpp" #include "cru/platform/Check.hpp" @@ -7,6 +8,8 @@ #include <limits> namespace cru::platform::graphics::osx::quartz { +using cru::platform::osx::Convert; + OsxCTTextLayout::OsxCTTextLayout(IGraphicsFactory* graphics_factory, std::shared_ptr<OsxCTFont> font, const String& str) diff --git a/src/osx/gui/UiApplication.mm b/src/osx/gui/UiApplication.mm index 2491390f..d2e6fe30 100644 --- a/src/osx/gui/UiApplication.mm +++ b/src/osx/gui/UiApplication.mm @@ -1,13 +1,18 @@ #include "cru/osx/gui/UiApplication.hpp" #include "cru/osx/graphics/quartz/Factory.hpp" +#include "cru/osx/gui/Window.hpp" +#include "cru/platform/gui/UiApplication.hpp" +#include "cru/platform/gui/Window.hpp" #include <AppKit/NSApplication.h> #include <Foundation/NSRunLoop.h> #include <algorithm> +#include <iterator> #include <memory> #include <unordered_map> +#include <vector> @interface AppDelegate : NSObject <NSApplicationDelegate> - (id)init:(cru::platform::gui::osx::details::OsxUiApplicationPrivate*)p; @@ -43,6 +48,8 @@ class OsxUiApplicationPrivate { std::unordered_map<long long, std::function<void()>> next_tick_; std::unordered_map<long long, NSTimer*> timers_; + std::vector<OsxWindow*> windows_; + std::unique_ptr<platform::graphics::osx::quartz::QuartzGraphicsFactory> quartz_graphics_factory_; }; @@ -122,6 +129,25 @@ void OsxUiApplication::CancelTimer(long long id) { p_->timers_.erase(i); } } + +std::vector<INativeWindow*> OsxUiApplication::GetAllWindow() { + std::vector<INativeWindow*> result; + std::transform(p_->windows_.cbegin(), p_->windows_.cend(), std::back_inserter(result), + [](OsxWindow* w) { return static_cast<INativeWindow*>(w); }); + return result; +} + +INativeWindow* OsxUiApplication::CreateWindow(INativeWindow* parent, CreateWindowFlag flags) { + auto window = new OsxWindow(this, parent, !(flags & CreateWindowFlags::NoCaptionAndBorder)); + p_->windows_.push_back(window); + return window; +} + +void OsxUiApplication::UnregisterWindow(OsxWindow* window) { + p_->windows_.erase( + std::remove(p_->windows_.begin(), p_->windows_.end(), static_cast<INativeWindow*>(window)), + p_->windows_.cend()); +} } @implementation AppDelegate diff --git a/src/osx/gui/Window.mm b/src/osx/gui/Window.mm index ff5572f2..c2134c76 100644 --- a/src/osx/gui/Window.mm +++ b/src/osx/gui/Window.mm @@ -92,6 +92,8 @@ OsxWindow::~OsxWindow() { if (p_->window_) { [p_->window_ close]; } + + dynamic_cast<OsxUiApplication*>(GetUiApplication())->UnregisterWindow(this); } void OsxWindow::Close() { |