diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-08-16 19:24:11 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-08-16 19:24:11 +0800 |
commit | 600307d3d0133accc3aaceed694e897ad48cd584 (patch) | |
tree | 21296dcabd1868872b0e2ab06c17ce1d6cbf1df3 /src | |
parent | d868d7b0d463ede80b761f87f10d4e25f52989c3 (diff) | |
download | cru-600307d3d0133accc3aaceed694e897ad48cd584.tar.gz cru-600307d3d0133accc3aaceed694e897ad48cd584.tar.bz2 cru-600307d3d0133accc3aaceed694e897ad48cd584.zip |
Move Core Foundation string out of cru String. Still error.
Diffstat (limited to 'src')
-rw-r--r-- | src/base/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/base/Osx.cpp | 21 | ||||
-rw-r--r-- | src/base/String.cpp | 24 | ||||
-rw-r--r-- | src/platform/graphics/quartz/Font.cpp | 3 | ||||
-rw-r--r-- | src/platform/graphics/quartz/ImageFactory.cpp | 11 | ||||
-rw-r--r-- | src/platform/graphics/quartz/TextLayout.cpp | 3 | ||||
-rw-r--r-- | src/platform/gui/osx/Clipboard.mm | 9 | ||||
-rw-r--r-- | src/platform/gui/osx/Menu.mm | 11 | ||||
-rw-r--r-- | src/platform/gui/osx/UiApplication.mm | 33 | ||||
-rw-r--r-- | src/platform/gui/osx/Window.mm | 13 |
10 files changed, 68 insertions, 61 deletions
diff --git a/src/base/CMakeLists.txt b/src/base/CMakeLists.txt index 1c65e865..00f35772 100644 --- a/src/base/CMakeLists.txt +++ b/src/base/CMakeLists.txt @@ -36,6 +36,7 @@ if (UNIX AND NOT EMSCRIPTEN) endif() if (APPLE) + target_sources(CruBase PRIVATE Osx.cpp) find_library(CORE_FOUNDATION CoreFoundation REQUIRED) target_link_libraries(CruBase PUBLIC ${CORE_FOUNDATION}) endif() diff --git a/src/base/Osx.cpp b/src/base/Osx.cpp new file mode 100644 index 00000000..6b8d0bd9 --- /dev/null +++ b/src/base/Osx.cpp @@ -0,0 +1,21 @@ +#include "cru/base/Osx.h" + +namespace cru { +CFWrapper<CFStringRef> ToCFStringRef(StringView string) { + return CFWrapper<CFStringRef>(CFStringCreateWithBytes( + nullptr, reinterpret_cast<const UInt8*>(string.data()), + string.size() * sizeof(std::uint16_t), kCFStringEncodingUTF16, false)); +} + +String FromCFStringRef(CFStringRef string) { + auto length = CFStringGetLength(string); + + String result; + + for (int i = 0; i < length; i++) { + result.AppendCodePoint(CFStringGetCharacterAtIndex(string, i)); + } + + return result; +} +} // namespace cru diff --git a/src/base/String.cpp b/src/base/String.cpp index 40d0b766..e9623201 100644 --- a/src/base/String.cpp +++ b/src/base/String.cpp @@ -673,28 +673,4 @@ String ToUpper(StringView s) { return result; } - -#ifdef CRU_PLATFORM_OSX -CFWrapper<CFStringRef> StringView::ToCFStringRef() const { - return CFWrapper<CFStringRef>(CFStringCreateWithBytes( - nullptr, reinterpret_cast<const UInt8*>(this->data()), - this->size() * sizeof(std::uint16_t), kCFStringEncodingUTF16, false)); -} - -CFWrapper<CFStringRef> String::ToCFStringRef() const { - return StringView(*this).ToCFStringRef(); -} - -String String::FromCFStringRef(CFStringRef string) { - auto length = CFStringGetLength(string); - - String result; - - for (int i = 0; i < length; i++) { - result.AppendCodePoint(CFStringGetCharacterAtIndex(string, i)); - } - - return result; -} -#endif } // namespace cru diff --git a/src/platform/graphics/quartz/Font.cpp b/src/platform/graphics/quartz/Font.cpp index 8821062f..4d03c56e 100644 --- a/src/platform/graphics/quartz/Font.cpp +++ b/src/platform/graphics/quartz/Font.cpp @@ -1,12 +1,13 @@ #include "cru/platform/graphics/quartz/Font.h" +#include "cru/base/Osx.h" #include "cru/platform/graphics/quartz/Resource.h" namespace cru::platform::graphics::quartz { OsxCTFont::OsxCTFont(IGraphicsFactory* graphics_factory, const String& name, float size) : OsxQuartzResource(graphics_factory), name_(name) { - auto n = name.ToCFStringRef(); + auto n = ToCFStringRef(name); if (name.empty()) { ct_font_ = diff --git a/src/platform/graphics/quartz/ImageFactory.cpp b/src/platform/graphics/quartz/ImageFactory.cpp index 1f354155..1fb04132 100644 --- a/src/platform/graphics/quartz/ImageFactory.cpp +++ b/src/platform/graphics/quartz/ImageFactory.cpp @@ -1,9 +1,10 @@ #include "cru/platform/graphics/quartz/ImageFactory.h" #include "cru/base/Exception.h" -#include "cru/platform/graphics/quartz/Convert.h" -#include "cru/platform/graphics/quartz/Image.h" +#include "cru/base/Osx.h" #include "cru/platform/Check.h" #include "cru/platform/graphics/Image.h" +#include "cru/platform/graphics/quartz/Convert.h" +#include "cru/platform/graphics/quartz/Image.h" #include <ImageIO/ImageIO.h> @@ -51,10 +52,10 @@ void QuartzImageFactory::EncodeToStream(IImage* image, io::Stream* stream, auto quartz_image = CheckPlatform<QuartzImage>(image, GetPlatformId()); auto cg_image = quartz_image->GetCGImage(); - auto uti = GetImageFormatUniformTypeIdentifier(format).ToCFStringRef(); + auto uti = ToCFStringRef(GetImageFormatUniformTypeIdentifier(format)); CGDataConsumerRef data_consumer = ConvertStreamToCGDataConsumer(stream); - CGImageDestinationRef destination = - CGImageDestinationCreateWithDataConsumer(data_consumer, uti.ref, 1, nullptr); + CGImageDestinationRef destination = CGImageDestinationCreateWithDataConsumer( + data_consumer, uti.ref, 1, nullptr); CFMutableDictionaryRef properties = CFDictionaryCreateMutable(nullptr, 0, nullptr, nullptr); diff --git a/src/platform/graphics/quartz/TextLayout.cpp b/src/platform/graphics/quartz/TextLayout.cpp index 1d49d6c0..7b3e6da8 100644 --- a/src/platform/graphics/quartz/TextLayout.cpp +++ b/src/platform/graphics/quartz/TextLayout.cpp @@ -1,5 +1,6 @@ #include "cru/platform/graphics/quartz/TextLayout.h" #include "cru/base/Base.h" +#include "cru/base/Osx.h" #include "cru/base/Format.h" #include "cru/platform/graphics/quartz/Convert.h" #include "cru/platform/graphics/quartz/Resource.h" @@ -71,7 +72,7 @@ void OsxCTTextLayout::DoSetText(String text) { } } - auto s = actual_text_.ToCFStringRef(); + auto s = ToCFStringRef(actual_text_); cf_attributed_text_ = CFAttributedStringCreateMutable(nullptr, 0); CFAttributedStringReplaceString(cf_attributed_text_, CFRangeMake(0, 0), s.ref); Ensures(cf_attributed_text_); diff --git a/src/platform/gui/osx/Clipboard.mm b/src/platform/gui/osx/Clipboard.mm index deaaa387..b3469795 100644 --- a/src/platform/gui/osx/Clipboard.mm +++ b/src/platform/gui/osx/Clipboard.mm @@ -1,5 +1,6 @@ -#include "cru/base/log/Logger.h" #include "cru/platform/gui/osx/Clipboard.h" +#include "cru/base/Osx.h" +#include "cru/base/log/Logger.h" #include "ClipboardPrivate.h" @@ -30,15 +31,15 @@ String OsxClipboardPrivate::GetText() { if (result.count == 0) { return u""; } else { - return ::cru::String::FromCFStringRef((CFStringRef)result[0]); + return FromCFStringRef((CFStringRef)result[0]); } } } void OsxClipboardPrivate::SetText(String text) { - auto cf_string = text.ToCFStringRef(); + auto cf_string = ToCFStringRef(text); [pasteboard_ clearContents]; [pasteboard_ writeObjects:@[ (NSString*)cf_string.ref ]]; } -} +} // namespace details } // namespace cru::platform::gui::osx diff --git a/src/platform/gui/osx/Menu.mm b/src/platform/gui/osx/Menu.mm index 848af022..648bc392 100644 --- a/src/platform/gui/osx/Menu.mm +++ b/src/platform/gui/osx/Menu.mm @@ -1,7 +1,8 @@ #include "cru/platform/gui/osx/Menu.h" -#import "MenuPrivate.h" #include "KeyboardPrivate.h" +#import "MenuPrivate.h" +#include "cru/base/Osx.h" #import <AppKit/NSApplication.h> @@ -51,7 +52,7 @@ void OsxMenuPrivate::AttachToNative(NSMenu* native_menu) { items_.push_back(item); } } -} +} // namespace details OsxMenuItem::OsxMenuItem(IUiApplication* ui_application) : OsxGuiResource(ui_application) { p_ = new details::OsxMenuItemPrivate(this); @@ -59,10 +60,10 @@ OsxMenuItem::OsxMenuItem(IUiApplication* ui_application) : OsxGuiResource(ui_app OsxMenuItem::~OsxMenuItem() { delete p_; } -String OsxMenuItem::GetTitle() { return ::cru::String::FromCFStringRef((CFStringRef)[p_->menu_item_ title]); } +String OsxMenuItem::GetTitle() { return FromCFStringRef((CFStringRef)[p_->menu_item_ title]); } void OsxMenuItem::SetTitle(String title) { - auto cf_title = title.ToCFStringRef(); + auto cf_title = ToCFStringRef(title); [p_->menu_item_ setTitle:(NSString*)(cf_title.ref)]; } @@ -160,7 +161,7 @@ void OsxMenu::RemoveItemAt(int index) { p_->menu_ = nullptr; } } -} +} // namespace cru::platform::gui::osx @implementation CruOsxMenuItemClickHandler { cru::platform::gui::osx::details::OsxMenuItemPrivate* p_; diff --git a/src/platform/gui/osx/UiApplication.mm b/src/platform/gui/osx/UiApplication.mm index 32e825e0..2733e8af 100644 --- a/src/platform/gui/osx/UiApplication.mm +++ b/src/platform/gui/osx/UiApplication.mm @@ -1,16 +1,17 @@ #include "cru/platform/gui/osx/UiApplication.h" #include "ClipboardPrivate.h" +#include "cru/base/Osx.h" #include "cru/base/log/Logger.h" +#include "cru/platform/graphics/Factory.h" #include "cru/platform/graphics/quartz/Factory.h" +#include "cru/platform/gui/Base.h" +#include "cru/platform/gui/UiApplication.h" +#include "cru/platform/gui/Window.h" #include "cru/platform/gui/osx/Clipboard.h" #include "cru/platform/gui/osx/Cursor.h" #include "cru/platform/gui/osx/Menu.h" #include "cru/platform/gui/osx/Window.h" -#include "cru/platform/graphics/Factory.h" -#include "cru/platform/gui/Base.h" -#include "cru/platform/gui/UiApplication.h" -#include "cru/platform/gui/Window.h" #include <AppKit/NSApplication.h> #include <Foundation/NSRunLoop.h> @@ -70,7 +71,7 @@ void OsxUiApplicationPrivate::CallQuitHandlers() { handler(); } } -} +} // namespace details OsxUiApplication::OsxUiApplication() : OsxGuiResource(this), p_(new details::OsxUiApplicationPrivate(this)) { @@ -178,15 +179,15 @@ graphics::IGraphicsFactory* OsxUiApplication::GetGraphicsFactory() { std::optional<String> OsxUiApplication::ShowSaveDialog(SaveDialogOptions options) { NSSavePanel* panel = [NSSavePanel savePanel]; - [panel setTitle:(NSString*)options.title.ToCFStringRef().ref]; - [panel setPrompt:(NSString*)options.prompt.ToCFStringRef().ref]; - [panel setMessage:(NSString*)options.message.ToCFStringRef().ref]; + [panel setTitle:(NSString*)ToCFStringRef(options.title).ref]; + [panel setPrompt:(NSString*)ToCFStringRef(options.prompt).ref]; + [panel setMessage:(NSString*)ToCFStringRef(options.message).ref]; NSMutableArray* allowed_content_types = [NSMutableArray array]; for (const auto& file_type : options.allowed_file_types) { [allowed_content_types - addObject:[UTType typeWithFilenameExtension:(NSString*)file_type.ToCFStringRef().ref]]; + addObject:[UTType typeWithFilenameExtension:(NSString*)ToCFStringRef(file_type).ref]]; } [panel setAllowedContentTypes:allowed_content_types]; @@ -194,7 +195,7 @@ std::optional<String> OsxUiApplication::ShowSaveDialog(SaveDialogOptions options auto model_result = [panel runModal]; if (model_result == NSModalResponseOK) { - return ::cru::String::FromCFStringRef((CFStringRef)[[panel URL] path]); + return FromCFStringRef((CFStringRef)[[panel URL] path]); } else { return std::nullopt; } @@ -202,15 +203,15 @@ std::optional<String> OsxUiApplication::ShowSaveDialog(SaveDialogOptions options std::optional<std::vector<String>> OsxUiApplication::ShowOpenDialog(OpenDialogOptions options) { NSOpenPanel* panel = [NSOpenPanel openPanel]; - [panel setTitle:(NSString*)options.title.ToCFStringRef().ref]; - [panel setPrompt:(NSString*)options.prompt.ToCFStringRef().ref]; - [panel setMessage:(NSString*)options.message.ToCFStringRef().ref]; + [panel setTitle:(NSString*)ToCFStringRef(options.title).ref]; + [panel setPrompt:(NSString*)ToCFStringRef(options.prompt).ref]; + [panel setMessage:(NSString*)ToCFStringRef(options.message).ref]; NSMutableArray* allowed_content_types = [NSMutableArray array]; for (const auto& file_type : options.allowed_file_types) { [allowed_content_types - addObject:[UTType typeWithFilenameExtension:(NSString*)file_type.ToCFStringRef().ref]]; + addObject:[UTType typeWithFilenameExtension:(NSString*)ToCFStringRef(file_type).ref]]; } [panel setAllowedContentTypes:allowed_content_types]; @@ -224,7 +225,7 @@ std::optional<std::vector<String>> OsxUiApplication::ShowOpenDialog(OpenDialogOp if (model_result == NSModalResponseOK) { std::vector<String> result; for (NSURL* url in [panel URLs]) { - result.push_back(::cru::String::FromCFStringRef((CFStringRef)[url path])); + result.push_back(FromCFStringRef((CFStringRef)[url path])); } return result; } else { @@ -237,7 +238,7 @@ void OsxUiApplication::UnregisterWindow(OsxWindow* window) { std::remove(p_->windows_.begin(), p_->windows_.end(), static_cast<INativeWindow*>(window)), p_->windows_.cend()); } -} +} // namespace cru::platform::gui::osx @implementation CruAppDelegate { cru::platform::gui::osx::details::OsxUiApplicationPrivate* _p; diff --git a/src/platform/gui/osx/Window.mm b/src/platform/gui/osx/Window.mm index 4e000c48..4279e73e 100644 --- a/src/platform/gui/osx/Window.mm +++ b/src/platform/gui/osx/Window.mm @@ -3,6 +3,7 @@ #include "CursorPrivate.h" #include "InputMethodPrivate.h" +#include "cru/base/Osx.h" #include "cru/base/Range.h" #include "cru/base/log/Logger.h" #include "cru/platform/Check.h" @@ -27,6 +28,8 @@ namespace { constexpr int key_down_debug = 0; } +using ::cru::FromCFStringRef; +using ::cru::ToCFStringRef; using cru::platform::graphics::quartz::Convert; namespace cru::platform::gui::osx { namespace { @@ -185,7 +188,7 @@ void OsxWindowPrivate::CreateWindow() { frame:Rect(Point{}, content_rect_.GetSize())]; [window_ setContentView:content_view]; - [window_ setTitle:(NSString*)title_.ToCFStringRef().ref]; + [window_ setTitle:(NSString*)ToCFStringRef(title_).ref]; draw_layer_ = CreateLayer(Convert(content_rect_.GetSize())); @@ -253,7 +256,7 @@ void OsxWindow::SetTitle(String title) { p_->title_ = title; if (p_->window_) { - [p_->window_ setTitle:(NSString*)title.ToCFStringRef().ref]; + [p_->window_ setTitle:(NSString*)ToCFStringRef(title).ref]; } } @@ -664,7 +667,7 @@ const std::unordered_set<KeyCode> input_context_handle_codes_when_has_text{ s = CFAttributedStringGetString(as); } - auto ss = ::cru::String::FromCFStringRef(s); + auto ss = FromCFStringRef(s); // cru::CRU_LOG_DEBUG(u"CruView", // u"Received setMarkedText string: {}, selected range: ({}, {}), " @@ -684,7 +687,7 @@ const std::unordered_set<KeyCode> input_context_handle_codes_when_has_text{ withAttributedString:[[NSAttributedString alloc] initWithString:(NSString*)s]]; cru::platform::gui::CompositionText composition_text; - composition_text.text = ::cru::String::FromCFStringRef((CFStringRef)[_input_context_text string]); + composition_text.text = FromCFStringRef((CFStringRef)[_input_context_text string]); composition_text.selection.position = ss.IndexFromCodePointToCodeUnit(selectedRange.location); composition_text.selection.count = ss.IndexFromCodePointToCodeUnit(selectedRange.location + selectedRange.length) - @@ -725,7 +728,7 @@ const std::unordered_set<KeyCode> input_context_handle_codes_when_has_text{ _input_context_text = nil; _input_context_p->SetCompositionText(cru::platform::gui::CompositionText()); - auto ss = ::cru::String::FromCFStringRef(s); + auto ss = FromCFStringRef(s); // cru::CRU_LOG_DEBUG(u"CruView", u"Finish composition: {}, replacement range: ({}, {})", ss, // replacementRange.location, replacementRange.length); |