geode/loader/src/platform/windows/util.cpp

109 lines
2.4 KiB
C++
Raw Normal View History

#include <Geode/DefaultInclude.hpp>
2022-07-30 12:24:03 -04:00
#ifdef GEODE_IS_WINDOWS
USE_GEODE_NAMESPACE();
#include "nfdwin.hpp"
#include <ghc/filesystem.hpp>
#include <Windows.h>
#include <iostream>
#include <shlwapi.h>
#include <shobjidl.h>
#include <sstream>
#include <Geode/utils/web.hpp>
2022-07-30 12:24:03 -04:00
bool utils::clipboard::write(std::string const& data) {
2022-10-30 14:56:36 -04:00
if (!OpenClipboard(nullptr)) return false;
2022-07-30 12:24:03 -04:00
if (!EmptyClipboard()) {
CloseClipboard();
return false;
}
HGLOBAL hg = GlobalAlloc(GMEM_MOVEABLE, data.size() + 1);
2022-10-30 14:56:36 -04:00
if (!hg) {
CloseClipboard();
return false;
}
auto dest = GlobalLock(hg);
2022-07-30 12:24:03 -04:00
2022-10-30 14:56:36 -04:00
if (!dest) {
CloseClipboard();
return false;
}
2022-07-30 12:24:03 -04:00
2022-10-30 14:56:36 -04:00
memcpy(dest, data.c_str(), data.size() + 1);
2022-07-30 12:24:03 -04:00
2022-10-30 14:56:36 -04:00
GlobalUnlock(hg);
2022-07-30 12:24:03 -04:00
2022-10-30 14:56:36 -04:00
SetClipboardData(CF_TEXT, hg);
CloseClipboard();
2022-07-30 12:24:03 -04:00
2022-10-30 14:56:36 -04:00
GlobalFree(hg);
2022-07-30 12:24:03 -04:00
return true;
}
std::string utils::clipboard::read() {
2022-10-30 14:56:36 -04:00
if (!OpenClipboard(nullptr)) return "";
2022-07-30 12:24:03 -04:00
HANDLE hData = GetClipboardData(CF_TEXT);
if (hData == nullptr) {
CloseClipboard();
return "";
}
2022-10-30 14:56:36 -04:00
char* pszText = static_cast<char*>(GlobalLock(hData));
2022-07-30 12:24:03 -04:00
if (pszText == nullptr) {
CloseClipboard();
return "";
}
std::string text(pszText);
GlobalUnlock(hData);
CloseClipboard();
return text;
}
bool utils::file::openFolder(ghc::filesystem::path const& path) {
2022-10-30 14:56:36 -04:00
ShellExecuteA(NULL, "open", path.string().c_str(), NULL, NULL, SW_SHOWDEFAULT);
return true;
2022-07-30 12:24:03 -04:00
}
Result<ghc::filesystem::path> utils::file::pickFile(
2022-10-30 14:56:36 -04:00
file::PickMode mode, file::FilePickOptions const& options
) {
#define TURN_INTO_NFDMODE(mode) \
case file::PickMode::mode: nfdMode = NFDMode::mode; break;
NFDMode nfdMode;
switch (mode) {
TURN_INTO_NFDMODE(OpenFile);
TURN_INTO_NFDMODE(SaveFile);
TURN_INTO_NFDMODE(OpenFolder);
default: return Err<std::string>("Unknown open mode");
}
ghc::filesystem::path path;
GEODE_UNWRAP(nfdPick(nfdMode, options, &path));
return Ok(path);
}
Result<std::vector<ghc::filesystem::path>> utils::file::pickFiles(
file::FilePickOptions const& options
) {
std::vector<ghc::filesystem::path> paths;
GEODE_UNWRAP(nfdPick(NFDMode::OpenFolder, options, &paths));
return Ok(paths);
}
void utils::web::openLinkInBrowser(std::string const& url) {
2022-07-30 12:24:03 -04:00
ShellExecuteA(0, 0, url.c_str(), 0, 0, SW_SHOW);
}
#endif