Refactor new editor boundaries and test ownership
This commit is contained in:
104
new_editor/app/Platform/Win32/Win32SystemInteractionHost.cpp
Normal file
104
new_editor/app/Platform/Win32/Win32SystemInteractionHost.cpp
Normal file
@@ -0,0 +1,104 @@
|
||||
#include "Platform/Win32/Win32SystemInteractionHost.h"
|
||||
|
||||
#include "Internal/StringEncoding.h"
|
||||
|
||||
#include <windows.h>
|
||||
#include <shellapi.h>
|
||||
|
||||
#include <cstring>
|
||||
|
||||
namespace XCEngine::UI::Editor::Host {
|
||||
|
||||
namespace {
|
||||
|
||||
bool IsPathAvailable(const std::filesystem::path& path) {
|
||||
std::error_code errorCode = {};
|
||||
return !path.empty() &&
|
||||
std::filesystem::exists(path, errorCode) &&
|
||||
!errorCode;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
bool Win32SystemInteractionHost::CopyTextToClipboard(std::string_view text) {
|
||||
if (text.empty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const std::wstring wideText =
|
||||
App::Internal::Utf8ToWide(std::string(text));
|
||||
const std::size_t byteCount =
|
||||
(wideText.size() + 1u) * sizeof(wchar_t);
|
||||
if (!OpenClipboard(nullptr)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct ClipboardCloser final {
|
||||
~ClipboardCloser() {
|
||||
CloseClipboard();
|
||||
}
|
||||
} clipboardCloser = {};
|
||||
|
||||
if (!EmptyClipboard()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
HGLOBAL handle = GlobalAlloc(GMEM_MOVEABLE, byteCount);
|
||||
if (handle == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void* locked = GlobalLock(handle);
|
||||
if (locked == nullptr) {
|
||||
GlobalFree(handle);
|
||||
return false;
|
||||
}
|
||||
|
||||
std::memcpy(locked, wideText.c_str(), byteCount);
|
||||
GlobalUnlock(handle);
|
||||
|
||||
if (SetClipboardData(CF_UNICODETEXT, handle) == nullptr) {
|
||||
GlobalFree(handle);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Win32SystemInteractionHost::RevealPathInFileBrowser(
|
||||
const std::filesystem::path& path,
|
||||
bool selectTarget) {
|
||||
if (!IsPathAvailable(path)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const std::filesystem::path targetPath = path.lexically_normal();
|
||||
HINSTANCE result = nullptr;
|
||||
if (selectTarget) {
|
||||
const std::wstring parameters =
|
||||
L"/select,\"" + targetPath.native() + L"\"";
|
||||
const std::wstring workingDirectory =
|
||||
targetPath.parent_path().native();
|
||||
result = ShellExecuteW(
|
||||
nullptr,
|
||||
L"open",
|
||||
L"explorer.exe",
|
||||
parameters.c_str(),
|
||||
workingDirectory.empty() ? nullptr : workingDirectory.c_str(),
|
||||
SW_SHOWNORMAL);
|
||||
} else {
|
||||
const std::wstring workingDirectory =
|
||||
targetPath.parent_path().native();
|
||||
result = ShellExecuteW(
|
||||
nullptr,
|
||||
L"open",
|
||||
targetPath.c_str(),
|
||||
nullptr,
|
||||
workingDirectory.empty() ? nullptr : workingDirectory.c_str(),
|
||||
SW_SHOWNORMAL);
|
||||
}
|
||||
|
||||
return reinterpret_cast<INT_PTR>(result) > 32;
|
||||
}
|
||||
|
||||
} // namespace XCEngine::UI::Editor::Host
|
||||
Reference in New Issue
Block a user