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