Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/helpers/win32_misc.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/helpers/win32_misc.h Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,173 @@ +#pragma once + +#ifdef _WIN32 + + +#include <libPPUI/win32_op.h> +#include <libPPUI/win32_utility.h> + + +class mutexScope { +public: + mutexScope(HANDLE hMutex_, abort_callback & abort); + ~mutexScope(); +private: + PFC_CLASS_NOT_COPYABLE_EX(mutexScope); + HANDLE hMutex; +}; + +#ifdef FOOBAR2000_DESKTOP_WINDOWS + +class registerclass_scope_delayed { +public: + registerclass_scope_delayed() {} + bool is_registered() const {return m_class != 0;} + void toggle_on(UINT p_style,WNDPROC p_wndproc,int p_clsextra,int p_wndextra,HICON p_icon,HCURSOR p_cursor,HBRUSH p_background,const TCHAR * p_classname,const TCHAR * p_menuname); + void toggle_off(); + ATOM get_class() const {return m_class;} + + ~registerclass_scope_delayed() {toggle_off();} +private: + registerclass_scope_delayed(const registerclass_scope_delayed &) = delete; + const registerclass_scope_delayed & operator=(const registerclass_scope_delayed &) = delete; + + ATOM m_class = 0; +}; + + +typedef CGlobalLockScope CGlobalLock; // compatibility + +class OleInitializeScope { +public: + OleInitializeScope(); + ~OleInitializeScope(); + +private: + PFC_CLASS_NOT_COPYABLE_EX(OleInitializeScope); +}; + +class CoInitializeScope { +public: + CoInitializeScope(); + CoInitializeScope(DWORD params); + ~CoInitializeScope(); +private: + PFC_CLASS_NOT_COPYABLE_EX(CoInitializeScope) +}; + +WORD GetOSVersion(); + +#if _WIN32_WINNT >= 0x501 +#define WS_EX_COMPOSITED_Safe() WS_EX_COMPOSITED +#else +static DWORD WS_EX_COMPOSITED_Safe() { + return (GetOSVersion() < 0x501) ? 0 : 0x02000000L; +} +#endif + + +class CModelessDialogEntry { +public: + CModelessDialogEntry() : m_wnd() {} + CModelessDialogEntry(HWND p_wnd) : m_wnd() {Set(p_wnd);} + ~CModelessDialogEntry() {Set(NULL);} + + void Set(HWND p_new); +private: + PFC_CLASS_NOT_COPYABLE_EX(CModelessDialogEntry); + HWND m_wnd; +}; + +class CDLL { +public: +#ifdef _DEBUG + static LPTOP_LEVEL_EXCEPTION_FILTER _GetEH() { + LPTOP_LEVEL_EXCEPTION_FILTER rv = SetUnhandledExceptionFilter(NULL); + SetUnhandledExceptionFilter(rv); + return rv; + } +#endif + CDLL(const wchar_t * Name) : hMod() { + Load(Name); + } + CDLL() : hMod() {} + void Load(const wchar_t * Name) { + PFC_ASSERT( hMod == NULL ); +#ifdef _DEBUG + auto handlerBefore = _GetEH(); +#endif + WIN32_OP( hMod = LoadLibrary(Name) ); +#ifdef _DEBUG + PFC_ASSERT( handlerBefore == _GetEH() ); +#endif + } + + + ~CDLL() { + if (hMod) FreeLibrary(hMod); + } + template<typename funcptr_t> void Bind(funcptr_t & outFunc, const char * name) { + WIN32_OP( outFunc = (funcptr_t)GetProcAddress(hMod, name) ); + } + + HMODULE hMod; + + PFC_CLASS_NOT_COPYABLE_EX(CDLL); +}; + +class winLocalFileScope { +public: + void open(const char * inPath, file::ptr inReader, abort_callback & aborter); + void close(); + + winLocalFileScope() {} + winLocalFileScope(const char * inPath, file::ptr inReader, abort_callback & aborter) : m_isTemp() { + open(inPath, inReader, aborter); + } + + ~winLocalFileScope() { + close(); + } + + const wchar_t * Path() const { return m_path.c_str(); } + bool isTemp() const { return m_isTemp; } +private: + bool m_isTemp = false; + std::wstring m_path; +}; + +#endif // FOOBAR2000_DESKTOP_WINDOWS + + +class CMutex { +public: + CMutex(const TCHAR * name = NULL); + ~CMutex(); + HANDLE Handle() {return m_hMutex;} + static void AcquireByHandle( HANDLE hMutex, abort_callback & aborter ); + void Acquire( abort_callback& aborter ); + void Release(); +private: + CMutex(const CMutex&) = delete; void operator=(const CMutex&) = delete; + HANDLE m_hMutex; +}; + +class CMutexScope { +public: + CMutexScope(CMutex & mutex, DWORD timeOutMS, const char * timeOutBugMsg); + CMutexScope(CMutex & mutex); + CMutexScope(CMutex & mutex, abort_callback & aborter); + ~CMutexScope(); +private: + CMutexScope(const CMutexScope &) = delete; void operator=(const CMutexScope&) = delete; + CMutex & m_mutex; +}; + +bool IsWindowsS(); + +#else + +class OleInitializeScope {}; +class CoInitializeScope {}; + +#endif // _WIN32
