diff --git a/src/os/macosx/macos.mm b/src/os/macosx/macos.mm --- a/src/os/macosx/macos.mm +++ b/src/os/macosx/macos.mm @@ -183,25 +183,21 @@ const char *GetCurrentLocale(const char /** * Return the contents of the clipboard (COCOA). * - * @param buffer Clipboard content. - * @param last The pointer to the last element of the destination buffer - * @return Whether clipboard is empty or not. + * @return The (optional) clipboard contents. */ -bool GetClipboardContents(char *buffer, const char *last) +std::optional GetClipboardContents() { NSPasteboard *pb = [ NSPasteboard generalPasteboard ]; NSArray *types = [ NSArray arrayWithObject:NSPasteboardTypeString ]; NSString *bestType = [ pb availableTypeFromArray:types ]; /* Clipboard has no text data available. */ - if (bestType == nil) return false; + if (bestType == nil) return std::nullopt; NSString *string = [ pb stringForType:NSPasteboardTypeString ]; - if (string == nil || [ string length ] == 0) return false; + if (string == nil || [ string length ] == 0) return std::nullopt; - strecpy(buffer, [ string UTF8String ], last); - - return true; + return [ string UTF8String ]; } /** Set the application's bundle directory. diff --git a/src/os/os2/os2.cpp b/src/os/os2/os2.cpp --- a/src/os/os2/os2.cpp +++ b/src/os/os2/os2.cpp @@ -154,27 +154,25 @@ void ShowOSErrorBox(const char *buf, boo WinTerminate(hab); } -bool GetClipboardContents(char *buffer, const char *last) +std::optional GetClipboardContents() { /* XXX -- Currently no clipboard support implemented with GCC */ #ifndef __INNOTEK_LIBC__ HAB hab = 0; - if (WinOpenClipbrd(hab)) - { - const char *text = (const char*)WinQueryClipbrdData(hab, CF_TEXT); + if (WinOpenClipbrd(hab)) { + const char *text = (const char *)WinQueryClipbrdData(hab, CF_TEXT); - if (text != nullptr) - { - strecpy(buffer, text, last); + if (text != nullptr) { + std::string result = text; WinCloseClipbrd(hab); - return true; + return result; } WinCloseClipbrd(hab); } #endif - return false; + return std::nullopt; } diff --git a/src/os/unix/unix.cpp b/src/os/unix/unix.cpp --- a/src/os/unix/unix.cpp +++ b/src/os/unix/unix.cpp @@ -217,22 +217,20 @@ void ShowOSErrorBox(const char *buf, boo #endif #ifndef WITH_COCOA -bool GetClipboardContents(char *buffer, const char *last) +std::optional GetClipboardContents() { #ifdef WITH_SDL2 - if (SDL_HasClipboardText() == SDL_FALSE) { - return false; - } + if (SDL_HasClipboardText() == SDL_FALSE) return std::nullopt; char *clip = SDL_GetClipboardText(); if (clip != nullptr) { - strecpy(buffer, clip, last); + std::string result = clip; SDL_free(clip); - return true; + return result; } #endif - return false; + return std::nullopt; } #endif diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -433,26 +433,19 @@ void DetermineBasePaths(const char *exe) } -bool GetClipboardContents(char *buffer, const char *last) +std::optional GetClipboardContents() { - HGLOBAL cbuf; - const char *ptr; + if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) return std::nullopt; - if (IsClipboardFormatAvailable(CF_UNICODETEXT)) { - OpenClipboard(nullptr); - cbuf = GetClipboardData(CF_UNICODETEXT); + OpenClipboard(nullptr); + HGLOBAL cbuf = GetClipboardData(CF_UNICODETEXT); - ptr = (const char*)GlobalLock(cbuf); - int out_len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)ptr, -1, buffer, (last - buffer) + 1, nullptr, nullptr); - GlobalUnlock(cbuf); - CloseClipboard(); + std::string result = FS2OTTD(static_cast(GlobalLock(cbuf))); + GlobalUnlock(cbuf); + CloseClipboard(); - if (out_len == 0) return false; - } else { - return false; - } - - return true; + if (result.empty()) return std::nullopt; + return result; } diff --git a/src/textbuf.cpp b/src/textbuf.cpp --- a/src/textbuf.cpp +++ b/src/textbuf.cpp @@ -23,11 +23,9 @@ * Try to retrieve the current clipboard contents. * * @note OS-specific function. - * @param buffer Clipboard content. - * @param last The pointer to the last element of the destination buffer - * @return True if some text could be retrieved. + * @return The (optional) clipboard contents. */ -bool GetClipboardContents(char *buffer, const char *last); +std::optional GetClipboardContents(); int _caret_timer; @@ -223,11 +221,10 @@ bool Textbuf::InsertString(const char *s */ bool Textbuf::InsertClipboard() { - char utf8_buf[512]; + auto contents = GetClipboardContents(); + if (!contents.has_value()) return false; - if (!GetClipboardContents(utf8_buf, lastof(utf8_buf))) return false; - - return this->InsertString(utf8_buf, false); + return this->InsertString(contents.value().c_str(), false); } /**