xref: /MusicPlayer2/scintilla/win32/PlatWin.h (revision 8af74909132ed5e696cb05b6689ae4baf14c1c96)
1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang /** @file PlatWin.h
3*8af74909SZhong Yang  ** Implementation of platform facilities on Windows.
4*8af74909SZhong Yang  **/
5*8af74909SZhong Yang // Copyright 1998-2011 by Neil Hodgson <[email protected]>
6*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed.
7*8af74909SZhong Yang 
8*8af74909SZhong Yang #ifndef PLATWIN_H
9*8af74909SZhong Yang #define PLATWIN_H
10*8af74909SZhong Yang 
11*8af74909SZhong Yang namespace Scintilla {
12*8af74909SZhong Yang 
13*8af74909SZhong Yang #ifndef USER_DEFAULT_SCREEN_DPI
14*8af74909SZhong Yang #define USER_DEFAULT_SCREEN_DPI		96
15*8af74909SZhong Yang #endif
16*8af74909SZhong Yang 
17*8af74909SZhong Yang extern void Platform_Initialise(void *hInstance) noexcept;
18*8af74909SZhong Yang 
19*8af74909SZhong Yang extern void Platform_Finalise(bool fromDllMain) noexcept;
20*8af74909SZhong Yang 
RectFromPRectangle(PRectangle prc)21*8af74909SZhong Yang constexpr RECT RectFromPRectangle(PRectangle prc) noexcept {
22*8af74909SZhong Yang 	RECT rc = { static_cast<LONG>(prc.left), static_cast<LONG>(prc.top),
23*8af74909SZhong Yang 		static_cast<LONG>(prc.right), static_cast<LONG>(prc.bottom) };
24*8af74909SZhong Yang 	return rc;
25*8af74909SZhong Yang }
26*8af74909SZhong Yang 
POINTFromPoint(Point pt)27*8af74909SZhong Yang constexpr POINT POINTFromPoint(Point pt) noexcept {
28*8af74909SZhong Yang 	return POINT{ static_cast<LONG>(pt.x), static_cast<LONG>(pt.y) };
29*8af74909SZhong Yang }
30*8af74909SZhong Yang 
PointFromPOINT(POINT pt)31*8af74909SZhong Yang constexpr Point PointFromPOINT(POINT pt) noexcept {
32*8af74909SZhong Yang 	return Point::FromInts(pt.x, pt.y);
33*8af74909SZhong Yang }
34*8af74909SZhong Yang 
HwndFromWindowID(WindowID wid)35*8af74909SZhong Yang constexpr HWND HwndFromWindowID(WindowID wid) noexcept {
36*8af74909SZhong Yang 	return static_cast<HWND>(wid);
37*8af74909SZhong Yang }
38*8af74909SZhong Yang 
HwndFromWindow(const Window & w)39*8af74909SZhong Yang inline HWND HwndFromWindow(const Window &w) noexcept {
40*8af74909SZhong Yang 	return HwndFromWindowID(w.GetID());
41*8af74909SZhong Yang }
42*8af74909SZhong Yang 
43*8af74909SZhong Yang void *PointerFromWindow(HWND hWnd) noexcept;
44*8af74909SZhong Yang void SetWindowPointer(HWND hWnd, void *ptr) noexcept;
45*8af74909SZhong Yang 
46*8af74909SZhong Yang /// Find a function in a DLL and convert to a function pointer.
47*8af74909SZhong Yang /// This avoids undefined and conditionally defined behaviour.
48*8af74909SZhong Yang template<typename T>
DLLFunction(HMODULE hModule,LPCSTR lpProcName)49*8af74909SZhong Yang T DLLFunction(HMODULE hModule, LPCSTR lpProcName) noexcept {
50*8af74909SZhong Yang 	if (!hModule) {
51*8af74909SZhong Yang 		return nullptr;
52*8af74909SZhong Yang 	}
53*8af74909SZhong Yang 	FARPROC function = ::GetProcAddress(hModule, lpProcName);
54*8af74909SZhong Yang 	static_assert(sizeof(T) == sizeof(function));
55*8af74909SZhong Yang 	T fp;
56*8af74909SZhong Yang 	memcpy(&fp, &function, sizeof(T));
57*8af74909SZhong Yang 	return fp;
58*8af74909SZhong Yang }
59*8af74909SZhong Yang 
60*8af74909SZhong Yang // Release an IUnknown* and set to nullptr.
61*8af74909SZhong Yang // While IUnknown::Release must be noexcept, it isn't marked as such so produces
62*8af74909SZhong Yang // warnings which are avoided by the catch.
63*8af74909SZhong Yang template <class T>
ReleaseUnknown(T * & ppUnknown)64*8af74909SZhong Yang void ReleaseUnknown(T *&ppUnknown) noexcept {
65*8af74909SZhong Yang 	if (ppUnknown) {
66*8af74909SZhong Yang 		try {
67*8af74909SZhong Yang 			ppUnknown->Release();
68*8af74909SZhong Yang 		}
69*8af74909SZhong Yang 		catch (...) {
70*8af74909SZhong Yang 			// Never occurs
71*8af74909SZhong Yang 		}
72*8af74909SZhong Yang 		ppUnknown = nullptr;
73*8af74909SZhong Yang 	}
74*8af74909SZhong Yang }
75*8af74909SZhong Yang 
76*8af74909SZhong Yang 
77*8af74909SZhong Yang UINT DpiForWindow(WindowID wid) noexcept;
78*8af74909SZhong Yang 
79*8af74909SZhong Yang int SystemMetricsForDpi(int nIndex, UINT dpi) noexcept;
80*8af74909SZhong Yang 
81*8af74909SZhong Yang HCURSOR LoadReverseArrowCursor(UINT dpi) noexcept;
82*8af74909SZhong Yang 
83*8af74909SZhong Yang #if defined(USE_D2D)
84*8af74909SZhong Yang extern bool LoadD2D();
85*8af74909SZhong Yang extern ID2D1Factory *pD2DFactory;
86*8af74909SZhong Yang extern IDWriteFactory *pIDWriteFactory;
87*8af74909SZhong Yang #endif
88*8af74909SZhong Yang 
89*8af74909SZhong Yang }
90*8af74909SZhong Yang 
91*8af74909SZhong Yang #endif
92