diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/String.cpp | 33 | ||||
-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 |
6 files changed, 52 insertions, 19 deletions
diff --git a/src/common/String.cpp b/src/common/String.cpp index 092ba406..ef5eb176 100644 --- a/src/common/String.cpp +++ b/src/common/String.cpp @@ -17,7 +17,7 @@ String String::FromUtf8(const char* str, Index size) { return FromUtf16(cru::ToUtf16(std::string_view(str, size))); } -std::uint16_t String::kEmptyBuffer[1] = {0}; +char16_t String::kEmptyBuffer[1] = {0}; template <typename C> Index GetStrSize(const C* str) { @@ -28,10 +28,10 @@ Index GetStrSize(const C* str) { return i; } -String::String(const std::uint16_t* str) : String(str, GetStrSize(str)) {} +String::String(const_pointer str) : String(str, GetStrSize(str)) {} -String::String(const std::uint16_t* str, Index size) { - this->buffer_ = new std::uint16_t[size + 1]; +String::String(const_pointer str, Index size) { + this->buffer_ = new value_type[size + 1]; std::memcpy(this->buffer_, str, size * sizeof(char16_t)); this->buffer_[size] = 0; this->size_ = size; @@ -46,7 +46,7 @@ String::String(const wchar_t* str, Index size) String::String(const String& other) { if (other.size_ == 0) return; - this->buffer_ = new std::uint16_t[other.size_ + 1]; + this->buffer_ = new value_type[other.size_ + 1]; std::memcpy(this->buffer_, other.buffer_, other.size_ * sizeof(value_type)); this->buffer_[other.size_] = 0; this->size_ = other.size_; @@ -73,7 +73,7 @@ String& String::operator=(const String& other) { this->size_ = 0; this->capacity_ = 0; } else { - this->buffer_ = new std::uint16_t[other.size_ + 1]; + this->buffer_ = new value_type[other.size_ + 1]; std::memcpy(this->buffer_, other.buffer_, other.size_ * sizeof(value_type)); this->buffer_[other.size_] = 0; @@ -106,8 +106,7 @@ String::~String() { } } -String::String(from_buffer_tag, std::uint16_t* buffer, Index size, - Index capacity) +String::String(from_buffer_tag, pointer buffer, Index size, Index capacity) : buffer_(buffer), size_(size), capacity_(capacity) {} void String::resize(Index new_size) { @@ -120,7 +119,7 @@ void String::resize(Index new_size) { buffer_[size_] = 0; } else { reserve(new_size); - std::memset(buffer_ + size_, 0, sizeof(std::uint16_t) * (new_size - size_)); + std::memset(buffer_ + size_, 0, sizeof(value_type) * (new_size - size_)); buffer_[new_size] = 0; size_ = new_size; } @@ -146,9 +145,9 @@ void String::reserve(Index new_capacity) { Expects(new_capacity >= 0); if (new_capacity <= this->capacity_) return; if (new_capacity > 0) { - std::uint16_t* new_buffer = new std::uint16_t[new_capacity + 1]; + pointer new_buffer = new value_type[new_capacity + 1]; if (this->buffer_ != kEmptyBuffer) { - memcpy(new_buffer, this->buffer_, this->size_ * sizeof(std::uint16_t)); + memcpy(new_buffer, this->buffer_, this->size_ * sizeof(value_type)); delete[] this->buffer_; } new_buffer[this->size_] = 0; @@ -157,11 +156,11 @@ void String::reserve(Index new_capacity) { } } -String::iterator String::insert(const_iterator pos, const std::uint16_t* str, +String::iterator String::insert(const_iterator pos, const_iterator str, Index size) { Expects(pos >= cbegin() && pos <= cend()); - std::vector<std::uint16_t> backup_buffer; + std::vector<value_type> backup_buffer; if (str >= buffer_ && str < buffer_ + size_) { backup_buffer.resize(size); std::copy(str, str + size, backup_buffer.begin()); @@ -201,7 +200,7 @@ String::iterator String::erase(const_iterator start, const_iterator end) { auto s = const_cast<iterator>(start); auto e = const_cast<iterator>(end); - std::memmove(e, s, (cend() - end) * sizeof(std::uint16_t)); + std::memmove(e, s, (cend() - end) * sizeof(value_type)); this->size_ = new_size; this->buffer_[new_size] = 0; @@ -209,7 +208,7 @@ String::iterator String::erase(const_iterator start, const_iterator end) { } std::string String::ToUtf8() const { - return cru::ToUtf8(std::u16string_view(Char16CStr(), size())); + return cru::ToUtf8(std::u16string_view(data(), size())); } Index String::IndexFromCodeUnitToCodePoint(Index code_unit_index) const { @@ -250,7 +249,7 @@ String& String::operator+=(const String& other) { } namespace { -inline int Compare(std::uint16_t left, std::uint16_t right) { +inline int Compare(char16_t left, char16_t right) { if (left < right) return -1; if (left > right) return 1; return 0; @@ -286,7 +285,7 @@ namespace details { std::vector<FormatToken> ParseToFormatTokenList(const String& str) { std::vector<FormatToken> result; - auto push_char = [&result](std::uint16_t c) { + auto push_char = [&result](char16_t c) { if (result.empty() || result.back().type == FormatTokenType::PlaceHolder) { result.push_back(FormatToken{FormatTokenType::Text, String{}}); } 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() { |