aboutsummaryrefslogtreecommitdiff
path: root/src/osx
diff options
context:
space:
mode:
Diffstat (limited to 'src/osx')
-rw-r--r--src/osx/Convert.cpp4
-rw-r--r--src/osx/graphics/quartz/Font.cpp3
-rw-r--r--src/osx/graphics/quartz/TextLayout.cpp3
-rw-r--r--src/osx/gui/UiApplication.mm26
-rw-r--r--src/osx/gui/Window.mm2
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() {