| [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] | 18 | typedef 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] | 33 | typedef 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] | 50 | namespace i3 {
|
|---|
| 51 | extern 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] | 60 | extern 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 | }
|
|---|