diff options
Diffstat (limited to 'c/common.cpp')
-rw-r--r-- | c/common.cpp | 166 |
1 files changed, 0 insertions, 166 deletions
diff --git a/c/common.cpp b/c/common.cpp deleted file mode 100644 index 0a54f69..0000000 --- a/c/common.cpp +++ /dev/null @@ -1,166 +0,0 @@ -#include <utility> -#include <windows.h> - -#include "common.h" - -wchar_ptr::wchar_ptr() noexcept {} - -wchar_ptr::wchar_ptr(wchar_t* const s) noexcept : m_p(s) {} - -wchar_ptr& wchar_ptr::operator=(wchar_t* const s) noexcept -{ - if (m_p != s) { - delete m_p; - m_p = s; - } - return *this; -} - -wchar_ptr::wchar_ptr(wchar_ptr&& other) noexcept : m_p(std::exchange(other.m_p, nullptr)) {} - -wchar_ptr& wchar_ptr::operator=(wchar_ptr&& other) noexcept -{ - std::swap(m_p, other.m_p); - return *this; -} - -wchar_ptr::operator wchar_t*() noexcept -{ - return m_p; -} - -wchar_t* wchar_ptr::release() noexcept -{ - wchar_t* p2 = m_p; - m_p = nullptr; - return p2; -} - -wchar_ptr::~wchar_ptr() noexcept -{ - delete m_p; -} - -wchar_ptr wchar_ptr::from_narrow(const char* const src, const int cp) -{ - int cbMultiByte = strlen(src)+1; - int cchWideChar = MultiByteToWideChar(cp, 0, src, cbMultiByte, NULL, 0); - wchar_t* dst = new wchar_t[cchWideChar]; - if (!MultiByteToWideChar(cp, 0, src, cbMultiByte, dst, cchWideChar)) { - delete dst; - throw Win32Error(); - } - return dst; -} - -wchar_ptr wchar_ptr::copy(const wchar_t* const src) -{ - const int cb = wcslen(src)+1; - wchar_t* dst = new wchar_t[cb]; - memcpy(dst, src, cb*sizeof(wchar_t)); - return dst; -} - -Win32Error::Win32Error() : code(GetLastError()) {} -Win32Error::Win32Error(const DWORD code) : code(code) {} - -Win32Error::~Win32Error() -{ - if (m_szMsg) - HeapFree(GetProcessHeap(), 0, m_szMsg); - if (m_wszMsg) - HeapFree(GetProcessHeap(), 0, m_wszMsg); -} - -const char* Win32Error::what() const noexcept -{ - if (!m_szMsg) - FormatMessageA( - FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - code, - MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), - (char*)&m_szMsg, - 0, NULL); - return m_szMsg; -} - -const wchar_t* Win32Error::What() const noexcept -{ - if (!m_wszMsg) - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - code, - MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), - (wchar_t*)&m_wszMsg, - 0, NULL); - return m_wszMsg; -} - -std::optional<Library> Library::Maybe(const wchar_t* const lib) -{ - HMODULE hModule = LoadLibrary(lib); - if (!hModule) return {}; - return Library(hModule); -} - -Library::Library(const HMODULE hModule) : m_hModule(hModule) {} - -Library::Library(const wchar_t* const lib) -{ - m_hModule = LoadLibrary(lib); - if (!m_hModule) - throw Win32Error(); -} - -Library::~Library() -{ - FreeLibrary(m_hModule); -} - -int EBMessageBox(const wchar_t* const wszText, const wchar_t* const wszCaption, const unsigned uType) -{ - extern HWND g_hWnd; - - auto proc = [](const int nCode, const WPARAM wParam, const LPARAM lParam) noexcept - -> LRESULT CALLBACK - { - if (!g_hWnd || nCode < 0 || nCode != HCBT_ACTIVATE) - return CallNextHookEx(0, nCode, wParam, lParam); - - HWND hWnd = (HWND)wParam; - long lStyle = GetWindowLong(hWnd, GWL_STYLE); - if (!(lStyle & WS_POPUP)) return 0; - - RECT rcMain, rcMsg; - GetWindowRect(g_hWnd, &rcMain); - GetWindowRect(hWnd, &rcMsg); - SetWindowPos(hWnd, NULL, - rcMain.left+(rcMain.right-rcMain.left)/2-(rcMsg.right-rcMsg.left)/2, - rcMain.top+(rcMain.bottom-rcMain.top)/2-(rcMsg.bottom-rcMsg.top)/2, - -1, -1, - SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); - - return 0; - }; - - HHOOK hHook = require(SetWindowsHookEx(WH_CBT, proc, (HINSTANCE)NULL, GetCurrentThreadId())); - int r = MessageBox(g_hWnd, wszText, wszCaption, uType); - require(UnhookWindowsHookEx(hHook)); - return r; -} - -int GetRelativeCursorPos(HWND hWnd, POINT* pt) -{ - RECT rc; - if (!GetClientRect(hWnd, &rc)) return 0; - SetLastError(ERROR_SUCCESS); - if (!MapWindowPoints(hWnd, NULL, (POINT*)&rc, 2)) return 0; - - POINT ptMouse; - if (!GetCursorPos(&ptMouse)) return 0; - pt->x = ptMouse.x-rc.left; - pt->y = ptMouse.y-rc.top; - return 1; -} |