diff --git a/Versions/build.txt b/Versions/build.txt
index 0cfbf0888..d00491fd7 100644
--- a/Versions/build.txt
+++ b/Versions/build.txt
@@ -1 +1 @@
-2
+1
diff --git a/Versions/day.txt b/Versions/day.txt
index 33a21f83e..7536e3d32 100644
--- a/Versions/day.txt
+++ b/Versions/day.txt
@@ -1 +1 @@
-308
+309
diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf
index 1d36c6d12..0aca7ba58 100644
--- a/res/Notepad3.exe.manifest.conf
+++ b/res/Notepad3.exe.manifest.conf
@@ -3,7 +3,7 @@
Notepad3 RC3
diff --git a/src/Notepad3.c b/src/Notepad3.c
index 82b3de733..b2664f39d 100644
--- a/src/Notepad3.c
+++ b/src/Notepad3.c
@@ -2062,26 +2062,6 @@ LRESULT MsgCreate(HWND hwnd, WPARAM wParam,LPARAM lParam)
}
-//=============================================================================
-//
-// _LoadBitmapFile()
-//
-static HBITMAP _LoadBitmapFile(LPCWSTR path)
-{
- WCHAR szTmp[MAX_PATH];
- if (PathIsRelative(path)) {
- GetModuleFileName(NULL, szTmp, COUNTOF(szTmp));
- PathCchRemoveFileSpec(szTmp, COUNTOF(szTmp));
- PathAppend(szTmp, path);
- path = szTmp;
- }
- if (!PathFileExists(path)) {
- return NULL;
- }
- HBITMAP hbmp = (HBITMAP)LoadImage(NULL, path, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
- return hbmp;
-}
-
//=============================================================================
//
// SelectExternalToolBar() - Select and Load an external Bitmal as ToolBarImage
@@ -2159,6 +2139,84 @@ bool SelectExternalToolBar(HWND hwnd)
}
+//=============================================================================
+//
+// LoadBitmapFile()
+//
+static HBITMAP LoadBitmapFile(LPCWSTR path)
+{
+ WCHAR szTmp[MAX_PATH];
+ if (PathIsRelative(path)) {
+ GetModuleFileName(NULL, szTmp, COUNTOF(szTmp));
+ PathCchRemoveFileSpec(szTmp, COUNTOF(szTmp));
+ PathAppend(szTmp, path);
+ path = szTmp;
+ }
+ if (!PathFileExists(path)) { return NULL; }
+
+ HBITMAP hbmp = (HBITMAP)LoadImage(NULL, path, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
+
+ bool bDimOK = false;
+ int height = 16;
+ int width = height * NUMTOOLBITMAPS;
+
+ if (hbmp) {
+ BITMAP bmp; GetObject(hbmp, sizeof(BITMAP), &bmp);
+ width = bmp.bmWidth;
+ height = bmp.bmHeight;
+ bDimOK = (width >= (height * NUMTOOLBITMAPS));
+ }
+ if (!bDimOK) {
+ InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_ERR_BITMAP, path, (height * NUMTOOLBITMAPS), height, NUMTOOLBITMAPS);
+ if (hbmp) { DeleteObject(hbmp); }
+ hbmp = NULL;
+ }
+ return hbmp;
+}
+
+
+//=============================================================================
+//
+// CreateScaledImageListFromBitmap()
+//
+static HIMAGELIST CreateScaledImageListFromBitmap(HWND hWnd, HBITMAP hBmp)
+{
+ BITMAP bmp;
+ GetObject(hBmp, sizeof(BITMAP), &bmp);
+
+ int const mod = bmp.bmWidth % NUMTOOLBITMAPS;
+ int const cx = (bmp.bmWidth - mod) / NUMTOOLBITMAPS;
+ int const cy = bmp.bmHeight;
+
+ HIMAGELIST himl = ImageList_Create(cx, cy, ILC_COLOR32 | ILC_MASK, 0, 0);
+ ImageList_AddMasked(himl, hBmp, CLR_DEFAULT);
+
+ DPI_T dpi = GetCurrentDPI(hWnd);
+ if ((dpi.x == USER_DEFAULT_SCREEN_DPI) && (dpi.y == USER_DEFAULT_SCREEN_DPI))
+ {
+ return himl; // default DPI, we are done
+ }
+
+ // Scale button icons/images
+ int const scx = ScaleIntToCurrentDPIX(hWnd, cx);
+ int const scy = ScaleIntToCurrentDPIX(hWnd, cy);
+
+ HIMAGELIST hsciml = ImageList_Create(scx, scy, ILC_COLOR32 | ILC_MASK | ILC_HIGHQUALITYSCALE, 0, 0);
+
+ for (int i = 0; i < NUMTOOLBITMAPS; ++i)
+ {
+ HICON const hicon = ImageList_GetIcon(himl, i, ILD_TRANSPARENT | ILD_PRESERVEALPHA | ILD_SCALE);
+ ImageList_AddIcon(hsciml, hicon);
+ DestroyIcon(hicon);
+ }
+
+ ImageList_Destroy(himl);
+
+ return hsciml;
+}
+
+
+
//=============================================================================
//
// CreateBars() - Create Toolbar and Statusbar
@@ -2168,7 +2226,16 @@ void CreateBars(HWND hwnd, HINSTANCE hInstance)
{
DWORD dwToolbarStyle = NP3_WS_TOOLBAR;
- if (Globals.hwndToolbar) { DestroyWindow(Globals.hwndToolbar); }
+ if (Globals.hwndToolbar)
+ {
+ HIMAGELIST himl = (HIMAGELIST)SendMessage(Globals.hwndToolbar, TB_GETIMAGELIST, 0, 0);
+ if (himl) { ImageList_Destroy(himl); }
+ himl = (HIMAGELIST)SendMessage(Globals.hwndToolbar, TB_GETHOTIMAGELIST, 0, 0);
+ if (himl) { ImageList_Destroy(himl); }
+ himl = (HIMAGELIST)SendMessage(Globals.hwndToolbar, TB_GETDISABLEDIMAGELIST, 0, 0);
+ if (himl) { ImageList_Destroy(himl); }
+ DestroyWindow(Globals.hwndToolbar);
+ }
OpenSettingsFile();
bool bDirtyFlag = false;
@@ -2178,28 +2245,19 @@ void CreateBars(HWND hwnd, HINSTANCE hInstance)
SendMessage(Globals.hwndToolbar,TB_BUTTONSTRUCTSIZE,(WPARAM)sizeof(TBBUTTON),0);
+ // -------------------------
// Add Toolbar Bitmap
+ // -------------------------
HBITMAP hbmp = NULL;
HBITMAP hbmpCopy = NULL;
if ((Settings.ToolBarTheme == 2) && StrIsNotEmpty(s_tchToolbarBitmap))
{
- hbmp = _LoadBitmapFile(s_tchToolbarBitmap);
-
- BITMAP bmp;
- ZeroMemory(&bmp, sizeof(BITMAP));
- GetObject(hbmp, sizeof(BITMAP), &bmp);
-
- bool const dimOk = (bmp.bmWidth >= (bmp.bmHeight * NUMTOOLBITMAPS)) && hbmp;
-
- if (!dimOk) {
- InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_ERR_BITMAP, s_tchToolbarBitmap,
- (bmp.bmHeight * NUMTOOLBITMAPS), bmp.bmHeight, NUMTOOLBITMAPS);
+ hbmp = LoadBitmapFile(s_tchToolbarBitmap);
+ if (!hbmp) {
StringCchCopy(s_tchToolbarBitmap, COUNTOF(s_tchToolbarBitmap), L"");
IniSectionDelete(L"Toolbar Images", L"BitmapDefault", false);
bDirtyFlag = true;
- DeleteObject(hbmp);
- hbmp = NULL;
}
}
if (!hbmp) {
@@ -2211,145 +2269,87 @@ void CreateBars(HWND hwnd, HINSTANCE hInstance)
// use copy for alphablend a disabled Toolbar (if not provided)
hbmpCopy = CopyImage(hbmp, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
- // adjust toolbar bitmap to current DPI
- if (Settings.DpiScaleToolBar) {
- hbmp = ResizeImageForCurrentDPI(hwnd, hbmp);
- hbmpCopy = ResizeImageForCurrentDPI(hwnd, hbmpCopy);
- }
- HIMAGELIST himlOld = NULL;
- BUTTON_IMAGELIST bi;
- if (SendMessage(Globals.hwndToolbar, TB_GETIMAGELIST, 0, (LPARAM)&bi)) {
- himlOld = bi.himl;
- }
-
- BITMAP bmp;
- GetObject(hbmp,sizeof(BITMAP),&bmp);
- int mod = bmp.bmWidth % NUMTOOLBITMAPS;
- int cx = (bmp.bmWidth - mod) / NUMTOOLBITMAPS;
- int cy = bmp.bmHeight;
- HIMAGELIST himl = ImageList_Create(cx,cy,ILC_COLOR32|ILC_MASK,0,0);
- ImageList_AddMasked(himl,hbmp,CLR_DEFAULT);
+ HIMAGELIST himl = CreateScaledImageListFromBitmap(hwnd, hbmp);
DeleteObject(hbmp);
hbmp = NULL;
+
SendMessage(Globals.hwndToolbar,TB_SETIMAGELIST,0,(LPARAM)himl);
- if (himlOld) {
- ImageList_Destroy(himlOld);
- himlOld = NULL;
- }
+ // --------------------------
// Add a Hot Toolbar Bitmap
+ // --------------------------
if ((Settings.ToolBarTheme == 2) && StrIsNotEmpty(s_tchToolbarBitmapHot))
{
- hbmp = _LoadBitmapFile(s_tchToolbarBitmapHot);
-
- GetObject(hbmp, sizeof(BITMAP), &bmp);
-
- bool const dimOk = (bmp.bmWidth >= (bmp.bmHeight * NUMTOOLBITMAPS));
-
- if (!dimOk) {
- InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_ERR_BITMAP, s_tchToolbarBitmapHot,
- (bmp.bmHeight * NUMTOOLBITMAPS), bmp.bmHeight, NUMTOOLBITMAPS);
+ hbmp = LoadBitmapFile(s_tchToolbarBitmapHot);
+ if (!hbmp) {
StringCchCopy(s_tchToolbarBitmapHot, COUNTOF(s_tchToolbarBitmapHot), L"");
IniSectionDelete(L"Toolbar Images", L"BitmapHot", false);
bDirtyFlag = true;
- DeleteObject(hbmp);
- hbmp = NULL;
}
}
if (!hbmp && (Settings.ToolBarTheme < 2)) {
LPWSTR toolBarIntRes = (Settings.ToolBarTheme == 0) ? MAKEINTRESOURCE(IDR_MAINWNDTBHOT) : MAKEINTRESOURCE(IDR_MAINWNDTB2HOT);
hbmp = LoadImage(hInstance, toolBarIntRes, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
}
- if (SendMessage(Globals.hwndToolbar, TB_GETHOTIMAGELIST, 0, (LPARAM)& bi)) {
- himlOld = bi.himl;
- }
- if (hbmp) {
- // adjust toolbar bitmap to current DPI
- if (Settings.DpiScaleToolBar) {
- hbmp = ResizeImageForCurrentDPI(hwnd, hbmp);
- }
- GetObject(hbmp, sizeof(BITMAP), &bmp);
- mod = bmp.bmWidth % NUMTOOLBITMAPS;
- cx = (bmp.bmWidth - mod) / NUMTOOLBITMAPS;
- cy = bmp.bmHeight;
- himl = ImageList_Create(cx, cy, ILC_COLOR32 | ILC_MASK, 0, 0);
- ImageList_AddMasked(himl, hbmp, CLR_DEFAULT);
+ if (hbmp)
+ {
+ himl = CreateScaledImageListFromBitmap(hwnd, hbmp);
DeleteObject(hbmp);
hbmp = NULL;
+
SendMessage(Globals.hwndToolbar, TB_SETHOTIMAGELIST, 0, (LPARAM)himl);
}
else { // clear the old one
SendMessage(Globals.hwndToolbar, TB_SETHOTIMAGELIST, 0, 0);
}
- if (himlOld) {
- ImageList_Destroy(himlOld);
- himlOld = NULL;
- }
+
+ // ------------------------------
// Add a disabled Toolbar Bitmap
+ // ------------------------------
if ((Settings.ToolBarTheme == 2) && StrIsNotEmpty(s_tchToolbarBitmapDisabled))
{
- hbmp = _LoadBitmapFile(s_tchToolbarBitmapDisabled);
-
- GetObject(hbmp, sizeof(BITMAP), &bmp);
-
- bool const dimOk = (bmp.bmWidth >= (bmp.bmHeight * NUMTOOLBITMAPS));
-
- if (!dimOk) {
- InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_ERR_BITMAP, s_tchToolbarBitmapDisabled,
- (bmp.bmHeight * NUMTOOLBITMAPS), bmp.bmHeight, NUMTOOLBITMAPS);
+ hbmp = LoadBitmapFile(s_tchToolbarBitmapDisabled);
+ if (!hbmp) {
StringCchCopy(s_tchToolbarBitmapDisabled, COUNTOF(s_tchToolbarBitmapDisabled), L"");
IniSectionDelete(L"Toolbar Images", L"BitmapDisabled", false);
bDirtyFlag = true;
- DeleteObject(hbmp);
- hbmp = NULL;
}
}
if (!hbmp && (Settings.ToolBarTheme < 2)) {
LPWSTR toolBarIntRes = (Settings.ToolBarTheme == 0) ? MAKEINTRESOURCE(IDR_MAINWNDTBDIS) : MAKEINTRESOURCE(IDR_MAINWNDTB2DIS);
hbmp = LoadImage(hInstance, toolBarIntRes, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
}
- if (SendMessage(Globals.hwndToolbar, TB_GETDISABLEDIMAGELIST, 0, (LPARAM)& bi)) {
- himlOld = bi.himl;
- }
- if (hbmp) {
- // adjust toolbar bitmap to current DPI
- if (Settings.DpiScaleToolBar) {
- hbmp = ResizeImageForCurrentDPI(hwnd, hbmp);
- }
- GetObject(hbmp, sizeof(BITMAP), &bmp);
- mod = bmp.bmWidth % NUMTOOLBITMAPS;
- cx = (bmp.bmWidth - mod) / NUMTOOLBITMAPS;
- cy = bmp.bmHeight;
- himl = ImageList_Create(cx, cy, ILC_COLOR32 | ILC_MASK, 0, 0);
- ImageList_AddMasked(himl, hbmp, CLR_DEFAULT);
+
+ if (hbmp)
+ {
+ himl = CreateScaledImageListFromBitmap(hwnd, hbmp);
DeleteObject(hbmp);
hbmp = NULL;
+
SendMessage(Globals.hwndToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)himl);
}
else { // create disabled Toolbar, no external bitmap is supplied
if ((Settings.ToolBarTheme == 2) && StrIsEmpty(s_tchToolbarBitmapDisabled))
{
- bool fProcessed = false;
+ bool bProcessed = false;
if (Flags.ToolbarLook == 1) {
- fProcessed = BitmapAlphaBlend(hbmpCopy, GetSysColor(COLOR_3DFACE), 0x60);
+ bProcessed = BitmapAlphaBlend(hbmpCopy, GetSysColor(COLOR_3DFACE), 0x60);
}
else if (Flags.ToolbarLook == 2 || (!IsXPOrHigher() && Flags.ToolbarLook == 0)) {
- fProcessed = BitmapGrayScale(hbmpCopy);
+ bProcessed = BitmapGrayScale(hbmpCopy);
}
- if (fProcessed && !IsXPOrHigher()) {
+ if (bProcessed && !IsXPOrHigher()) {
BitmapMergeAlpha(hbmpCopy, GetSysColor(COLOR_3DFACE));
}
- if (fProcessed) {
- if (SendMessage(Globals.hwndToolbar, TB_GETDISABLEDIMAGELIST, 0, (LPARAM)& bi)) {
- himlOld = bi.himl;
- }
- himl = ImageList_Create(cx, cy, ILC_COLOR32 | ILC_MASK, 0, 0);
- ImageList_AddMasked(himl, hbmpCopy, CLR_DEFAULT);
+ if (bProcessed)
+ {
+ himl = CreateScaledImageListFromBitmap(hwnd, hbmpCopy);
+
SendMessage(Globals.hwndToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)himl);
}
}
@@ -2357,12 +2357,8 @@ void CreateBars(HWND hwnd, HINSTANCE hInstance)
if (hbmpCopy) {
DeleteObject(hbmpCopy);
+ hbmpCopy = NULL;
}
- if (himlOld) {
- ImageList_Destroy(himlOld);
- himlOld = NULL;
- }
-
// Load toolbar labels
WCHAR tchDesc[256] = { L'\0' };
@@ -2393,20 +2389,12 @@ void CreateBars(HWND hwnd, HINSTANCE hInstance)
if (Toolbar_SetButtons(Globals.hwndToolbar, IDT_FILE_NEW, Settings.ToolbarButtons, s_tbbMainWnd, COUNTOF(s_tbbMainWnd)) == 0) {
SendMessage(Globals.hwndToolbar, TB_ADDBUTTONS, COUNTOF(s_tbbMainWnd), (LPARAM)s_tbbMainWnd);
}
- RECT rc;
- SendMessage(Globals.hwndToolbar,TB_GETITEMRECT,0,(LPARAM)&rc);
- //SendMessage(Globals.hwndToolbar,TB_SETINDENT,2,0);
-
-
- // Create Statusbar
- DWORD const dwStatusbarStyle = Settings.ShowStatusbar ? (WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE) : (WS_CHILD | WS_CLIPSIBLINGS);
-
- if (Globals.hwndStatus) { DestroyWindow(Globals.hwndStatus); }
-
- Globals.hwndStatus = CreateStatusWindow(dwStatusbarStyle,NULL,hwnd,IDC_STATUSBAR);
+ CloseSettingsFile(bDirtyFlag);
+ // ------------------------------
// Create ReBar and add Toolbar
+ // ------------------------------
DWORD const dwReBarStyle = Settings.ShowToolbar ? (NP3_WS_REBAR | WS_VISIBLE) : (NP3_WS_REBAR);
if (s_hwndReBar) { DestroyWindow(s_hwndReBar); }
@@ -2420,8 +2408,11 @@ void CreateBars(HWND hwnd, HINSTANCE hInstance)
rbi.himl = (HIMAGELIST)NULL;
SendMessage(s_hwndReBar,RB_SETBARINFO,0,(LPARAM)&rbi);
+ RECT rc;
+ SendMessage(Globals.hwndToolbar, TB_GETITEMRECT, 0, (LPARAM)&rc);
+ //SendMessage(Globals.hwndToolbar,TB_SETINDENT,2,0);
- REBARBANDINFO rbBand;
+ REBARBANDINFO rbBand; ZeroMemory(&rbBand, sizeof(REBARBANDINFO));
rbBand.cbSize = sizeof(REBARBANDINFO);
rbBand.fMask = /*RBBIM_COLORS | RBBIM_TEXT | RBBIM_BACKGROUND | */
@@ -2442,7 +2433,16 @@ void CreateBars(HWND hwnd, HINSTANCE hInstance)
s_cyReBarFrame = s_bIsAppThemed ? 0 : 2;
- CloseSettingsFile(bDirtyFlag);
+
+ // -------------------
+ // Create Statusbar
+ // -------------------
+ DWORD const dwStatusbarStyle = Settings.ShowStatusbar ? (WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE) : (WS_CHILD | WS_CLIPSIBLINGS);
+
+ if (Globals.hwndStatus) { DestroyWindow(Globals.hwndStatus); }
+
+ Globals.hwndStatus = CreateStatusWindow(dwStatusbarStyle, NULL, hwnd, IDC_STATUSBAR);
+
}
diff --git a/src/VersionEx.h b/src/VersionEx.h
index 81a036d78..7161461d7 100644
--- a/src/VersionEx.h
+++ b/src/VersionEx.h
@@ -8,8 +8,8 @@
#define SAPPNAME "Notepad3"
#define VERSION_MAJOR 5
#define VERSION_MINOR 20
-#define VERSION_REV 308
-#define VERSION_BUILD 2
+#define VERSION_REV 309
+#define VERSION_BUILD 1
#define SCINTILLA_VER 432
#define ONIGURUMA_REGEX_VER 6.9.4
#define UCHARDET_VER 2018.09.27