1
1
/*
2
- Copyright (C) 2020-2022 oZone
2
+ Copyright (C) 2020-2025 oZone10
3
3
This program is free software: you can redistribute it and/or modify
4
4
it under the terms of the GNU General Public License as published by
5
5
the Free Software Foundation, either version 3 of the License, or
@@ -24,11 +24,11 @@ const wchar_t sectionName[] = L"DarkNpp";
24
24
25
25
static bool enableDark = false ;
26
26
27
- int micaType = 0 ;
27
+ static int micaType = 0 ;
28
28
29
29
constexpr int menuItemEnableDark = 0 ;
30
30
constexpr int menuItemMica = menuItemEnableDark + 3 ;
31
- constexpr int menuItemAbout = menuItemMica + 5 ;
31
+ constexpr int menuItemAbout = menuItemMica + 7 ;
32
32
33
33
constexpr size_t classNameLenght = 64 ;
34
34
@@ -42,14 +42,16 @@ void PluginInit()
42
42
43
43
void CommandMenuInit ()
44
44
{
45
- funcItem[menuItemEnableDark] = { L" Enable Dark Mode" , DarkCheckTag, 0 , enableDark, nullptr };
45
+ funcItem[menuItemEnableDark + 0 ] = { L" Enable Dark Mode" , DarkCheckTag, 0 , enableDark, nullptr };
46
46
funcItem[menuItemEnableDark + 1 ] = { L" Refresh Dark Mode" , SetDarkNpp, 0 , false , nullptr };
47
47
funcItem[menuItemEnableDark + 2 ] = { L" ---" , nullptr , 0 , false , nullptr };
48
- funcItem[menuItemMica] = { L" None" , SetMicaTagNone, 0 , micaType == 0 , nullptr };
49
- funcItem[menuItemMica + 1 ] = { L" Mica" , SetMicaTagMica, 0 , micaType == 2 , nullptr };
50
- funcItem[menuItemMica + 2 ] = { L" Acrylic" , SetMicaTagAcrylic, 0 , micaType == 3 , nullptr };
51
- funcItem[menuItemMica + 3 ] = { L" Tabbed" , SetMicaTagTabbed, 0 , micaType == 4 , nullptr };
52
- funcItem[menuItemMica + 4 ] = { L" ---" , nullptr , 0 , false , nullptr };
48
+ funcItem[menuItemMica + 0 ] = { L" Auto" , SetMicaTagAuto, 0 , micaType == 0 , nullptr };
49
+ funcItem[menuItemMica + 1 ] = { L" None" , SetMicaTagNone, 0 , micaType == 1 , nullptr };
50
+ funcItem[menuItemMica + 2 ] = { L" Mica" , SetMicaTagMica, 0 , micaType == 2 , nullptr };
51
+ funcItem[menuItemMica + 3 ] = { L" Mica Acrylic" , SetMicaTagAcrylic, 0 , micaType == 3 , nullptr };
52
+ funcItem[menuItemMica + 4 ] = { L" Mica Alternative" , SetMicaTagTabbed, 0 , micaType == 4 , nullptr };
53
+ funcItem[menuItemMica + 5 ] = { L" Acrylic" , SetTagAcrylic, 0 , micaType == 5 , nullptr };
54
+ funcItem[menuItemMica + 6 ] = { L" ---" , nullptr , 0 , false , nullptr };
53
55
funcItem[menuItemAbout] = { L" &About..." , About, 0 , false , nullptr };
54
56
}
55
57
@@ -67,11 +69,10 @@ void SavePluginParams()
67
69
{
68
70
funcItem[menuItemEnableDark]._init2Check = enableDark;
69
71
::WritePrivateProfileString (sectionName, L" useDark" , enableDark ? L" 1" : L" 0" , iniFilePath);
70
-
71
- funcItem[menuItemMica]._init2Check = (micaType == 0 );
72
- funcItem[menuItemMica + 1 ]._init2Check = (micaType == 2 );
73
- funcItem[menuItemMica + 2 ]._init2Check = (micaType == 3 );
74
- funcItem[menuItemMica + 3 ]._init2Check = (micaType == 4 );
72
+ for (int i = 0 ; i < 6 ; i++)
73
+ {
74
+ funcItem[menuItemMica + i]._init2Check = (micaType == i);
75
+ }
75
76
::WritePrivateProfileString (sectionName, L" micaType" , std::to_wstring(micaType).c_str(), iniFilePath);
76
77
}
77
78
@@ -83,12 +84,18 @@ void DarkCheckTag()
83
84
SavePluginParams ();
84
85
}
85
86
86
- void SetMicaTagNone ()
87
+ void SetMicaTagAuto ()
87
88
{
88
89
micaType = 0 ;
89
90
MicaCheckTag ();
90
91
}
91
92
93
+ void SetMicaTagNone ()
94
+ {
95
+ micaType = 1 ;
96
+ MicaCheckTag ();
97
+ }
98
+
92
99
void SetMicaTagMica ()
93
100
{
94
101
micaType = 2 ;
@@ -107,12 +114,21 @@ void SetMicaTagTabbed()
107
114
MicaCheckTag ();
108
115
}
109
116
117
+ void SetTagAcrylic ()
118
+ {
119
+ micaType = 5 ;
120
+ MicaCheckTag ();
121
+ }
122
+
110
123
void MicaCheckTag ()
111
124
{
112
- ::CheckMenuItem (::GetMenu(nppData._nppHandle), funcItem[menuItemMica]._cmdID, MF_BYCOMMAND | (micaType == 0 ? MF_CHECKED : MF_UNCHECKED));
113
- ::CheckMenuItem (::GetMenu(nppData._nppHandle), funcItem[menuItemMica + 1]._cmdID, MF_BYCOMMAND | (micaType == 2 ? MF_CHECKED : MF_UNCHECKED));
114
- ::CheckMenuItem (::GetMenu(nppData._nppHandle), funcItem[menuItemMica + 2]._cmdID, MF_BYCOMMAND | (micaType == 3 ? MF_CHECKED : MF_UNCHECKED));
115
- ::CheckMenuItem (::GetMenu(nppData._nppHandle), funcItem[menuItemMica + 3]._cmdID, MF_BYCOMMAND | (micaType == 4 ? MF_CHECKED : MF_UNCHECKED));
125
+ const auto hMenu = ::GetMenu (nppData._nppHandle );
126
+
127
+ for (int i = 0 ; i < 6 ; i++)
128
+ {
129
+ ::CheckMenuItem (hMenu, funcItem[menuItemMica + i]._cmdID, MF_BYCOMMAND | (micaType == i ? MF_CHECKED : MF_UNCHECKED));
130
+ }
131
+
116
132
SetMicaNpp ();
117
133
SavePluginParams ();
118
134
}
@@ -123,7 +139,7 @@ void About()
123
139
NULL ,
124
140
L" This is Dark mode & Mica effects Notepad++ test.\n "
125
141
L" Plugin is using undocumented WINAPI.\n "
126
- L" @2020-2022 by oZone " ,
142
+ L" @2020-2025 by oZone10 " ,
127
143
L" About" ,
128
144
MB_OK);
129
145
}
@@ -145,7 +161,7 @@ bool IsAtLeastWin10Build(DWORD buildNumber)
145
161
146
162
void SetMode (HMODULE hUxtheme)
147
163
{
148
- const auto ord135 = GetProcAddress (hUxtheme, MAKEINTRESOURCEA (135 ));
164
+ const auto ord135 = :: GetProcAddress (hUxtheme, MAKEINTRESOURCEA (135 ));
149
165
150
166
if (IsAtLeastWin10Build (VER_1903))
151
167
{
@@ -173,7 +189,7 @@ void SetMode(HMODULE hUxtheme)
173
189
174
190
void SetTheme (HWND hWnd)
175
191
{
176
- const auto hUxtheme = LoadLibraryEx (L" uxtheme.dll" , nullptr , LOAD_LIBRARY_SEARCH_USER_DIRS | LOAD_LIBRARY_SEARCH_SYSTEM32);
192
+ const auto hUxtheme = LoadLibraryEx (L" uxtheme.dll" , nullptr , LOAD_LIBRARY_SEARCH_SYSTEM32);
177
193
178
194
if (hUxtheme == nullptr )
179
195
{
@@ -203,15 +219,12 @@ void SetTitleBar(HWND hWnd)
203
219
if (IsAtLeastWin10Build (BUILD_WIN11))
204
220
{
205
221
::DwmSetWindowAttribute (hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &dark, sizeof (dark));
206
- return ;
207
222
}
208
-
209
- if (IsAtLeastWin10Build (VER_1903))
223
+ else if (IsAtLeastWin10Build (VER_1903))
210
224
{
211
- const auto hUser32 = ::LoadLibraryEx (L" user32.dll" , nullptr , LOAD_LIBRARY_SEARCH_USER_DIRS | LOAD_LIBRARY_SEARCH_SYSTEM32);
225
+ const auto hUser32 = ::LoadLibraryEx (L" user32.dll" , nullptr , LOAD_LIBRARY_SEARCH_SYSTEM32);
212
226
if (hUser32)
213
227
{
214
- using SWCA = bool (WINAPI*)(HWND hWnd, WINDOWCOMPOSITIONATTRIBDATA* wcaData);
215
228
const auto _SetWindowCompositionAttribute = reinterpret_cast <SWCA>(::GetProcAddress (hUser32, " SetWindowCompositionAttribute" ));
216
229
217
230
if (_SetWindowCompositionAttribute != nullptr )
@@ -228,8 +241,10 @@ void SetTitleBar(HWND hWnd)
228
241
::FreeLibrary (hUser32);
229
242
}
230
243
}
231
-
232
- ::SetProp (hWnd, L" UseImmersiveDarkModeColors" , reinterpret_cast <HANDLE>(static_cast <INT_PTR>(dark)));
244
+ else if (IsAtLeastWin10Build (VER_1809))
245
+ {
246
+ ::SetProp (hWnd, L" UseImmersiveDarkModeColors" , reinterpret_cast <HANDLE>(static_cast <INT_PTR>(dark)));
247
+ }
233
248
}
234
249
235
250
void SetTooltips (HWND hWnd)
@@ -295,7 +310,7 @@ BOOL CALLBACK ScrollBarChildProc(HWND hWnd, LPARAM lparam)
295
310
const auto dwStyle = ::GetWindowLongPtr (hWnd, GWL_STYLE);
296
311
if ((dwStyle & (WS_CHILD | WS_VSCROLL)) > 0x0L )
297
312
{
298
- WCHAR className[classNameLenght] = { ' \0 ' };
313
+ wchar_t className[classNameLenght] = { ' \0 ' };
299
314
if (GetClassName (hWnd, className, classNameLenght) > 0 )
300
315
{
301
316
if ((wcscmp (className, WC_TREEVIEW) == 0 ) ||
@@ -313,58 +328,74 @@ BOOL CALLBACK ScrollBarChildProc(HWND hWnd, LPARAM lparam)
313
328
314
329
void SetMica (HWND hWnd)
315
330
{
316
- if (IsAtLeastWin10Build (BUILD_22H2 ))
331
+ if (IsAtLeastWin10Build (WIN10_22H2 ))
317
332
{
318
- auto mica = DWMSBT_NONE;
319
- switch (micaType)
320
- {
321
- case 1 :
333
+ const auto hUser32 = ::LoadLibraryEx (L" user32.dll" , nullptr , LOAD_LIBRARY_SEARCH_SYSTEM32);
334
+ if (hUser32)
322
335
{
323
- mica = DWMSBT_AUTO;
324
- }
325
- break ;
336
+ const auto _SetWindowCompositionAttribute = reinterpret_cast <SWCA>(::GetProcAddress (hUser32, " SetWindowCompositionAttribute" ));
326
337
327
- case 2 :
328
- {
329
- mica = DWMSBT_MAINWINDOW;
338
+ if (_SetWindowCompositionAttribute != nullptr )
339
+ {
340
+ ACCENTPOLICY policy = { (micaType == 5 ) ? ACCENT_ENABLE_ACRYLICBLURBEHIND : ACCENT_DISABLED, 2 , 0x01101010 , 0 };
341
+ WINDOWCOMPOSITIONATTRIBDATA data = { WCA_ACCENT_POLICY, &policy, sizeof (ACCENTPOLICY) };
342
+ _SetWindowCompositionAttribute (hWnd, &data);
343
+ }
344
+ ::FreeLibrary (hUser32);
330
345
}
331
- break ;
346
+ }
332
347
333
- case 3 :
334
- {
335
- mica = DWMSBT_TRANSIENTWINDOW;
336
- }
337
- break ;
348
+ constexpr MARGINS marginsExtended = { -1 };
349
+ constexpr MARGINS marginsReset{};
338
350
339
- case 4 :
351
+ if (IsAtLeastWin10Build (BUILD_22H2))
352
+ {
353
+ auto mica = DWMSBT_AUTO;
354
+ switch (micaType)
340
355
{
341
- mica = DWMSBT_TABBEDWINDOW;
342
- }
343
- break ;
356
+ case 1 :
357
+ {
358
+ mica = DWMSBT_NONE;
359
+ }
360
+ break ;
344
361
345
- default :
346
- {
347
- mica = DWMSBT_NONE ;
348
- }
349
- }
362
+ case 2 :
363
+ {
364
+ mica = DWMSBT_MAINWINDOW ;
365
+ }
366
+ break ;
350
367
351
- if (mica != DWMSBT_NONE)
352
- {
353
- constexpr MARGINS margins = { -1 };
354
- ::DwmExtendFrameIntoClientArea (hWnd, &margins);
368
+ case 3 :
369
+ {
370
+ mica = DWMSBT_TRANSIENTWINDOW;
371
+ }
372
+ break ;
373
+
374
+ case 4 :
375
+ {
376
+ mica = DWMSBT_TABBEDWINDOW;
377
+ }
378
+ break ;
379
+
380
+ default :
381
+ {
382
+ mica = DWMSBT_AUTO;
383
+ }
355
384
}
385
+
386
+ ::DwmExtendFrameIntoClientArea (hWnd, (mica != DWMSBT_AUTO) ? &marginsExtended : &marginsReset);
356
387
::DwmSetWindowAttribute (hWnd, DWMWA_SYSTEMBACKDROP_TYPE, &mica, sizeof (mica));
357
388
}
358
389
else if (IsAtLeastWin10Build (BUILD_WIN11))
359
390
{
360
391
const BOOL useMica = (micaType == 0 );
361
- if (micaType != 0 )
362
- {
363
- constexpr MARGINS margins = { -1 };
364
- ::DwmExtendFrameIntoClientArea (hWnd, &margins);
365
- }
392
+ ::DwmExtendFrameIntoClientArea (hWnd, (micaType != 0 ) ? &marginsExtended : &marginsReset);
366
393
::DwmSetWindowAttribute (hWnd, DWMWA_MICA_EFFECT, &useMica, sizeof (useMica));
367
394
}
395
+ else
396
+ {
397
+ ::DwmExtendFrameIntoClientArea (hWnd, &marginsReset);
398
+ }
368
399
}
369
400
370
401
void SetDarkNpp ()
@@ -375,6 +406,8 @@ void SetDarkNpp()
375
406
SetTooltips (hwnd);
376
407
377
408
::EnumChildWindows (hwnd, &ScrollBarChildProc, reinterpret_cast <LPARAM>(enableDark ? L" DarkMode_Explorer" : nullptr ));
409
+
410
+ SetMica (hwnd);
378
411
}
379
412
380
413
void SetMicaNpp ()
0 commit comments