root/lang/objective-cplusplus/i3/trunk/src/os-windows/WindowsCommon.h @ 35906

Revision 35906, 5.8 kB (checked in by saturday06, 4 years ago)

jiojoijoijoi

RevLine 
[16150]1#pragma once
2
[23158]3#ifndef _ALLOCA_S_THRESHOLD
4#define _ALLOCA_S_THRESHOLD 1024
5#endif
6
[35906]7#ifdef _MSC_VER
[33996]8
[35906]9#define I3_WINDOWS_SEH_TRY __try
10#define I3_WINDOWS_SEH_EXCEPT(x) __except(x)
11
12#elif defined(__GNUC__)
13
14#define I3_WINDOWS_SEH_TRY
15#define I3_WINDOWS_SEH_EXCEPT(x) if (false)
16
[33996]17#define MSFTEDIT_CLASS TEXT("RichEdit50W")
[34447]18typedef struct _MARGINS {
[33996]19    int cxLeftWidth;      // width of left border that retains its size
20    int cxRightWidth;     // width of right border that retains its size
21    int cyTopHeight;      // height of top border that retains its size
22    int cyBottomHeight;   // height of bottom border that retains its size
23} MARGINS, *PMARGINS;
24
[34022]25#endif
26
27#if defined(__GNUC__) || defined(_WIN32_WCE)
[33996]28// Blur behind data structures
29#define DWM_BB_ENABLE                 0x00000001  // fEnable has been specified
30#define DWM_BB_BLURREGION             0x00000002  // hRgnBlur has been specified
31#define DWM_BB_TRANSITIONONMAXIMIZED  0x00000004  // fTransitionOnMaximized has been specified
32
[34447]33typedef struct _DWM_BLURBEHIND {
[33996]34    DWORD dwFlags;
35    BOOL fEnable;
36    HRGN hRgnBlur;
37    BOOL fTransitionOnMaximized;
38} DWM_BLURBEHIND, *PDWM_BLURBEHIND;
39
40#define ULW_EX_NORESIZE         0x00000008
41
42#endif
43
[34022]44#ifdef _WIN32_WCE
[34165]45#ifndef SWP_NOREDRAW
[34022]46#define SWP_NOREDRAW 0
47#endif
[34165]48#endif
[34022]49
[34447]50namespace i3 {
51extern struct dll_ {
[35836]52    BOOL (WINAPI *dll_SetLayeredWindowAttributes)(COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
[33996]53
[35836]54    bool have_dwmapi_dll;
55    HRESULT (WINAPI *dll_DwmExtendFrameIntoClientArea)(HWND hWnd, const MARGINS *pMarInset);
56    HRESULT (WINAPI *dll_DwmIsCompositionEnabled)(BOOL *pfEnabled);
57    HRESULT (WINAPI *dll_DwmEnableBlurBehindWindow)(HWND hWnd, const DWM_BLURBEHIND *pBlurBehind);
58    HRESULT (WINAPI *dll_DwmGetColorizationColor)(DWORD *pcrColorization, BOOL *pfOpaqueBlend);
59} dll;
[34012]60extern HINSTANCE hInstance;
[33996]61
62}
[35906]63
64#define UTF8_TO_UTF16LE_ALLOCA(data8, data16)                           \
65    wchar_t* data16 = NULL;                                             \
66    for (;;) {                                                          \
67        const char* check = data8; check;                               \
68        unsigned int num_elements =                                     \
69            MultiByteToWideChar(CP_UTF8, 0, data8, -1, NULL, 0);        \
70        if (num_elements == 0) {                                        \
71            break;                                                      \
72        }                                                               \
73        const size_t data16_bytes = num_elements*sizeof(wchar_t);       \
74        if (data16_bytes > _ALLOCA_S_THRESHOLD) {                       \
75            data16 = NULL;                                              \
76            break;                                                      \
77        }                                                               \
78        I3_WINDOWS_SEH_TRY {                                            \
79            data16 = (wchar_t*)alloca(data16_bytes);                    \
80        }  I3_WINDOWS_SEH_EXCEPT                                        \
81               (GetExceptionCode() == STATUS_STACK_OVERFLOW ?           \
82                EXCEPTION_EXECUTE_HANDLER :                             \
83                EXCEPTION_CONTINUE_SEARCH) {                            \
84            data16 = NULL;                                              \
85            break;                                                      \
86        }                                                               \
87        if (0 == MultiByteToWideChar(                                   \
88                CP_UTF8, 0, data8, -1, data16, num_elements)) {         \
89            data16 = NULL;                                              \
90            break;                                                      \
91        }                                                               \
92        break;                                                          \
93    }
94
95#define UTF16LE_TO_UTF8_ALLOCA(data16, data8)                           \
96    char* data8 = NULL;                                                 \
97    for (;;) {                                                          \
98        const wchar_t* check = data16; check;                           \
99        unsigned int num_elements = WideCharToMultiByte(                \
100            CP_UTF8, 0, data16, -1, NULL, 0, 0, 0);                     \
101        if (num_elements == 0 || num_elements > _ALLOCA_S_THRESHOLD) {  \
102            break;                                                      \
103        }                                                               \
104        I3_WINDOWS_SEH_TRY {                                            \
105            data8 = (char*)alloca(num_elements*sizeof(char));           \
106        } I3_WINDOWS_SEH_EXCEPT                                         \
107              (GetExceptionCode() == STATUS_STACK_OVERFLOW ?            \
108               EXCEPTION_EXECUTE_HANDLER :                              \
109               EXCEPTION_CONTINUE_SEARCH) {                             \
110            data8 = NULL;                                               \
111            break;                                                      \
112        }                                                               \
113        if (0 == WideCharToMultiByte(                                   \
114                CP_UTF8, 0, data16, -1, data8, num_elements, 0, 0)) {   \
115            data8 = NULL;                                               \
116            break;                                                      \
117        }                                                               \
118        break;                                                          \
119    }
Note: See TracBrowser for help on using the browser.