From 854f0a7cec8d2e10ff416a54b3b8478adfa5a922 Mon Sep 17 00:00:00 2001
From: Rainer Kottenhoff
Date: Thu, 3 Aug 2017 12:36:39 +0200
Subject: [PATCH 1/6] reverting: don't use current system codepage for encoding
default (this will lead to problems on changing encoding)
---
src/Edit.c | 8 +++-----
src/Notepad3.c | 23 +++++++++--------------
src/Styles.c | 1 -
3 files changed, 12 insertions(+), 20 deletions(-)
diff --git a/src/Edit.c b/src/Edit.c
index 37d02cd23..161a22a20 100644
--- a/src/Edit.c
+++ b/src/Edit.c
@@ -380,14 +380,12 @@ BOOL EditSetNewEncoding(HWND hwnd,int iCurrentEncoding,int iNewEncoding,BOOL bNo
if (iCurrentEncoding != iNewEncoding) {
- if ((iCurrentEncoding == CPI_DEFAULT && iNewEncoding == CPI_DEFAULT) ||
- (iCurrentEncoding != CPI_DEFAULT && iNewEncoding != CPI_DEFAULT))
+ if (iCurrentEncoding != CPI_DEFAULT && iNewEncoding != CPI_DEFAULT)
return(TRUE);
if (SendMessage(hwnd,SCI_GETLENGTH,0,0) == 0) {
- BOOL bIsEmptyUndoHistory =
- (SendMessage(hwnd,SCI_CANUNDO,0,0) == 0 && SendMessage(hwnd,SCI_CANREDO,0,0) == 0);
+ BOOL bIsEmptyUndoHistory = (SendMessage(hwnd,SCI_CANUNDO,0,0) == 0 && SendMessage(hwnd,SCI_CANREDO,0,0) == 0);
if ((iCurrentEncoding == CPI_DEFAULT || iNewEncoding == CPI_DEFAULT) &&
(bNoUI || bIsEmptyUndoHistory || InfoBox(MBYESNO,L"MsgConv2",IDS_ASK_ENCODING2) == IDYES)) {
@@ -654,7 +652,7 @@ int Encoding_MapIniSetting(BOOL bLoad,int iSetting) {
default: {
int i;
for (i = CPI_UTF7 + 1; i < COUNTOF(mEncoding); i++) {
- if (mEncoding[i].uCodePage == (UINT)iSetting && Encoding_IsValid(i))
+ if ((mEncoding[i].uCodePage == (UINT)iSetting) && Encoding_IsValid(i))
return(i);
}
return CPI_DEFAULT;
diff --git a/src/Notepad3.c b/src/Notepad3.c
index d06fea972..4e774fa4f 100644
--- a/src/Notepad3.c
+++ b/src/Notepad3.c
@@ -1226,7 +1226,7 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
SetDlgItemInt(hwnd,IDC_REUSELOCK,GetTickCount(),FALSE);
if (pcds->dwData == DATA_NOTEPAD3_PARAMS) {
- LPnp3params params = LocalAlloc(LPTR,pcds->cbData);
+ LPnp3params params = LocalAlloc(LPTR,pcds->cbData);
CopyMemory(params,pcds->lpData,pcds->cbData);
if (params->flagLexerSpecified)
@@ -2381,7 +2381,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
break;
- case IDM_FILE_READONLY:
+ case IDM_FILE_READONLY:
//bReadOnly = (bReadOnly) ? FALSE : TRUE;
//SendMessage(hwndEdit,SCI_SETREADONLY,bReadOnly,0);
//UpdateToolbar();
@@ -4400,9 +4400,9 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
GetFileKey(hwndEdit);
break;
- case IDM_HELP_CMD:
- DisplayCmdLineHelp();
- break;
+ case IDM_HELP_CMD:
+ DisplayCmdLineHelp();
+ break;
case CMD_ESCAPE:
//close the autocomplete box
@@ -5669,7 +5669,7 @@ void LoadSettings()
bViewEOLs = IniSectionGetInt(pIniSection,L"ViewEOLs",0);
if (bViewEOLs) bViewEOLs = 1;
- iDefaultEncoding = IniSectionGetInt(pIniSection,L"DefaultEncoding", (int)GetACP());
+ iDefaultEncoding = IniSectionGetInt(pIniSection,L"DefaultEncoding", CPI_DEFAULT);
iDefaultEncoding = Encoding_MapIniSetting(TRUE,iDefaultEncoding);
if (!Encoding_IsValid(iDefaultEncoding)) iDefaultEncoding = CPI_DEFAULT;
@@ -5837,26 +5837,21 @@ void LoadSettings()
LocalFree(pIniSection);
- /*
- iDefaultCodePage = CPI_DEFAULT;
+ //iDefaultCodePage = (iDefaultEncoding == CPI_DEFAULT) ? Encoding_MapIniSetting(TRUE, (int)GetACP()) : iDefaultEncoding;
+ iDefaultCodePage = iDefaultEncoding;
{
// check for Chinese, Japan, Korean CPs
int acp = GetACP();
if (acp == 932 || acp == 936 || acp == 949 || acp == 950 || acp == 1361)
iDefaultCodePage = Encoding_MapIniSetting(TRUE, acp);
}
- */
-
- // sync Encoding and CodePage
- iDefaultCodePage = iDefaultEncoding;
-
{
CHARSETINFO ci;
if (TranslateCharsetInfo((DWORD*)(UINT_PTR)iDefaultCodePage, &ci, TCI_SRCCODEPAGE))
iDefaultCharSet = ci.ciCharset;
else
- iDefaultCharSet = DEFAULT_CHARSET; // ANSI_CHARSET;
+ iDefaultCharSet = ANSI_CHARSET;
}
// Scintilla Styles
diff --git a/src/Styles.c b/src/Styles.c
index af8fd2454..c34c94a7e 100644
--- a/src/Styles.c
+++ b/src/Styles.c
@@ -2656,7 +2656,6 @@ int iDefaultLexer;
BOOL bAutoSelect;
int cxStyleSelectDlg;
int cyStyleSelectDlg;
-extern int iDefaultCodePage;
extern int iDefaultCharSet;
extern BOOL bHiliteCurrentLine;
From 67ff6f274eeb01d5f3ec58addd20fd9b4fb1bbce Mon Sep 17 00:00:00 2001
From: Rainer Kottenhoff
Date: Thu, 3 Aug 2017 15:34:28 +0200
Subject: [PATCH 2/6] Refactoring/Fixes: - standard encoding is ANSI, (resp.
UTF8 - if no(-1) encoding default is given in .ini-file: DefaultEncoding=n) -
copy/paste non ANSI characters to ANSI encoded NP3 windo will recode them to
ANSI (same as manually recode)
---
src/Edit.c | 34 +++++++++++++++++++---------------
src/Edit.h | 2 +-
src/Notepad3.c | 29 ++++++++++++++---------------
3 files changed, 34 insertions(+), 31 deletions(-)
diff --git a/src/Edit.c b/src/Edit.c
index 161a22a20..4b8913f9b 100644
--- a/src/Edit.c
+++ b/src/Edit.c
@@ -79,7 +79,7 @@ NP2ENCODING mEncoding[] = {
{ NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_UNICODE_BOM, 0, "", 61003, L"" },
{ NCP_UNICODE|NCP_RECODE, 0, "utf-16,utf16,unicode,", 61004, L"" },
{ NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_RECODE, 0, "utf-16be,utf16be,unicodebe,", 61005, L"" },
- { NCP_UTF8|NCP_RECODE, 0, "utf-8,utf8,", 61006, L"" },
+ { NCP_UTF8|NCP_RECODE, CP_UTF8, "utf-8,utf8,", 61006, L"" },
{ NCP_UTF8|NCP_UTF8_SIGN, 0, "utf-8,utf8,", 61007, L"" },
{ NCP_8BIT|NCP_RECODE, CP_UTF7, "utf-7,utf7,", 61008, L"" },
{ NCP_8BIT|NCP_RECODE, 720, "DOS-720,dos720,", 61009, L"" },
@@ -350,8 +350,12 @@ BOOL EditConvertText(HWND hwnd,UINT cpSource,UINT cpDest,BOOL bSetSavePoint)
SendMessage(hwnd,SCI_GETTEXTRANGE,0,(LPARAM)&tr);
pwchText = GlobalAlloc(GPTR,length*3+2);
- cbwText = MultiByteToWideChar(cpSource,0,pchText,length,pwchText,length*3+2);
- cbText = WideCharToMultiByte(cpDest,0,pwchText,cbwText,pchText,length*5+2,NULL,NULL);
+
+ UINT _cpSrc = (cpSource == CPI_ANSI) ? CP_ACP : ((cpSource == CPI_OEM) ? CP_OEMCP : CP_UTF8);
+ UINT _cpDst = (cpDest == CPI_ANSI) ? CP_ACP : ((cpDest == CPI_OEM) ? CP_OEMCP : CP_UTF8);
+
+ cbwText = MultiByteToWideChar(_cpSrc,0,pchText,length,pwchText,length*3+2);
+ cbText = WideCharToMultiByte(_cpDst,0,pwchText,cbwText,pchText,length*5+2,NULL,NULL);
SendMessage(hwnd,SCI_CANCEL,0,0);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,0,0);
@@ -380,14 +384,14 @@ BOOL EditSetNewEncoding(HWND hwnd,int iCurrentEncoding,int iNewEncoding,BOOL bNo
if (iCurrentEncoding != iNewEncoding) {
- if (iCurrentEncoding != CPI_DEFAULT && iNewEncoding != CPI_DEFAULT)
+ if (iCurrentEncoding != CPI_ANSI && iNewEncoding != CPI_ANSI)
return(TRUE);
if (SendMessage(hwnd,SCI_GETLENGTH,0,0) == 0) {
BOOL bIsEmptyUndoHistory = (SendMessage(hwnd,SCI_CANUNDO,0,0) == 0 && SendMessage(hwnd,SCI_CANREDO,0,0) == 0);
- if ((iCurrentEncoding == CPI_DEFAULT || iNewEncoding == CPI_DEFAULT) &&
+ if ((iCurrentEncoding == CPI_ANSI || iNewEncoding == CPI_ANSI) &&
(bNoUI || bIsEmptyUndoHistory || InfoBox(MBYESNO,L"MsgConv2",IDS_ASK_ENCODING2) == IDYES)) {
EditConvertText(hwnd,
@@ -402,7 +406,7 @@ BOOL EditSetNewEncoding(HWND hwnd,int iCurrentEncoding,int iNewEncoding,BOOL bNo
return(FALSE);
}
- else if ((iCurrentEncoding == CPI_DEFAULT || iNewEncoding == CPI_DEFAULT) &&
+ else if ((iCurrentEncoding == CPI_ANSI || iNewEncoding == CPI_ANSI) &&
(bNoUI || InfoBox(MBYESNO,L"MsgConv1",IDS_ASK_ENCODING) == IDYES)) {
BeginWaitCursor();
@@ -640,7 +644,7 @@ void Encoding_InitDefaults() {
int Encoding_MapIniSetting(BOOL bLoad,int iSetting) {
if (bLoad) {
switch (iSetting) {
- case 0: return CPI_DEFAULT;
+ case 0: return CPI_ANSI;
case 1: return CPI_UNICODEBOM;
case 2: return CPI_UNICODEBEBOM;
case 3: return CPI_UTF8;
@@ -655,13 +659,13 @@ int Encoding_MapIniSetting(BOOL bLoad,int iSetting) {
if ((mEncoding[i].uCodePage == (UINT)iSetting) && Encoding_IsValid(i))
return(i);
}
- return CPI_DEFAULT;
+ return CPI_ANSI;
}
}
}
else {
switch (iSetting) {
- case CPI_DEFAULT: return 0;
+ case CPI_ANSI: return 0;
case CPI_UNICODEBOM: return 1;
case CPI_UNICODEBEBOM: return 2;
case CPI_UTF8: return 3;
@@ -787,7 +791,7 @@ void Encoding_AddToListView(HWND hwnd,int idSel,BOOL bRecodeOnly)
else
StrCpyN(wchBuf,pEE[i].wch,COUNTOF(wchBuf));
- if (id == CPI_DEFAULT)
+ if (id == CPI_ANSI)
StrCatN(wchBuf,wchANSI,COUNTOF(wchBuf));
else if (id == CPI_OEM)
StrCatN(wchBuf,wchOEM,COUNTOF(wchBuf));
@@ -879,7 +883,7 @@ void Encoding_AddToComboboxEx(HWND hwnd,int idSel,BOOL bRecodeOnly)
else
StrCpyN(wchBuf,pEE[i].wch,COUNTOF(wchBuf));
- if (id == CPI_DEFAULT)
+ if (id == CPI_ANSI)
StrCatN(wchBuf,wchANSI,COUNTOF(wchBuf));
else if (id == CPI_OEM)
StrCatN(wchBuf,wchOEM,COUNTOF(wchBuf));
@@ -1250,13 +1254,13 @@ BOOL EditLoadFile(
}
if (!Encoding_IsValid(iDefaultEncoding))
- iDefaultEncoding = CPI_DEFAULT;
+ iDefaultEncoding = CPI_ANSI;
_iDefaultEncoding = (bPreferOEM) ? g_DOSEncoding : iDefaultEncoding;
if (iWeakSrcEncoding != -1 && Encoding_IsValid(iWeakSrcEncoding))
_iDefaultEncoding = iWeakSrcEncoding;
- *iEncoding = CPI_DEFAULT;
+ *iEncoding = CPI_ANSI;
if (cbData == 0) {
FileVars_Init(NULL,0,&fvCurFile);
@@ -1362,7 +1366,7 @@ BOOL EditLoadFile(
*iEncoding = FileVars_GetEncoding(&fvCurFile);
if (*iEncoding == -1) {
if (fvCurFile.mask & FV_ENCODING)
- *iEncoding = CPI_DEFAULT;
+ *iEncoding = CPI_ANSI;
else {
if (iWeakSrcEncoding == -1)
*iEncoding = _iDefaultEncoding;
@@ -1401,7 +1405,7 @@ BOOL EditLoadFile(
SendMessage(hwnd,SCI_SETCODEPAGE,iDefaultCodePage,0);
EditSetNewText(hwnd,"",0);
EditSetNewText(hwnd,lpData,cbData);
- *iEncoding = CPI_DEFAULT;
+ *iEncoding = CPI_ANSI;
*iEOLMode = EditDetectEOLMode(hwnd,lpData,cbData);
GlobalFree(lpData);
}
diff --git a/src/Edit.h b/src/Edit.h
index b993afc20..b05939286 100644
--- a/src/Edit.h
+++ b/src/Edit.h
@@ -140,7 +140,7 @@ extern int g_DOSEncoding;
#define NCP_INTERNAL (NCP_DEFAULT|NCP_UTF8|NCP_UTF8_SIGN|NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_UNICODE_BOM)
#define NCP_RECODE 128
#define CPI_NONE -1
-#define CPI_DEFAULT 0
+#define CPI_ANSI 0
#define CPI_OEM 1
#define CPI_UNICODEBOM 2
#define CPI_UNICODEBEBOM 3
diff --git a/src/Notepad3.c b/src/Notepad3.c
index 4e774fa4f..0ddf5385a 100644
--- a/src/Notepad3.c
+++ b/src/Notepad3.c
@@ -919,7 +919,7 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow)
if (iSrcEncoding != -1) {
iEncoding = iSrcEncoding;
iOriginalEncoding = iSrcEncoding;
- SendMessage(hwndEdit,SCI_SETCODEPAGE,(iEncoding == CPI_DEFAULT) ? iDefaultCodePage : SC_CP_UTF8,0);
+ SendMessage(hwndEdit,SCI_SETCODEPAGE,(iEncoding == CPI_ANSI) ? iDefaultCodePage : SC_CP_UTF8,0);
}
}
@@ -2747,7 +2747,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
case IDM_ENCODING_UNICODEREV: iNewEncoding = CPI_UNICODEBEBOM; break;
case IDM_ENCODING_UTF8: iNewEncoding = CPI_UTF8; break;
case IDM_ENCODING_UTF8SIGN: iNewEncoding = CPI_UTF8SIGN; break;
- case IDM_ENCODING_ANSI: iNewEncoding = CPI_DEFAULT; break;
+ case IDM_ENCODING_ANSI: iNewEncoding = CPI_ANSI; break;
}
}
@@ -2760,7 +2760,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
iOriginalEncoding = iNewEncoding;
}
else {
- if (iEncoding == CPI_DEFAULT || iNewEncoding == CPI_DEFAULT)
+ if (iEncoding == CPI_ANSI || iNewEncoding == CPI_ANSI)
iOriginalEncoding = -1;
iEncoding = iNewEncoding;
}
@@ -2782,8 +2782,8 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
WCHAR tchCurFile2[MAX_PATH];
- int iNewEncoding = -1;
- if (iEncoding != CPI_DEFAULT)
+ int iNewEncoding = CPI_NONE;
+ if (iEncoding != CPI_ANSI)
iNewEncoding = iEncoding;
if (iEncoding == CPI_UTF8SIGN)
iNewEncoding = CPI_UTF8;
@@ -4503,7 +4503,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
{
WCHAR tchCurFile2[MAX_PATH];
if (lstrlen(szCurFile)) {
- iSrcEncoding = CPI_DEFAULT;
+ iSrcEncoding = CPI_ANSI;
lstrcpy(tchCurFile2,szCurFile);
FileLoad(FALSE,FALSE,TRUE,FALSE,tchCurFile2);
}
@@ -5669,9 +5669,9 @@ void LoadSettings()
bViewEOLs = IniSectionGetInt(pIniSection,L"ViewEOLs",0);
if (bViewEOLs) bViewEOLs = 1;
- iDefaultEncoding = IniSectionGetInt(pIniSection,L"DefaultEncoding", CPI_DEFAULT);
- iDefaultEncoding = Encoding_MapIniSetting(TRUE,iDefaultEncoding);
- if (!Encoding_IsValid(iDefaultEncoding)) iDefaultEncoding = CPI_DEFAULT;
+ iDefaultEncoding = IniSectionGetInt(pIniSection,L"DefaultEncoding", CPI_NONE);
+ iDefaultEncoding = (iDefaultEncoding == CPI_NONE) ? CPI_UTF8 : Encoding_MapIniSetting(TRUE, iDefaultEncoding);
+ if (!Encoding_IsValid(iDefaultEncoding)) iDefaultEncoding = CPI_ANSI;
bSkipUnicodeDetection = IniSectionGetInt(pIniSection,L"SkipUnicodeDetection",0);
if (bSkipUnicodeDetection) bSkipUnicodeDetection = 1;
@@ -5837,13 +5837,12 @@ void LoadSettings()
LocalFree(pIniSection);
- //iDefaultCodePage = (iDefaultEncoding == CPI_DEFAULT) ? Encoding_MapIniSetting(TRUE, (int)GetACP()) : iDefaultEncoding;
- iDefaultCodePage = iDefaultEncoding;
+ iDefaultCodePage = (iDefaultEncoding == CPI_ANSI) ? 0 : SC_CP_UTF8;
{
- // check for Chinese, Japan, Korean CPs
+ // check for Chinese, Japan, Korean DBCS code pages
int acp = GetACP();
if (acp == 932 || acp == 936 || acp == 949 || acp == 950 || acp == 1361)
- iDefaultCodePage = Encoding_MapIniSetting(TRUE, acp);
+ iDefaultCodePage = acp;
}
{
@@ -6928,7 +6927,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp
SendMessage(hwndEdit,SCI_SETEOLMODE,iLineEndings[iDefaultEOLMode],0);
iEncoding = iDefaultEncoding;
iOriginalEncoding = iDefaultEncoding;
- SendMessage(hwndEdit,SCI_SETCODEPAGE,(iDefaultEncoding == CPI_DEFAULT) ? iDefaultCodePage : SC_CP_UTF8,0);
+ SendMessage(hwndEdit,SCI_SETCODEPAGE,(iDefaultEncoding == CPI_ANSI) ? iDefaultCodePage : SC_CP_UTF8,0);
EditSetNewText(hwndEdit,"",0);
SetWindowTitle(hwndMain,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile,
iPathNameFormat,bModified || iEncoding != iOriginalEncoding,
@@ -6993,7 +6992,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp
iEncoding = iDefaultEncoding;
iOriginalEncoding = iDefaultEncoding;
}
- SendMessage(hwndEdit,SCI_SETCODEPAGE,(iEncoding == CPI_DEFAULT) ? iDefaultCodePage : SC_CP_UTF8,0);
+ SendMessage(hwndEdit,SCI_SETCODEPAGE,(iEncoding == CPI_ANSI) ? iDefaultCodePage : SC_CP_UTF8,0);
bReadOnly = FALSE;
EditSetNewText(hwndEdit,"",0);
}
From bc7c7f98bdeef4f1dbb2892fe3054b3f00e00d16 Mon Sep 17 00:00:00 2001
From: Rainer Kottenhoff
Date: Thu, 3 Aug 2017 17:30:03 +0200
Subject: [PATCH 3/6] Issue #32: add VisualStudio's editor behaviour for
Ctrl-C and Ctrl-X if nothing is selected (copy / cut current line)
---
src/Notepad3.c | 24 ++++++++++++++++++++----
1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/src/Notepad3.c b/src/Notepad3.c
index 0ddf5385a..ddc7d125a 100644
--- a/src/Notepad3.c
+++ b/src/Notepad3.c
@@ -2119,8 +2119,11 @@ void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam)
i = (int)SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0) - (int)SendMessage(hwndEdit,SCI_GETSELECTIONSTART,0,0);
i2 = (int)SendMessage(hwndEdit,SCI_CANPASTE,0,0);
- EnableCmd(hmenu,IDM_EDIT_CUT,i /*&& !bReadOnly*/);
- EnableCmd(hmenu,IDM_EDIT_COPY,i /*&& !bReadOnly*/);
+ //~EnableCmd(hmenu,IDM_EDIT_CUT,i /*&& !bReadOnly*/);
+ //~EnableCmd(hmenu,IDM_EDIT_COPY,i /*&& !bReadOnly*/);
+ EnableCmd(hmenu,IDM_EDIT_CUT,1 /*&& !bReadOnly*/); // allow Ctrl-X w/o selection
+ EnableCmd(hmenu,IDM_EDIT_COPY,1 /*&& !bReadOnly*/); // allow Ctrl-C w/o selection
+
EnableCmd(hmenu,IDM_EDIT_COPYALL,SendMessage(hwndEdit,SCI_GETLENGTH,0,0) /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_COPYADD,i /*&& !bReadOnly*/);
EnableCmd(hmenu,IDM_EDIT_PASTE,i2 /*&& !bReadOnly*/);
@@ -2847,14 +2850,25 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
case IDM_EDIT_CUT:
if (flagPasteBoard)
bLastCopyFromMe = TRUE;
- SendMessage(hwndEdit,SCI_CUT,0,0);
+ if ((int)SendMessage(hwndEdit, SCI_GETSELECTIONEND, 0, 0) != (int)SendMessage(hwndEdit, SCI_GETSELECTIONSTART, 0, 0)) {
+ SendMessage(hwndEdit, SCI_CUT, 0, 0);
+ }
+ else {
+ SendMessage(hwndEdit, SCI_LINECUT, 0, 0); // VisualStudio behaviour
+ }
break;
case IDM_EDIT_COPY:
if (flagPasteBoard)
bLastCopyFromMe = TRUE;
- SendMessage(hwndEdit,SCI_COPY,0,0);
+ if ((int)SendMessage(hwndEdit, SCI_GETSELECTIONEND, 0, 0) != (int)SendMessage(hwndEdit, SCI_GETSELECTIONSTART, 0, 0))
+ {
+ SendMessage(hwndEdit, SCI_COPY, 0, 0);
+ }
+ else {
+ SendMessage(hwndEdit, SCI_LINECOPY, 0, 0); // VisualStudio behaviour
+ }
UpdateToolbar();
break;
@@ -4982,6 +4996,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_CUT,1),0);
else
MessageBeep(0);
+ //SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_CUTLINE,1),0);
break;
@@ -4990,6 +5005,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_COPY,1),0);
else
SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_COPYALL,1),0);
+ //SendMessage(hwnd,WM_COMMAND,MAKELONG(IDM_EDIT_COPYLINE,1),0);
break;
From 7647e03801d04aa1038d68c27ec7418f7b044a3e Mon Sep 17 00:00:00 2001
From: Rainer Kottenhoff
Date: Fri, 4 Aug 2017 22:49:21 +0200
Subject: [PATCH 4/6] refactoring encoding and code-page handling: - using
Scintilla UTF8 code-page internally for most encodings, solves some
encoding/code-page problems, the behaviour slightly changes:
+ if DefaultEncoding is not set (or set to DefaultEncoding = -1),
initial encoding is set to current system's code-page, e.g. Windows-1252
Scintilla's internal UTF8 code-page is used for edit box,
that means copy/paste from clipboard may show characters which are
not valid in this char-set of the selected code-page.
Trying to save a file with this invalid UTF8 chars will result in conversion dialog:
("... encoding from ANSI to non-ANSI (and vice versa) may replace unsupported text with default characters ...")
+ if DeaultEncoding = 0 (ANSI):
a) if LoadASCIIasUTF8 = 0 (FALSE), Scintilla's internal ANSI code-page is used for edit box
that means copy/paste from clipboard may convert chars to ANSI ()
b) if LoadASCIIasUTF8 = 1 (TRUE), Scintilla's internal UTF8 code-page is used for edit box
that means the universal UTF8 encoding is used
+ if DeaultEncoding = nnn (corresponding to some ANSI code-page encoding):
same as if DefaultEncoding is set to corresponding code-page (see section "DefaultEncoding is not set")
---
src/Edit.c | 116 ++++++++++++++++++++++++-------------------------
src/Edit.h | 2 +-
src/Helpers.c | 15 +++++++
src/Helpers.h | 2 +-
src/Notepad3.c | 45 +++++++++++--------
src/Styles.c | 4 +-
6 files changed, 102 insertions(+), 82 deletions(-)
diff --git a/src/Edit.c b/src/Edit.c
index 4b8913f9b..9088d25a6 100644
--- a/src/Edit.c
+++ b/src/Edit.c
@@ -57,9 +57,9 @@ extern BOOL bFixLineEndings;
extern BOOL bAutoStripBlanks;
-// Default Codepage and Character Set
-extern int iDefaultCodePage;
-extern int iDefaultCharSet;
+// Internal Codepage and Character Set
+extern int iInternalCodePage;
+extern int iInternalCharSet;
extern BOOL bSkipUnicodeDetection;
extern BOOL bLoadASCIIasUTF8;
extern BOOL bLoadNFOasOEM;
@@ -80,7 +80,7 @@ NP2ENCODING mEncoding[] = {
{ NCP_UNICODE|NCP_RECODE, 0, "utf-16,utf16,unicode,", 61004, L"" },
{ NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_RECODE, 0, "utf-16be,utf16be,unicodebe,", 61005, L"" },
{ NCP_UTF8|NCP_RECODE, CP_UTF8, "utf-8,utf8,", 61006, L"" },
- { NCP_UTF8|NCP_UTF8_SIGN, 0, "utf-8,utf8,", 61007, L"" },
+ { NCP_UTF8|NCP_UTF8_SIGN, CP_UTF8, "utf-8,utf8,", 61007, L"" },
{ NCP_8BIT|NCP_RECODE, CP_UTF7, "utf-7,utf7,", 61008, L"" },
{ NCP_8BIT|NCP_RECODE, 720, "DOS-720,dos720,", 61009, L"" },
{ NCP_8BIT|NCP_RECODE, 28596, "iso-8859-6,iso88596,arabic,csisolatinarabic,ecma114,isoir127,", 61010, L"" },
@@ -238,7 +238,7 @@ HWND EditCreate(HWND hwndParent)
g_hInstance,
NULL);
- SendMessage(hwnd,SCI_SETCODEPAGE,iDefaultCodePage,0);
+ SetInternalCodePage(hwnd,iInternalCodePage);
SendMessage(hwnd,SCI_SETEOLMODE,SC_EOL_CRLF,0);
SendMessage(hwnd,SCI_SETPASTECONVERTENDINGS,1,0);
SendMessage(hwnd,SCI_SETMODEVENTMASK,/*SC_MODEVENTMASKALL*/SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT,0);
@@ -315,14 +315,14 @@ void EditSetNewText(HWND hwnd,char* lpstrText,DWORD cbText)
//
// EditConvertText()
//
-BOOL EditConvertText(HWND hwnd,UINT cpSource,UINT cpDest,BOOL bSetSavePoint)
+BOOL EditConvertText(HWND hwnd,int encSource,int encDest,BOOL bSetSavePoint)
{
struct Sci_TextRange tr = { { 0, -1 }, NULL };
int length, cbText, cbwText;
char *pchText;
WCHAR *pwchText;
- if (cpSource == cpDest)
+ if (encSource == encDest)
return(TRUE);
length = (int)SendMessage(hwnd,SCI_GETLENGTH,0,0);
@@ -333,7 +333,7 @@ BOOL EditConvertText(HWND hwnd,UINT cpSource,UINT cpDest,BOOL bSetSavePoint)
SendMessage(hwnd,SCI_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_CLEARALL,0,0);
SendMessage(hwnd,SCI_MARKERDELETEALL,(WPARAM)-1,0);
- SendMessage(hwnd,SCI_SETCODEPAGE,cpDest,0);
+ SetInternalCodePage(hwnd, encDest);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,1,0);
SendMessage(hwnd,EM_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_GOTOPOS,0,0);
@@ -351,18 +351,17 @@ BOOL EditConvertText(HWND hwnd,UINT cpSource,UINT cpDest,BOOL bSetSavePoint)
pwchText = GlobalAlloc(GPTR,length*3+2);
- UINT _cpSrc = (cpSource == CPI_ANSI) ? CP_ACP : ((cpSource == CPI_OEM) ? CP_OEMCP : CP_UTF8);
- UINT _cpDst = (cpDest == CPI_ANSI) ? CP_ACP : ((cpDest == CPI_OEM) ? CP_OEMCP : CP_UTF8);
-
- cbwText = MultiByteToWideChar(_cpSrc,0,pchText,length,pwchText,length*3+2);
- cbText = WideCharToMultiByte(_cpDst,0,pwchText,cbwText,pchText,length*5+2,NULL,NULL);
+ UINT cpSrc = (encSource == CPI_ANSI) ? CP_ACP : ((encSource == CPI_OEM) ? CP_OEMCP : ((encSource == CPI_UTF7) ? CP_UTF7 : CP_UTF8));
+ UINT cpDst = (encDest == CPI_ANSI) ? CP_ACP : ((encDest == CPI_OEM) ? CP_OEMCP : ((encDest == CPI_UTF7) ? CP_UTF7 : CP_UTF8));
+ cbwText = MultiByteToWideChar(cpSrc,0,pchText,length,pwchText,length*3+2);
+ cbText = WideCharToMultiByte(cpDst,0,pwchText,cbwText,pchText,length*5+2,NULL,NULL);
SendMessage(hwnd,SCI_CANCEL,0,0);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,0,0);
SendMessage(hwnd,SCI_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_CLEARALL,0,0);
SendMessage(hwnd,SCI_MARKERDELETEALL,(WPARAM)-1,0);
- SendMessage(hwnd,SCI_SETCODEPAGE,cpDest,0);
+ SetInternalCodePage(hwnd, encDest);
SendMessage(hwnd,SCI_ADDTEXT,cbText,(LPARAM)pchText);
SendMessage(hwnd,SCI_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,1,0);
@@ -385,7 +384,7 @@ BOOL EditSetNewEncoding(HWND hwnd,int iCurrentEncoding,int iNewEncoding,BOOL bNo
if (iCurrentEncoding != iNewEncoding) {
if (iCurrentEncoding != CPI_ANSI && iNewEncoding != CPI_ANSI)
- return(TRUE);
+ return(TRUE); // can only convert from-and-to ANSI
if (SendMessage(hwnd,SCI_GETLENGTH,0,0) == 0) {
@@ -394,10 +393,7 @@ BOOL EditSetNewEncoding(HWND hwnd,int iCurrentEncoding,int iNewEncoding,BOOL bNo
if ((iCurrentEncoding == CPI_ANSI || iNewEncoding == CPI_ANSI) &&
(bNoUI || bIsEmptyUndoHistory || InfoBox(MBYESNO,L"MsgConv2",IDS_ASK_ENCODING2) == IDYES)) {
- EditConvertText(hwnd,
- (mEncoding[iCurrentEncoding].uFlags & NCP_DEFAULT) ? iDefaultCodePage : SC_CP_UTF8,
- (mEncoding[iNewEncoding].uFlags & NCP_DEFAULT) ? iDefaultCodePage : SC_CP_UTF8,
- bSetSavePoint);
+ EditConvertText(hwnd, iCurrentEncoding, iNewEncoding, bSetSavePoint);
return(TRUE);
}
@@ -411,10 +407,7 @@ BOOL EditSetNewEncoding(HWND hwnd,int iCurrentEncoding,int iNewEncoding,BOOL bNo
BeginWaitCursor();
- EditConvertText(hwnd,
- (mEncoding[iCurrentEncoding].uFlags & NCP_DEFAULT) ? iDefaultCodePage : SC_CP_UTF8,
- (mEncoding[iNewEncoding].uFlags & NCP_DEFAULT) ? iDefaultCodePage : SC_CP_UTF8,
- FALSE);
+ EditConvertText(hwnd, iCurrentEncoding, iNewEncoding, FALSE);
EndWaitCursor();
@@ -630,8 +623,7 @@ void Encoding_InitDefaults() {
// Try to set the DOS encoding to DOS-437 if the default OEMCP is not DOS-437
if (mEncoding[g_DOSEncoding].uCodePage != 437)
{
- int i;
- for (i = CPI_UTF7 + 1; i < COUNTOF(mEncoding); ++i) {
+ for (int i = CPI_UTF7 + 1; i < COUNTOF(mEncoding); ++i) {
if (mEncoding[i].uCodePage == 437 && Encoding_IsValid(i)) {
g_DOSEncoding = i;
break;
@@ -644,36 +636,37 @@ void Encoding_InitDefaults() {
int Encoding_MapIniSetting(BOOL bLoad,int iSetting) {
if (bLoad) {
switch (iSetting) {
- case 0: return CPI_ANSI;
- case 1: return CPI_UNICODEBOM;
- case 2: return CPI_UNICODEBEBOM;
- case 3: return CPI_UTF8;
- case 4: return CPI_UTF8SIGN;
- case 5: return CPI_OEM;
- case 6: return CPI_UNICODE;
- case 7: return CPI_UNICODEBE;
- case 8: return CPI_UTF7;
+ case -1: return CPI_NONE;
+ case 0: return CPI_ANSI;
+ case 1: return CPI_UNICODEBOM;
+ case 2: return CPI_UNICODEBEBOM;
+ case 3: return CPI_UTF8;
+ case 4: return CPI_UTF8SIGN;
+ case 5: return CPI_OEM;
+ case 6: return CPI_UNICODE;
+ case 7: return CPI_UNICODEBE;
+ case 8: return CPI_UTF7;
default: {
- int i;
- for (i = CPI_UTF7 + 1; i < COUNTOF(mEncoding); i++) {
+ for (int i = CPI_UTF7 + 1; i < COUNTOF(mEncoding); i++) {
if ((mEncoding[i].uCodePage == (UINT)iSetting) && Encoding_IsValid(i))
return(i);
}
- return CPI_ANSI;
+ return CPI_UTF8; // not found
}
}
}
else {
switch (iSetting) {
- case CPI_ANSI: return 0;
- case CPI_UNICODEBOM: return 1;
- case CPI_UNICODEBEBOM: return 2;
- case CPI_UTF8: return 3;
- case CPI_UTF8SIGN: return 4;
- case CPI_OEM: return 5;
- case CPI_UNICODE: return 6;
- case CPI_UNICODEBE: return 7;
- case CPI_UTF7: return 8;
+ case CPI_NONE: return -1;
+ case CPI_ANSI: return 0;
+ case CPI_UNICODEBOM: return 1;
+ case CPI_UNICODEBEBOM: return 2;
+ case CPI_UTF8: return 3;
+ case CPI_UTF8SIGN: return 4;
+ case CPI_OEM: return 5;
+ case CPI_UNICODE: return 6;
+ case CPI_UNICODEBE: return 7;
+ case CPI_UTF7: return 8;
default: return(mEncoding[iSetting].uCodePage);
}
}
@@ -705,7 +698,6 @@ int Encoding_MatchW(LPCWSTR pwszTest) {
int Encoding_MatchA(char *pchTest) {
- int i;
char chTest[256];
char *pchSrc = pchTest;
char *pchDst = chTest;
@@ -717,7 +709,7 @@ int Encoding_MatchA(char *pchTest) {
}
*pchDst++ = ',';
*pchDst = 0;
- for (i = 0; i < COUNTOF(mEncoding); i++) {
+ for (int i = 0; i < COUNTOF(mEncoding); i++) {
if (StrStrIA(mEncoding[i].pszParseNames,chTest)) {
CPINFO cpi;
if ((mEncoding[i].uFlags & NCP_INTERNAL) ||
@@ -1254,13 +1246,13 @@ BOOL EditLoadFile(
}
if (!Encoding_IsValid(iDefaultEncoding))
- iDefaultEncoding = CPI_ANSI;
+ iDefaultEncoding = bLoadASCIIasUTF8 ? CPI_UTF8 : CPI_ANSI;
_iDefaultEncoding = (bPreferOEM) ? g_DOSEncoding : iDefaultEncoding;
if (iWeakSrcEncoding != -1 && Encoding_IsValid(iWeakSrcEncoding))
_iDefaultEncoding = iWeakSrcEncoding;
- *iEncoding = CPI_ANSI;
+ *iEncoding = bLoadASCIIasUTF8 ? CPI_UTF8 : CPI_ANSI;
if (cbData == 0) {
FileVars_Init(NULL,0,&fvCurFile);
@@ -1273,7 +1265,8 @@ BOOL EditLoadFile(
}
else
*iEncoding = iSrcEncoding;
- SendMessage(hwnd,SCI_SETCODEPAGE,(mEncoding[*iEncoding].uFlags & NCP_DEFAULT) ? iDefaultCodePage : SC_CP_UTF8,0);
+
+ SetInternalCodePage(hwnd, *iEncoding);
EditSetNewText(hwnd,"",0);
SendMessage(hwnd,SCI_SETEOLMODE,iLineEndings[iDefaultEOLMode],0);
GlobalFree(lpData);
@@ -1317,7 +1310,7 @@ BOOL EditLoadFile(
}
GlobalFree(lpData);
- SendMessage(hwnd,SCI_SETCODEPAGE,SC_CP_UTF8,0);
+ SetInternalCodePage(hwnd, SC_CP_UTF8);
EditSetNewText(hwnd,"",0);
FileVars_Init(lpDataUTF8,cbData-1,&fvCurFile);
EditSetNewText(hwnd,lpDataUTF8,cbData-1);
@@ -1339,7 +1332,7 @@ BOOL EditLoadFile(
bLoadASCIIasUTF8 )) ))))) && !(FileVars_IsNonUTF8(&fvCurFile) &&
(iSrcEncoding != CPI_UTF8 && iSrcEncoding != CPI_UTF8SIGN)))
{
- SendMessage(hwnd,SCI_SETCODEPAGE,SC_CP_UTF8,0);
+ SetInternalCodePage(hwnd, SC_CP_UTF8);
EditSetNewText(hwnd,"",0);
if (IsUTF8Signature(lpData)) {
EditSetNewText(hwnd,UTF8StringStart(lpData),cbData-3);
@@ -1366,7 +1359,7 @@ BOOL EditLoadFile(
*iEncoding = FileVars_GetEncoding(&fvCurFile);
if (*iEncoding == -1) {
if (fvCurFile.mask & FV_ENCODING)
- *iEncoding = CPI_ANSI;
+ *iEncoding = bLoadASCIIasUTF8 ? CPI_UTF8 : CPI_ANSI;
else {
if (iWeakSrcEncoding == -1)
*iEncoding = _iDefaultEncoding;
@@ -1392,7 +1385,7 @@ BOOL EditLoadFile(
cbData = WideCharToMultiByte(CP_UTF8,0,lpDataWide,cbDataWide,lpData,(int)GlobalSize(lpData),NULL,NULL);
GlobalFree(lpDataWide);
- SendMessage(hwnd,SCI_SETCODEPAGE,SC_CP_UTF8,0);
+ SetInternalCodePage(hwnd, SC_CP_UTF8);
EditSetNewText(hwnd,"",0);
EditSetNewText(hwnd,lpData,cbData);
*iEOLMode = EditDetectEOLMode(hwnd,lpData,cbData);
@@ -1402,18 +1395,18 @@ BOOL EditLoadFile(
else {
- SendMessage(hwnd,SCI_SETCODEPAGE,iDefaultCodePage,0);
+ *iEncoding = bLoadASCIIasUTF8 ? CPI_UTF8 : CPI_ANSI;
+ SetInternalCodePage(hwnd, *iEncoding);
EditSetNewText(hwnd,"",0);
EditSetNewText(hwnd,lpData,cbData);
- *iEncoding = CPI_ANSI;
*iEOLMode = EditDetectEOLMode(hwnd,lpData,cbData);
GlobalFree(lpData);
}
}
}
- iSrcEncoding = -1;
- iWeakSrcEncoding = -1;
+ iSrcEncoding = CPI_NONE;
+ iWeakSrcEncoding = CPI_NONE;
return TRUE;
}
@@ -1480,6 +1473,11 @@ BOOL EditSaveFile(
if (bAutoStripBlanks)
EditStripTrailingBlanks(hwnd,TRUE);
+ // convert to ANSI, if CP is set to UTF8
+ if ((iEncoding == CPI_ANSI) && (iInternalCodePage == SC_CP_UTF8)) {
+ EditSetNewEncoding(hwnd, CPI_UTF8, CPI_ANSI, FALSE, TRUE);
+ }
+
// get text
cbData = (int)SendMessage(hwnd,SCI_GETLENGTH,0,0);
lpData = GlobalAlloc(GPTR, cbData + 4); //fix: +bom
diff --git a/src/Edit.h b/src/Edit.h
index b05939286..0ace8af70 100644
--- a/src/Edit.h
+++ b/src/Edit.h
@@ -65,7 +65,7 @@ typedef struct _editfindreplace
HWND EditCreate(HWND);
void EditSetNewText(HWND,char*,DWORD);
-BOOL EditConvertText(HWND,UINT,UINT,BOOL);
+BOOL EditConvertText(HWND,int,int,BOOL);
BOOL EditSetNewEncoding(HWND,int,int,BOOL,BOOL);
char* EditGetClipboardText(HWND);
BOOL EditCopyAppend(HWND);
diff --git a/src/Helpers.c b/src/Helpers.c
index 2c2deb935..2754a459a 100644
--- a/src/Helpers.c
+++ b/src/Helpers.c
@@ -27,6 +27,11 @@
#include
#include "helpers.h"
#include "resource.h"
+#include "Edit.h"
+
+
+//=============================================================================
+extern iInternalCodePage;
//=============================================================================
@@ -491,6 +496,16 @@ void SetWindowTransparentMode(HWND hwnd,BOOL bTransparentMode)
}
+//=============================================================================
+//
+// SetInternalCodePage()
+//
+void SetInternalCodePage(HWND hwnd, int encoding) {
+ iInternalCodePage = (encoding == CPI_ANSI) ? 0 : SC_CP_UTF8;
+ SendMessage(hwnd, SCI_SETCODEPAGE, iInternalCodePage, 0);
+}
+
+
//=============================================================================
//
// CenterDlgInParent()
diff --git a/src/Helpers.h b/src/Helpers.h
index d09b22a25..8c1356b79 100644
--- a/src/Helpers.h
+++ b/src/Helpers.h
@@ -83,7 +83,7 @@ BOOL IsFontAvailable(LPCWSTR);
BOOL SetWindowTitle(HWND,UINT,BOOL,UINT,LPCWSTR,int,BOOL,UINT,BOOL,LPCWSTR);
void SetWindowTransparentMode(HWND,BOOL);
-
+void SetInternalCodePage(HWND,int);
void CenterDlgInParent(HWND);
void GetDlgPos(HWND,LPINT,LPINT);
diff --git a/src/Notepad3.c b/src/Notepad3.c
index ddc7d125a..2a96df52a 100644
--- a/src/Notepad3.c
+++ b/src/Notepad3.c
@@ -222,8 +222,8 @@ int iEncoding;
int iOriginalEncoding;
int iEOLMode;
-int iDefaultCodePage;
-int iDefaultCharSet;
+int iInternalCodePage;
+int iInternalCharSet;
int iInitialLine;
int iInitialColumn;
@@ -919,7 +919,7 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow)
if (iSrcEncoding != -1) {
iEncoding = iSrcEncoding;
iOriginalEncoding = iSrcEncoding;
- SendMessage(hwndEdit,SCI_SETCODEPAGE,(iEncoding == CPI_ANSI) ? iDefaultCodePage : SC_CP_UTF8,0);
+ SetInternalCodePage(hwndEdit, iEncoding);
}
}
@@ -2764,7 +2764,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
}
else {
if (iEncoding == CPI_ANSI || iNewEncoding == CPI_ANSI)
- iOriginalEncoding = -1;
+ iOriginalEncoding = CPI_NONE;
iEncoding = iNewEncoding;
}
@@ -5685,15 +5685,20 @@ void LoadSettings()
bViewEOLs = IniSectionGetInt(pIniSection,L"ViewEOLs",0);
if (bViewEOLs) bViewEOLs = 1;
+ // prefered default encoding is UTF-8 (used for internal codepage too: SC_CP_UTF8)
iDefaultEncoding = IniSectionGetInt(pIniSection,L"DefaultEncoding", CPI_NONE);
- iDefaultEncoding = (iDefaultEncoding == CPI_NONE) ? CPI_UTF8 : Encoding_MapIniSetting(TRUE, iDefaultEncoding);
- if (!Encoding_IsValid(iDefaultEncoding)) iDefaultEncoding = CPI_ANSI;
-
- bSkipUnicodeDetection = IniSectionGetInt(pIniSection,L"SkipUnicodeDetection",0);
- if (bSkipUnicodeDetection) bSkipUnicodeDetection = 1;
+ iDefaultEncoding = (iDefaultEncoding == CPI_NONE) ?
+ Encoding_MapIniSetting(TRUE, (int)GetACP()) :
+ Encoding_MapIniSetting(TRUE, iDefaultEncoding);
+ if (!Encoding_IsValid(iDefaultEncoding)) iDefaultEncoding = CPI_UTF8;
bLoadASCIIasUTF8 = IniSectionGetInt(pIniSection,L"LoadASCIIasUTF8",0);
if (bLoadASCIIasUTF8) bLoadASCIIasUTF8 = 1;
+ // re-adjust ANSI encoding
+ iDefaultEncoding = ((iDefaultEncoding == CPI_ANSI) && (bLoadASCIIasUTF8 == 1)) ? CPI_UTF8 : iDefaultEncoding;
+
+ bSkipUnicodeDetection = IniSectionGetInt(pIniSection, L"SkipUnicodeDetection", 0);
+ if (bSkipUnicodeDetection) bSkipUnicodeDetection = 1;
bLoadNFOasOEM = IniSectionGetInt(pIniSection,L"LoadNFOasOEM",1);
if (bLoadNFOasOEM) bLoadNFOasOEM = 1;
@@ -5853,20 +5858,22 @@ void LoadSettings()
LocalFree(pIniSection);
- iDefaultCodePage = (iDefaultEncoding == CPI_ANSI) ? 0 : SC_CP_UTF8;
+ // define scintilla internal code page
+ iInternalCodePage = (iDefaultEncoding == CPI_ANSI) ? 0 : SC_CP_UTF8;
+
{
- // check for Chinese, Japan, Korean DBCS code pages
- int acp = GetACP();
+ // check for Chinese, Japan, Korean DBCS code pages and switch accordingly
+ int acp = (int)GetACP();
if (acp == 932 || acp == 936 || acp == 949 || acp == 950 || acp == 1361)
- iDefaultCodePage = acp;
+ iInternalCodePage = acp;
}
{
CHARSETINFO ci;
- if (TranslateCharsetInfo((DWORD*)(UINT_PTR)iDefaultCodePage, &ci, TCI_SRCCODEPAGE))
- iDefaultCharSet = ci.ciCharset;
+ if (TranslateCharsetInfo((DWORD*)(UINT_PTR)iInternalCodePage, &ci, TCI_SRCCODEPAGE))
+ iInternalCharSet = ci.ciCharset;
else
- iDefaultCharSet = ANSI_CHARSET;
+ iInternalCharSet = ANSI_CHARSET;
}
// Scintilla Styles
@@ -5942,8 +5949,8 @@ void SaveSettings(BOOL bSaveSettingsNow)
IniSectionSetInt(pIniSection,L"ViewWhiteSpace",bViewWhiteSpace);
IniSectionSetInt(pIniSection,L"ViewEOLs",bViewEOLs);
IniSectionSetInt(pIniSection,L"DefaultEncoding",Encoding_MapIniSetting(FALSE,iDefaultEncoding));
- IniSectionSetInt(pIniSection,L"SkipUnicodeDetection",bSkipUnicodeDetection);
IniSectionSetInt(pIniSection,L"LoadASCIIasUTF8",bLoadASCIIasUTF8);
+ IniSectionSetInt(pIniSection,L"SkipUnicodeDetection",bSkipUnicodeDetection);
IniSectionSetInt(pIniSection,L"LoadNFOasOEM",bLoadNFOasOEM);
IniSectionSetInt(pIniSection,L"NoEncodingTags",bNoEncodingTags);
IniSectionSetInt(pIniSection,L"DefaultEOLMode",iDefaultEOLMode);
@@ -6943,7 +6950,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp
SendMessage(hwndEdit,SCI_SETEOLMODE,iLineEndings[iDefaultEOLMode],0);
iEncoding = iDefaultEncoding;
iOriginalEncoding = iDefaultEncoding;
- SendMessage(hwndEdit,SCI_SETCODEPAGE,(iDefaultEncoding == CPI_ANSI) ? iDefaultCodePage : SC_CP_UTF8,0);
+ SetInternalCodePage(hwndEdit, iEncoding);
EditSetNewText(hwndEdit,"",0);
SetWindowTitle(hwndMain,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile,
iPathNameFormat,bModified || iEncoding != iOriginalEncoding,
@@ -7008,7 +7015,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp
iEncoding = iDefaultEncoding;
iOriginalEncoding = iDefaultEncoding;
}
- SendMessage(hwndEdit,SCI_SETCODEPAGE,(iEncoding == CPI_ANSI) ? iDefaultCodePage : SC_CP_UTF8,0);
+ SetInternalCodePage(hwndEdit, iEncoding);
bReadOnly = FALSE;
EditSetNewText(hwndEdit,"",0);
}
diff --git a/src/Styles.c b/src/Styles.c
index c34c94a7e..ecf935f2a 100644
--- a/src/Styles.c
+++ b/src/Styles.c
@@ -2656,7 +2656,7 @@ int iDefaultLexer;
BOOL bAutoSelect;
int cxStyleSelectDlg;
int cyStyleSelectDlg;
-extern int iDefaultCharSet;
+extern int iInternalCharSet;
extern BOOL bHiliteCurrentLine;
@@ -4004,7 +4004,7 @@ BOOL Style_SelectFont(HWND hwnd,LPWSTR lpszStyle,int cchStyle,BOOL bDefaultStyle
if (bDefaultStyle &&
lf.lfCharSet != DEFAULT_CHARSET &&
lf.lfCharSet != ANSI_CHARSET &&
- lf.lfCharSet != iDefaultCharSet) {
+ lf.lfCharSet != iInternalCharSet) {
lstrcat(szNewStyle,L"; charset:");
wsprintf(tch,L"%i",lf.lfCharSet);
lstrcat(szNewStyle,tch);
From da073686dcfc0fbc06f4e89167d9f003284a0d05 Mon Sep 17 00:00:00 2001
From: Rainer Kottenhoff
Date: Sat, 5 Aug 2017 20:20:22 +0200
Subject: [PATCH 5/6] reverting, and fixing encoding / code-page issues: -
consistent encoding <> code-page handling (including Scintilla's code-page
settings) - Scintilla issue regarding notepad2-mod issie #173 (see
https://github.com/XhmikosR/notepad2-mod/pull/193) - allow arbitrary
conversion between encodings (even it it does not make sense in any case)
(instead of doing silently nothing but changing encoding info on status bar)
---
scintilla/doc/ScintillaDoc.html | 3 +-
scintilla/doc/ScintillaHistory.html | 4 +-
scintilla/win32/ScintillaWin.cxx | 3 +-
src/Edit.c | 203 +++++++++++++++-------------
src/Edit.h | 10 +-
src/Helpers.c | 15 --
src/Helpers.h | 2 +-
src/Notepad3.c | 65 ++++-----
src/Notepad3.rc | 6 +-
src/Styles.c | 5 +-
10 files changed, 160 insertions(+), 156 deletions(-)
diff --git a/scintilla/doc/ScintillaDoc.html b/scintilla/doc/ScintillaDoc.html
index a7e7eba36..a588e513f 100644
--- a/scintilla/doc/ScintillaDoc.html
+++ b/scintilla/doc/ScintillaDoc.html
@@ -2897,7 +2897,8 @@ Style definition
number used by the C and C++ lexer to display literal strings; it has the value 6). This
feature works differently on Windows and GTK+.
The default character set is SC_CHARSET_DEFAULT.
- SC_CHARSET_ANSI and SC_CHARSET_DEFAULT specify European Windows code page 1252 unless the code page is set.
+ SC_CHARSET_ANSI specifies European Windows code page 1252.
+ SC_CHARSET_DEFAULT specifies the system-default code page unless the code page is set.
diff --git a/scintilla/doc/ScintillaHistory.html b/scintilla/doc/ScintillaHistory.html
index 683a2c4a5..e6ea0f66e 100644
--- a/scintilla/doc/ScintillaHistory.html
+++ b/scintilla/doc/ScintillaHistory.html
@@ -1,4 +1,4 @@
-
+
@@ -1028,7 +1028,7 @@
C++11 range-based for loops used in SciTE so GCC 4.6 is now the minimum supported version.
- SC_CHARSET_DEFAULT now means code page 1252 on Windows unless a code page is set.
+ (REVERTED in Notepad2-mod) SC_CHARSET_DEFAULT now means code page 1252 on Windows unless a code page is set.
This prevents unexpected behaviour and crashes on East Asian systems where default locales are commonly DBCS.
Projects which want to default to DBCS code pages in East Asian locales should set the code page and
character set explicitly.
diff --git a/scintilla/win32/ScintillaWin.cxx b/scintilla/win32/ScintillaWin.cxx
index 81f288c72..0b47c36ed 100644
--- a/scintilla/win32/ScintillaWin.cxx
+++ b/scintilla/win32/ScintillaWin.cxx
@@ -1144,7 +1144,8 @@ UINT CodePageFromCharSet(DWORD characterSet, UINT documentCodePage) {
}
switch (characterSet) {
case SC_CHARSET_ANSI: return 1252;
- case SC_CHARSET_DEFAULT: return documentCodePage ? documentCodePage : 1252;
+ //case SC_CHARSET_DEFAULT: return documentCodePage ? documentCodePage : 1252; // SCI orig
+ case SC_CHARSET_DEFAULT: return documentCodePage;
case SC_CHARSET_BALTIC: return 1257;
case SC_CHARSET_CHINESEBIG5: return 950;
case SC_CHARSET_EASTEUROPE: return 1250;
diff --git a/src/Edit.c b/src/Edit.c
index 9088d25a6..0185a1bcd 100644
--- a/src/Edit.c
+++ b/src/Edit.c
@@ -57,9 +57,9 @@ extern BOOL bFixLineEndings;
extern BOOL bAutoStripBlanks;
-// Internal Codepage and Character Set
-extern int iInternalCodePage;
-extern int iInternalCharSet;
+// Default Codepage and Character Set
+extern int iDefaultCodePage;
+extern int iDefaultCharSet;
extern BOOL bSkipUnicodeDetection;
extern BOOL bLoadASCIIasUTF8;
extern BOOL bLoadNFOasOEM;
@@ -73,15 +73,15 @@ WCHAR wchANSI[8] = L"";
WCHAR wchOEM [8] = L"";
NP2ENCODING mEncoding[] = {
- { NCP_DEFAULT|NCP_RECODE, 0, "ansi,ansi,ascii,", 61000, L"" },
- { NCP_8BIT|NCP_RECODE, 0, "oem,oem,", 61001, L"" },
- { NCP_UNICODE|NCP_UNICODE_BOM, 0, "", 61002, L"" },
- { NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_UNICODE_BOM, 0, "", 61003, L"" },
- { NCP_UNICODE|NCP_RECODE, 0, "utf-16,utf16,unicode,", 61004, L"" },
- { NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_RECODE, 0, "utf-16be,utf16be,unicodebe,", 61005, L"" },
- { NCP_UTF8|NCP_RECODE, CP_UTF8, "utf-8,utf8,", 61006, L"" },
- { NCP_UTF8|NCP_UTF8_SIGN, CP_UTF8, "utf-8,utf8,", 61007, L"" },
- { NCP_8BIT|NCP_RECODE, CP_UTF7, "utf-7,utf7,", 61008, L"" },
+ { NCP_ANSI|NCP_RECODE, CP_ACP, "ansi,ansi,ascii,", 61000, L"" },
+ { NCP_8BIT|NCP_RECODE, CP_OEMCP, "oem,oem,", 61001, L"" },
+ { NCP_UNICODE|NCP_UNICODE_BOM, CP_UTF8, "", 61002, L"" },
+ { NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_UNICODE_BOM, CP_UTF8, "", 61003, L"" },
+ { NCP_UNICODE|NCP_RECODE, CP_UTF8, "utf-16,utf16,unicode,", 61004, L"" },
+ { NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_RECODE, CP_UTF8, "utf-16be,utf16be,unicodebe,", 61005, L"" },
+ { NCP_UTF8|NCP_RECODE, CP_UTF8, "utf-8,utf8,", 61006, L"" },
+ { NCP_UTF8|NCP_UTF8_SIGN, CP_UTF8, "utf-8,utf8,", 61007, L"" },
+ { NCP_8BIT|NCP_RECODE, CP_UTF7, "utf-7,utf7,", 61008, L"" },
{ NCP_8BIT|NCP_RECODE, 720, "DOS-720,dos720,", 61009, L"" },
{ NCP_8BIT|NCP_RECODE, 28596, "iso-8859-6,iso88596,arabic,csisolatinarabic,ecma114,isoir127,", 61010, L"" },
{ NCP_8BIT|NCP_RECODE, 10004, "x-mac-arabic,xmacarabic,", 61011, L"" },
@@ -238,7 +238,7 @@ HWND EditCreate(HWND hwndParent)
g_hInstance,
NULL);
- SetInternalCodePage(hwnd,iInternalCodePage);
+ SendMessage(hwnd,SCI_SETCODEPAGE,Encoding_GetSciCodePage(iDefaultEncoding),0);
SendMessage(hwnd,SCI_SETEOLMODE,SC_EOL_CRLF,0);
SendMessage(hwnd,SCI_SETPASTECONVERTENDINGS,1,0);
SendMessage(hwnd,SCI_SETMODEVENTMASK,/*SC_MODEVENTMASKALL*/SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT,0);
@@ -325,6 +325,9 @@ BOOL EditConvertText(HWND hwnd,int encSource,int encDest,BOOL bSetSavePoint)
if (encSource == encDest)
return(TRUE);
+ if (!(Encoding_IsValid(encSource) && Encoding_IsValid(encDest)))
+ return(FALSE);
+
length = (int)SendMessage(hwnd,SCI_GETLENGTH,0,0);
if (length == 0) {
@@ -333,7 +336,7 @@ BOOL EditConvertText(HWND hwnd,int encSource,int encDest,BOOL bSetSavePoint)
SendMessage(hwnd,SCI_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_CLEARALL,0,0);
SendMessage(hwnd,SCI_MARKERDELETEALL,(WPARAM)-1,0);
- SetInternalCodePage(hwnd, encDest);
+ SendMessage(hwnd,SCI_SETCODEPAGE, Encoding_GetSciCodePage(encDest),0);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,1,0);
SendMessage(hwnd,EM_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_GOTOPOS,0,0);
@@ -344,6 +347,7 @@ BOOL EditConvertText(HWND hwnd,int encSource,int encDest,BOOL bSetSavePoint)
}
else {
+
pchText = GlobalAlloc(GPTR,length*5+2);
tr.lpstrText = pchText;
@@ -351,17 +355,17 @@ BOOL EditConvertText(HWND hwnd,int encSource,int encDest,BOOL bSetSavePoint)
pwchText = GlobalAlloc(GPTR,length*3+2);
- UINT cpSrc = (encSource == CPI_ANSI) ? CP_ACP : ((encSource == CPI_OEM) ? CP_OEMCP : ((encSource == CPI_UTF7) ? CP_UTF7 : CP_UTF8));
- UINT cpDst = (encDest == CPI_ANSI) ? CP_ACP : ((encDest == CPI_OEM) ? CP_OEMCP : ((encDest == CPI_UTF7) ? CP_UTF7 : CP_UTF8));
- cbwText = MultiByteToWideChar(cpSrc,0,pchText,length,pwchText,length*3+2);
- cbText = WideCharToMultiByte(cpDst,0,pwchText,cbwText,pchText,length*5+2,NULL,NULL);
+ UINT cpSrc = mEncoding[encSource].uCodePage;
+ UINT cpDst = mEncoding[encDest].uCodePage;
+ cbwText = MultiByteToWideChar(cpSrc,0,pchText,length,pwchText,length*3+2);
+ cbText = WideCharToMultiByte(cpDst,0,pwchText,cbwText,pchText,length*5+2,NULL,NULL);
SendMessage(hwnd,SCI_CANCEL,0,0);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,0,0);
SendMessage(hwnd,SCI_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_CLEARALL,0,0);
SendMessage(hwnd,SCI_MARKERDELETEALL,(WPARAM)-1,0);
- SetInternalCodePage(hwnd, encDest);
+ SendMessage(hwnd,SCI_SETCODEPAGE,Encoding_GetSciCodePage(encDest),0);
SendMessage(hwnd,SCI_ADDTEXT,cbText,(LPARAM)pchText);
SendMessage(hwnd,SCI_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,1,0);
@@ -383,43 +387,39 @@ BOOL EditSetNewEncoding(HWND hwnd,int iCurrentEncoding,int iNewEncoding,BOOL bNo
if (iCurrentEncoding != iNewEncoding) {
- if (iCurrentEncoding != CPI_ANSI && iNewEncoding != CPI_ANSI)
- return(TRUE); // can only convert from-and-to ANSI
-
- if (SendMessage(hwnd,SCI_GETLENGTH,0,0) == 0) {
-
- BOOL bIsEmptyUndoHistory = (SendMessage(hwnd,SCI_CANUNDO,0,0) == 0 && SendMessage(hwnd,SCI_CANREDO,0,0) == 0);
+ BOOL bOneEncodingIsANSI = (Encoding_IsANSI(iCurrentEncoding) || Encoding_IsANSI(iNewEncoding));
+ BOOL bBothEncodingsAreANSI = (Encoding_IsANSI(iCurrentEncoding) && Encoding_IsANSI(iNewEncoding));
+
+ // conversion between arbirtaty encodings may lead to unexpected results
+ if (!bOneEncodingIsANSI || bBothEncodingsAreANSI) {
+ // ~ return(TRUE); // this would imply a successful conversion - it is not !
+ // return(FALSE); // commented out ? : allow conversion between arbirtaty encodings
+ }
+
+ if (SendMessage(hwnd, SCI_GETLENGTH, 0, 0) == 0) {
- if ((iCurrentEncoding == CPI_ANSI || iNewEncoding == CPI_ANSI) &&
- (bNoUI || bIsEmptyUndoHistory || InfoBox(MBYESNO,L"MsgConv2",IDS_ASK_ENCODING2) == IDYES)) {
+ BOOL bIsEmptyUndoHistory = (SendMessage(hwnd, SCI_CANUNDO, 0, 0) == 0 && SendMessage(hwnd, SCI_CANREDO, 0, 0) == 0);
- EditConvertText(hwnd, iCurrentEncoding, iNewEncoding, bSetSavePoint);
+ BOOL doNewEncoding = (!bIsEmptyUndoHistory && !bNoUI) ?
+ (InfoBox(MBYESNO, L"MsgConv2", IDS_ASK_ENCODING2) == IDYES) : TRUE;
- return(TRUE);
+ if (doNewEncoding) {
+ return EditConvertText(hwnd,iCurrentEncoding,iNewEncoding,bSetSavePoint);
}
-
- else
- return(FALSE);
}
-
- else if ((iCurrentEncoding == CPI_ANSI || iNewEncoding == CPI_ANSI) &&
- (bNoUI || InfoBox(MBYESNO,L"MsgConv1",IDS_ASK_ENCODING) == IDYES)) {
-
- BeginWaitCursor();
-
- EditConvertText(hwnd, iCurrentEncoding, iNewEncoding, FALSE);
-
- EndWaitCursor();
-
- return(TRUE);
+ else {
+
+ BOOL doNewEncoding = (!bNoUI) ? (InfoBox(MBYESNO, L"MsgConv1", IDS_ASK_ENCODING) == IDYES) : TRUE;
+
+ if (doNewEncoding) {
+ BeginWaitCursor();
+ BOOL result = EditConvertText(hwnd,iCurrentEncoding,iNewEncoding,FALSE);
+ EndWaitCursor();
+ return(result);
+ }
}
-
- else
- return(FALSE);
- }
-
- else
- return(FALSE);
+ }
+ return(FALSE);
}
@@ -637,7 +637,7 @@ int Encoding_MapIniSetting(BOOL bLoad,int iSetting) {
if (bLoad) {
switch (iSetting) {
case -1: return CPI_NONE;
- case 0: return CPI_ANSI;
+ case 0: return CPI_ANSI_DEFAULT;
case 1: return CPI_UNICODEBOM;
case 2: return CPI_UNICODEBEBOM;
case 3: return CPI_UTF8;
@@ -651,14 +651,14 @@ int Encoding_MapIniSetting(BOOL bLoad,int iSetting) {
if ((mEncoding[i].uCodePage == (UINT)iSetting) && Encoding_IsValid(i))
return(i);
}
- return CPI_UTF8; // not found
+ return CPI_ANSI_DEFAULT;
}
}
}
else {
switch (iSetting) {
case CPI_NONE: return -1;
- case CPI_ANSI: return 0;
+ case CPI_ANSI_DEFAULT: return 0;
case CPI_UNICODEBOM: return 1;
case CPI_UNICODEBEBOM: return 2;
case CPI_UTF8: return 3;
@@ -667,7 +667,12 @@ int Encoding_MapIniSetting(BOOL bLoad,int iSetting) {
case CPI_UNICODE: return 6;
case CPI_UNICODEBE: return 7;
case CPI_UTF7: return 8;
- default: return(mEncoding[iSetting].uCodePage);
+ default: {
+ if (Encoding_IsValid(iSetting))
+ return(mEncoding[iSetting].uCodePage);
+ else
+ return CPI_ANSI_DEFAULT;
+ }
}
}
}
@@ -783,7 +788,7 @@ void Encoding_AddToListView(HWND hwnd,int idSel,BOOL bRecodeOnly)
else
StrCpyN(wchBuf,pEE[i].wch,COUNTOF(wchBuf));
- if (id == CPI_ANSI)
+ if (Encoding_IsANSI(id))
StrCatN(wchBuf,wchANSI,COUNTOF(wchBuf));
else if (id == CPI_OEM)
StrCatN(wchBuf,wchOEM,COUNTOF(wchBuf));
@@ -875,7 +880,7 @@ void Encoding_AddToComboboxEx(HWND hwnd,int idSel,BOOL bRecodeOnly)
else
StrCpyN(wchBuf,pEE[i].wch,COUNTOF(wchBuf));
- if (id == CPI_ANSI)
+ if (Encoding_IsANSI(id))
StrCatN(wchBuf,wchANSI,COUNTOF(wchBuf));
else if (id == CPI_OEM)
StrCatN(wchBuf,wchOEM,COUNTOF(wchBuf));
@@ -921,6 +926,25 @@ BOOL Encoding_GetFromComboboxEx(HWND hwnd,int *pidEncoding)
}
+BOOL Encoding_IsDefault(int iEncoding)
+{
+ return (mEncoding[iEncoding].uFlags & NCP_DEFAULT);
+}
+
+BOOL Encoding_IsANSI(int iEncoding)
+{
+ return (mEncoding[iEncoding].uFlags & NCP_ANSI);
+}
+
+int Encoding_GetSciCodePage(int iEncoding)
+{
+ if (Encoding_IsDefault(iEncoding))
+ return iDefaultCodePage;
+
+ return (Encoding_IsANSI(iEncoding)) ? 0 : SC_CP_UTF8;
+}
+
+
BOOL IsUnicode(const char* pBuffer,int cb,LPBOOL lpbBOM,LPBOOL lpbReverse)
{
int i = 0xFFFF;
@@ -1185,13 +1209,14 @@ BOOL EditLoadFile(
char* lpData;
DWORD cbData;
//char *cp;
- int _iDefaultEncoding;
+ int _iPrefEncoding;
BOOL bBOM;
BOOL bReverse = FALSE;
BOOL bPreferOEM = FALSE;
+ *iEncoding = CPI_ANSI_DEFAULT;
*pbUnicodeErr = FALSE;
*pbFileTooBig = FALSE;
@@ -1205,8 +1230,8 @@ BOOL EditLoadFile(
dwLastIOError = GetLastError();
if (hFile == INVALID_HANDLE_VALUE) {
- iSrcEncoding = -1;
- iWeakSrcEncoding = -1;
+ iSrcEncoding = CPI_NONE;
+ iWeakSrcEncoding = CPI_NONE;
return FALSE;
}
@@ -1220,8 +1245,8 @@ BOOL EditLoadFile(
if (InfoBox(MBYESNO,L"MsgFileSizeWarning",IDS_WARNLOADBIGFILE) != IDYES) {
CloseHandle(hFile);
*pbFileTooBig = TRUE;
- iSrcEncoding = -1;
- iWeakSrcEncoding = -1;
+ iSrcEncoding = CPI_NONE;
+ iWeakSrcEncoding = CPI_NONE;
return FALSE;
}
}
@@ -1233,8 +1258,8 @@ BOOL EditLoadFile(
if (!bReadSuccess) {
GlobalFree(lpData);
- iSrcEncoding = -1;
- iWeakSrcEncoding = -1;
+ iSrcEncoding = CPI_NONE;
+ iWeakSrcEncoding = CPI_NONE;
return FALSE;
}
@@ -1245,34 +1270,29 @@ BOOL EditLoadFile(
bPreferOEM = TRUE;
}
- if (!Encoding_IsValid(iDefaultEncoding))
- iDefaultEncoding = bLoadASCIIasUTF8 ? CPI_UTF8 : CPI_ANSI;
-
- _iDefaultEncoding = (bPreferOEM) ? g_DOSEncoding : iDefaultEncoding;
- if (iWeakSrcEncoding != -1 && Encoding_IsValid(iWeakSrcEncoding))
- _iDefaultEncoding = iWeakSrcEncoding;
-
- *iEncoding = bLoadASCIIasUTF8 ? CPI_UTF8 : CPI_ANSI;
+ _iPrefEncoding = (bPreferOEM) ? g_DOSEncoding : iDefaultEncoding;
+ if (Encoding_IsValid(iWeakSrcEncoding))
+ _iPrefEncoding = iWeakSrcEncoding;
if (cbData == 0) {
FileVars_Init(NULL,0,&fvCurFile);
*iEOLMode = iLineEndings[iDefaultEOLMode];
- if (iSrcEncoding == -1) {
+ if (iSrcEncoding == CPI_NONE) {
if (bLoadASCIIasUTF8 && !bPreferOEM)
*iEncoding = CPI_UTF8;
else
- *iEncoding = _iDefaultEncoding;
+ *iEncoding = _iPrefEncoding;
}
else
*iEncoding = iSrcEncoding;
- SetInternalCodePage(hwnd, *iEncoding);
+ SendMessage(hwnd,SCI_SETCODEPAGE,Encoding_GetSciCodePage(*iEncoding),0);
EditSetNewText(hwnd,"",0);
SendMessage(hwnd,SCI_SETEOLMODE,iLineEndings[iDefaultEOLMode],0);
GlobalFree(lpData);
}
- else if (!bSkipEncodingDetection && (iSrcEncoding == -1 || iSrcEncoding == CPI_UNICODE || iSrcEncoding == CPI_UNICODEBE) &&
+ else if (!bSkipEncodingDetection && (iSrcEncoding == CPI_NONE || iSrcEncoding == CPI_UNICODE || iSrcEncoding == CPI_UNICODEBE) &&
(iSrcEncoding == CPI_UNICODE || iSrcEncoding == CPI_UNICODEBE || IsUnicode(lpData,cbData,&bBOM,&bReverse)) &&
(iSrcEncoding == CPI_UNICODE || iSrcEncoding == CPI_UNICODEBE || !IsUTF8Signature(lpData))) // check for UTF-8 signature
{
@@ -1310,7 +1330,7 @@ BOOL EditLoadFile(
}
GlobalFree(lpData);
- SetInternalCodePage(hwnd, SC_CP_UTF8);
+ SendMessage(hwnd,SCI_SETCODEPAGE,Encoding_GetSciCodePage(*iEncoding),0);
EditSetNewText(hwnd,"",0);
FileVars_Init(lpDataUTF8,cbData-1,&fvCurFile);
EditSetNewText(hwnd,lpDataUTF8,cbData-1);
@@ -1320,7 +1340,7 @@ BOOL EditLoadFile(
else {
FileVars_Init(lpData,cbData,&fvCurFile);
- if (!bSkipEncodingDetection && (iSrcEncoding == -1 || iSrcEncoding == CPI_UTF8 || iSrcEncoding == CPI_UTF8SIGN) &&
+ if (!bSkipEncodingDetection && (iSrcEncoding == CPI_NONE || iSrcEncoding == CPI_UTF8 || iSrcEncoding == CPI_UTF8SIGN) &&
((IsUTF8Signature(lpData) ||
FileVars_IsUTF8(&fvCurFile) ||
(iSrcEncoding == CPI_UTF8 || iSrcEncoding == CPI_UTF8SIGN) ||
@@ -1328,11 +1348,11 @@ BOOL EditLoadFile(
(((UTF8_mbslen_bytes(UTF8StringStart(lpData)) - 1 !=
UTF8_mbslen(UTF8StringStart(lpData),IsUTF8Signature(lpData) ? cbData-3 : cbData)) ||
(!bPreferOEM && (
- mEncoding[_iDefaultEncoding].uFlags & NCP_UTF8 ||
+ mEncoding[_iPrefEncoding].uFlags & NCP_UTF8 ||
bLoadASCIIasUTF8 )) ))))) && !(FileVars_IsNonUTF8(&fvCurFile) &&
(iSrcEncoding != CPI_UTF8 && iSrcEncoding != CPI_UTF8SIGN)))
{
- SetInternalCodePage(hwnd, SC_CP_UTF8);
+ SendMessage(hwnd,SCI_SETCODEPAGE,Encoding_GetSciCodePage(CPI_UTF8),0);
EditSetNewText(hwnd,"",0);
if (IsUTF8Signature(lpData)) {
EditSetNewText(hwnd,UTF8StringStart(lpData),cbData-3);
@@ -1353,20 +1373,20 @@ BOOL EditLoadFile(
LPWSTR lpDataWide;
int cbDataWide;
- if (iSrcEncoding != -1)
+ if (iSrcEncoding != CPI_NONE)
*iEncoding = iSrcEncoding;
else {
*iEncoding = FileVars_GetEncoding(&fvCurFile);
- if (*iEncoding == -1) {
+ if (*iEncoding == CPI_NONE) {
if (fvCurFile.mask & FV_ENCODING)
- *iEncoding = bLoadASCIIasUTF8 ? CPI_UTF8 : CPI_ANSI;
+ *iEncoding = CPI_ANSI_DEFAULT;
else {
- if (iWeakSrcEncoding == -1)
- *iEncoding = _iDefaultEncoding;
+ if (iWeakSrcEncoding == CPI_NONE)
+ *iEncoding = _iPrefEncoding;
else if (mEncoding[iWeakSrcEncoding].uFlags & NCP_INTERNAL)
*iEncoding = iDefaultEncoding;
else
- *iEncoding = _iDefaultEncoding;
+ *iEncoding = _iPrefEncoding;
}
}
}
@@ -1385,18 +1405,16 @@ BOOL EditLoadFile(
cbData = WideCharToMultiByte(CP_UTF8,0,lpDataWide,cbDataWide,lpData,(int)GlobalSize(lpData),NULL,NULL);
GlobalFree(lpDataWide);
- SetInternalCodePage(hwnd, SC_CP_UTF8);
+ SendMessage(hwnd,SCI_SETCODEPAGE,Encoding_GetSciCodePage(*iEncoding),0);
EditSetNewText(hwnd,"",0);
EditSetNewText(hwnd,lpData,cbData);
*iEOLMode = EditDetectEOLMode(hwnd,lpData,cbData);
GlobalFree(lpData);
}
-
else {
-
- *iEncoding = bLoadASCIIasUTF8 ? CPI_UTF8 : CPI_ANSI;
- SetInternalCodePage(hwnd, *iEncoding);
+ *iEncoding = iDefaultEncoding;
+ SendMessage(hwnd,SCI_SETCODEPAGE,Encoding_GetSciCodePage(*iEncoding),0);
EditSetNewText(hwnd,"",0);
EditSetNewText(hwnd,lpData,cbData);
*iEOLMode = EditDetectEOLMode(hwnd,lpData,cbData);
@@ -1473,11 +1491,6 @@ BOOL EditSaveFile(
if (bAutoStripBlanks)
EditStripTrailingBlanks(hwnd,TRUE);
- // convert to ANSI, if CP is set to UTF8
- if ((iEncoding == CPI_ANSI) && (iInternalCodePage == SC_CP_UTF8)) {
- EditSetNewEncoding(hwnd, CPI_UTF8, CPI_ANSI, FALSE, TRUE);
- }
-
// get text
cbData = (int)SendMessage(hwnd,SCI_GETLENGTH,0,0);
lpData = GlobalAlloc(GPTR, cbData + 4); //fix: +bom
diff --git a/src/Edit.h b/src/Edit.h
index 0ace8af70..4625a7297 100644
--- a/src/Edit.h
+++ b/src/Edit.h
@@ -137,10 +137,11 @@ extern int g_DOSEncoding;
#define NCP_UNICODE_REVERSE 16
#define NCP_UNICODE_BOM 32
#define NCP_8BIT 64
-#define NCP_INTERNAL (NCP_DEFAULT|NCP_UTF8|NCP_UTF8_SIGN|NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_UNICODE_BOM)
-#define NCP_RECODE 128
+#define NCP_ANSI 128
+#define NCP_INTERNAL (NCP_DEFAULT|NCP_UTF8|NCP_UTF8_SIGN|NCP_UNICODE|NCP_UNICODE_REVERSE|NCP_UNICODE_BOM|NCP_ANSI)
+#define NCP_RECODE 256
#define CPI_NONE -1
-#define CPI_ANSI 0
+#define CPI_ANSI_DEFAULT 0
#define CPI_OEM 1
#define CPI_UNICODEBOM 2
#define CPI_UNICODEBEBOM 3
@@ -171,6 +172,9 @@ void Encoding_AddToListView(HWND,int,BOOL);
BOOL Encoding_GetFromListView(HWND,int *);
void Encoding_AddToComboboxEx(HWND,int,BOOL);
BOOL Encoding_GetFromComboboxEx(HWND,int *);
+BOOL Encoding_IsDefault(int);
+BOOL Encoding_IsANSI(int);
+int Encoding_GetSciCodePage(int);
BOOL IsUnicode(const char*,int,LPBOOL,LPBOOL);
BOOL IsUTF8(const char*,int);
diff --git a/src/Helpers.c b/src/Helpers.c
index 2754a459a..2c2deb935 100644
--- a/src/Helpers.c
+++ b/src/Helpers.c
@@ -27,11 +27,6 @@
#include
#include "helpers.h"
#include "resource.h"
-#include "Edit.h"
-
-
-//=============================================================================
-extern iInternalCodePage;
//=============================================================================
@@ -496,16 +491,6 @@ void SetWindowTransparentMode(HWND hwnd,BOOL bTransparentMode)
}
-//=============================================================================
-//
-// SetInternalCodePage()
-//
-void SetInternalCodePage(HWND hwnd, int encoding) {
- iInternalCodePage = (encoding == CPI_ANSI) ? 0 : SC_CP_UTF8;
- SendMessage(hwnd, SCI_SETCODEPAGE, iInternalCodePage, 0);
-}
-
-
//=============================================================================
//
// CenterDlgInParent()
diff --git a/src/Helpers.h b/src/Helpers.h
index 8c1356b79..d09b22a25 100644
--- a/src/Helpers.h
+++ b/src/Helpers.h
@@ -83,7 +83,7 @@ BOOL IsFontAvailable(LPCWSTR);
BOOL SetWindowTitle(HWND,UINT,BOOL,UINT,LPCWSTR,int,BOOL,UINT,BOOL,LPCWSTR);
void SetWindowTransparentMode(HWND,BOOL);
-void SetInternalCodePage(HWND,int);
+
void CenterDlgInParent(HWND);
void GetDlgPos(HWND,LPINT,LPINT);
diff --git a/src/Notepad3.c b/src/Notepad3.c
index 2a96df52a..1f2bec603 100644
--- a/src/Notepad3.c
+++ b/src/Notepad3.c
@@ -222,8 +222,8 @@ int iEncoding;
int iOriginalEncoding;
int iEOLMode;
-int iInternalCodePage;
-int iInternalCharSet;
+int iDefaultCodePage;
+int iDefaultCharSet;
int iInitialLine;
int iInitialColumn;
@@ -919,7 +919,7 @@ HWND InitInstance(HINSTANCE hInstance,LPSTR pszCmdLine,int nCmdShow)
if (iSrcEncoding != -1) {
iEncoding = iSrcEncoding;
iOriginalEncoding = iSrcEncoding;
- SetInternalCodePage(hwndEdit, iEncoding);
+ SendMessage(hwndEdit,SCI_SETCODEPAGE,Encoding_GetSciCodePage(iEncoding),0);
}
}
@@ -2097,7 +2097,7 @@ void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam)
i = IDM_ENCODING_UTF8SIGN;
else if (mEncoding[iEncoding].uFlags & NCP_UTF8)
i = IDM_ENCODING_UTF8;
- else if (mEncoding[iEncoding].uFlags & NCP_DEFAULT)
+ else if (mEncoding[iEncoding].uFlags & NCP_ANSI)
i = IDM_ENCODING_ANSI;
else
i = -1;
@@ -2750,7 +2750,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
case IDM_ENCODING_UNICODEREV: iNewEncoding = CPI_UNICODEBEBOM; break;
case IDM_ENCODING_UTF8: iNewEncoding = CPI_UTF8; break;
case IDM_ENCODING_UTF8SIGN: iNewEncoding = CPI_UTF8SIGN; break;
- case IDM_ENCODING_ANSI: iNewEncoding = CPI_ANSI; break;
+ case IDM_ENCODING_ANSI: iNewEncoding = CPI_ANSI_DEFAULT; break;
}
}
@@ -2763,7 +2763,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
iOriginalEncoding = iNewEncoding;
}
else {
- if (iEncoding == CPI_ANSI || iNewEncoding == CPI_ANSI)
+ if (Encoding_IsANSI(iEncoding) || Encoding_IsANSI(iNewEncoding))
iOriginalEncoding = CPI_NONE;
iEncoding = iNewEncoding;
}
@@ -2785,21 +2785,21 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
WCHAR tchCurFile2[MAX_PATH];
- int iNewEncoding = CPI_NONE;
- if (iEncoding != CPI_ANSI)
- iNewEncoding = iEncoding;
+ // file to ANSI is default loading behaviour, recoding does not make sense
+ int iNewEncoding = Encoding_IsANSI(iEncoding) ? CPI_NONE : iEncoding;
+
if (iEncoding == CPI_UTF8SIGN)
iNewEncoding = CPI_UTF8;
- if (iEncoding == CPI_UNICODEBOM)
+ else if (iEncoding == CPI_UNICODEBOM)
iNewEncoding = CPI_UNICODE;
- if (iEncoding == CPI_UNICODEBEBOM)
+ else if (iEncoding == CPI_UNICODEBEBOM)
iNewEncoding = CPI_UNICODEBE;
if ((bModified || iEncoding != iOriginalEncoding) && MsgBox(MBOKCANCEL,IDS_ASK_RECODE) != IDOK)
return(0);
- if (RecodeDlg(hwnd,&iNewEncoding)) {
-
+ if (RecodeDlg(hwnd,&iNewEncoding))
+ {
lstrcpy(tchCurFile2,szCurFile);
iSrcEncoding = iNewEncoding;
FileLoad(TRUE,FALSE,TRUE,FALSE,tchCurFile2);
@@ -4517,7 +4517,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)
{
WCHAR tchCurFile2[MAX_PATH];
if (lstrlen(szCurFile)) {
- iSrcEncoding = CPI_ANSI;
+ iSrcEncoding = CPI_ANSI_DEFAULT;
lstrcpy(tchCurFile2,szCurFile);
FileLoad(FALSE,FALSE,TRUE,FALSE,tchCurFile2);
}
@@ -5685,21 +5685,22 @@ void LoadSettings()
bViewEOLs = IniSectionGetInt(pIniSection,L"ViewEOLs",0);
if (bViewEOLs) bViewEOLs = 1;
- // prefered default encoding is UTF-8 (used for internal codepage too: SC_CP_UTF8)
- iDefaultEncoding = IniSectionGetInt(pIniSection,L"DefaultEncoding", CPI_NONE);
+ iDefaultEncoding = IniSectionGetInt(pIniSection,L"DefaultEncoding", CPI_ANSI_DEFAULT);
+ // if DefaultEncoding is defined as CPI_NONE(-1) explicitly, set to system's current code-page
iDefaultEncoding = (iDefaultEncoding == CPI_NONE) ?
Encoding_MapIniSetting(TRUE, (int)GetACP()) :
Encoding_MapIniSetting(TRUE, iDefaultEncoding);
- if (!Encoding_IsValid(iDefaultEncoding)) iDefaultEncoding = CPI_UTF8;
-
- bLoadASCIIasUTF8 = IniSectionGetInt(pIniSection,L"LoadASCIIasUTF8",0);
- if (bLoadASCIIasUTF8) bLoadASCIIasUTF8 = 1;
- // re-adjust ANSI encoding
- iDefaultEncoding = ((iDefaultEncoding == CPI_ANSI) && (bLoadASCIIasUTF8 == 1)) ? CPI_UTF8 : iDefaultEncoding;
+ if (!Encoding_IsValid(iDefaultEncoding))
+ iDefaultEncoding = CPI_ANSI_DEFAULT;
+ // set flag for encoding default
+ mEncoding[iDefaultEncoding].uFlags |= NCP_DEFAULT;
bSkipUnicodeDetection = IniSectionGetInt(pIniSection, L"SkipUnicodeDetection", 0);
if (bSkipUnicodeDetection) bSkipUnicodeDetection = 1;
+ bLoadASCIIasUTF8 = IniSectionGetInt(pIniSection, L"LoadASCIIasUTF8", 0);
+ if (bLoadASCIIasUTF8) bLoadASCIIasUTF8 = 1;
+
bLoadNFOasOEM = IniSectionGetInt(pIniSection,L"LoadNFOasOEM",1);
if (bLoadNFOasOEM) bLoadNFOasOEM = 1;
@@ -5858,22 +5859,22 @@ void LoadSettings()
LocalFree(pIniSection);
- // define scintilla internal code page
- iInternalCodePage = (iDefaultEncoding == CPI_ANSI) ? 0 : SC_CP_UTF8;
-
+ // define scintilla internal code page, don't use Encoding_GetSciCodePage(iDefaultEncoding) here
+ iDefaultCodePage = (iDefaultEncoding == CPI_ANSI_DEFAULT) ? 0 : SC_CP_UTF8;
{
// check for Chinese, Japan, Korean DBCS code pages and switch accordingly
int acp = (int)GetACP();
if (acp == 932 || acp == 936 || acp == 949 || acp == 950 || acp == 1361)
- iInternalCodePage = acp;
+ iDefaultCodePage = acp;
}
+
{
CHARSETINFO ci;
- if (TranslateCharsetInfo((DWORD*)(UINT_PTR)iInternalCodePage, &ci, TCI_SRCCODEPAGE))
- iInternalCharSet = ci.ciCharset;
+ if (TranslateCharsetInfo((DWORD*)(UINT_PTR)iDefaultCodePage, &ci, TCI_SRCCODEPAGE))
+ iDefaultCharSet = ci.ciCharset;
else
- iInternalCharSet = ANSI_CHARSET;
+ iDefaultCharSet = ANSI_CHARSET;
}
// Scintilla Styles
@@ -5949,8 +5950,8 @@ void SaveSettings(BOOL bSaveSettingsNow)
IniSectionSetInt(pIniSection,L"ViewWhiteSpace",bViewWhiteSpace);
IniSectionSetInt(pIniSection,L"ViewEOLs",bViewEOLs);
IniSectionSetInt(pIniSection,L"DefaultEncoding",Encoding_MapIniSetting(FALSE,iDefaultEncoding));
- IniSectionSetInt(pIniSection,L"LoadASCIIasUTF8",bLoadASCIIasUTF8);
IniSectionSetInt(pIniSection,L"SkipUnicodeDetection",bSkipUnicodeDetection);
+ IniSectionSetInt(pIniSection,L"LoadASCIIasUTF8",bLoadASCIIasUTF8);
IniSectionSetInt(pIniSection,L"LoadNFOasOEM",bLoadNFOasOEM);
IniSectionSetInt(pIniSection,L"NoEncodingTags",bNoEncodingTags);
IniSectionSetInt(pIniSection,L"DefaultEOLMode",iDefaultEOLMode);
@@ -6950,7 +6951,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp
SendMessage(hwndEdit,SCI_SETEOLMODE,iLineEndings[iDefaultEOLMode],0);
iEncoding = iDefaultEncoding;
iOriginalEncoding = iDefaultEncoding;
- SetInternalCodePage(hwndEdit, iEncoding);
+ SendMessage(hwndEdit,SCI_SETCODEPAGE,Encoding_GetSciCodePage(iDefaultEncoding),0);
EditSetNewText(hwndEdit,"",0);
SetWindowTitle(hwndMain,uidsAppTitle,fIsElevated,IDS_UNTITLED,szCurFile,
iPathNameFormat,bModified || iEncoding != iOriginalEncoding,
@@ -7015,7 +7016,7 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp
iEncoding = iDefaultEncoding;
iOriginalEncoding = iDefaultEncoding;
}
- SetInternalCodePage(hwndEdit, iEncoding);
+ SendMessage(hwndEdit,SCI_SETCODEPAGE,Encoding_GetSciCodePage(iEncoding),0);
bReadOnly = FALSE;
EditSetNewText(hwndEdit,"",0);
}
diff --git a/src/Notepad3.rc b/src/Notepad3.rc
index e363faec1..815017b32 100644
--- a/src/Notepad3.rc
+++ b/src/Notepad3.rc
@@ -507,7 +507,7 @@ BEGIN
VK_F8, IDM_ENCODING_RECODE, VIRTKEY, NOINVERT
VK_F8, IDM_EDIT_INSERT_ENCODING, VIRTKEY, CONTROL, NOINVERT
VK_F8, CMD_RELOADNOFILEVARS, VIRTKEY, ALT, NOINVERT
- VK_F8, CMD_RELOADASCIIASUTF8, VIRTKEY, SHIFT, NOINVERT
+ VK_F8, IDM_ENCODING_UTF8, VIRTKEY, SHIFT, NOINVERT
VK_F9, IDM_ENCODING_SELECT, VIRTKEY, NOINVERT
VK_F9, IDM_EDIT_INSERT_FILENAME, VIRTKEY, CONTROL, NOINVERT
VK_F9, IDM_FILE_MANAGEFAV, VIRTKEY, ALT, NOINVERT
@@ -1421,8 +1421,8 @@ BEGIN
IDS_FIND_WRAPRE "Reached the beginning of the document, restarting search at the end."
IDS_NOTFOUND "The specified text was not found."
IDS_REPLCOUNT "%i occurrences of the specified text have been replaced."
- IDS_ASK_ENCODING "Switching the file encoding from ANSI to non-ANSI (and vice versa) may replace unsupported text with default characters, and the undo history will be cleared. Continue?"
- IDS_ASK_ENCODING2 "You are about to change the encoding of an empty file from ANSI to non-ANSI. Note that this will clear the undo history, as it can't be synchronized with the new encoding. Continue?"
+ IDS_ASK_ENCODING "Switching the file encoding from one encoding to another may replace unsupported text with default characters, and the undo history will be cleared. Continue?"
+ IDS_ASK_ENCODING2 "You are about to change the encoding of an empty file. Note that this will clear the undo history, as it can't be synchronized with the new encoding. Continue?"
IDS_ERR_ENCODINGNA "Code page conversion tables for the selected encoding are not available on your system."
IDS_ERR_UNICODE "Error converting this Unicode file.\nData will be lost if the file is saved!"
END
diff --git a/src/Styles.c b/src/Styles.c
index ecf935f2a..0c60d1b15 100644
--- a/src/Styles.c
+++ b/src/Styles.c
@@ -70,7 +70,6 @@ EDITLEXER lexDefault = { SCLEX_NULL, 63000, L"Default Text", L"txt; text; wtx;
/* 23 */ { SCI_SETEXTRAASCENT+SCI_SETEXTRADESCENT, 63123, L"2nd Extra Line Spacing (Size)", L"", L"" },
{ -1, 00000, L"", L"", L"" } } };
-
KEYWORDLIST KeyWords_HTML = {
"!doctype ^aria- ^data- a abbr accept accept-charset accesskey acronym action address align alink "
"alt and applet archive area article aside async audio autocomplete autofocus autoplay axis b "
@@ -2656,7 +2655,7 @@ int iDefaultLexer;
BOOL bAutoSelect;
int cxStyleSelectDlg;
int cyStyleSelectDlg;
-extern int iInternalCharSet;
+extern int iDefaultCharSet;
extern BOOL bHiliteCurrentLine;
@@ -4004,7 +4003,7 @@ BOOL Style_SelectFont(HWND hwnd,LPWSTR lpszStyle,int cchStyle,BOOL bDefaultStyle
if (bDefaultStyle &&
lf.lfCharSet != DEFAULT_CHARSET &&
lf.lfCharSet != ANSI_CHARSET &&
- lf.lfCharSet != iInternalCharSet) {
+ lf.lfCharSet != iDefaultCharSet) {
lstrcat(szNewStyle,L"; charset:");
wsprintf(tch,L"%i",lf.lfCharSet);
lstrcat(szNewStyle,tch);
From 74ec34dad3b0e4251c8a1f9acac2f072d45be9cf Mon Sep 17 00:00:00 2001
From: Rainer Kottenhoff
Date: Sat, 5 Aug 2017 22:01:46 +0200
Subject: [PATCH 6/6] integrate Scintillas DirectWrite technology: - Settings:
SciDirectWriteTech, SciFontQuality + values according to Scintilla
documentation + values = -1 (or not set) - don't call SCI API anyway -
should be the same as DEFAULT technology settings (values = 0)
SC_TECHNOLOGY_DEFAULT = 0, SC_TECHNOLOGY_DIRECTWRITE = 1,
SC_TECHNOLOGY_DIRECTWRITERETAIN = 2, SC_TECHNOLOGY_DIRECTWRITEDC = 3
SC_EFF_QUALITY_DEFAULT = 0, SC_EFF_QUALITY_NON_ANTIALIASED = 1,
SC_EFF_QUALITY_ANTIALIASED = 2, SC_EFF_QUALITY_LCD_OPTIMIZED = 3
---
distrib/Notepad3.ini | Bin 942 -> 1022 bytes
src/Notepad3.c | 32 ++++++++++++++++++++++++++++++++
src/SciCall.h | 16 ++++++++++++++++
3 files changed, 48 insertions(+)
diff --git a/distrib/Notepad3.ini b/distrib/Notepad3.ini
index db904acf420db17f40052599f8ee941613f9a557..41f9603bf5aef0f042c28004bdb492fa83a76d3c 100644
GIT binary patch
delta 88
zcmZ3-{*QgbHb(DYhGd3J1{WYMVn_wDOBlj|tV|%C$`Aq;$zZT$Fl69m;9`KNbz{h9
a$OFm;GL$kTGUR~ORsz)+Z{EoGmk|Ja!xL=)
delta 12
TcmeyzzK(svHpb0tOg|U_BU%L3
diff --git a/src/Notepad3.c b/src/Notepad3.c
index 1f2bec603..88b08f603 100644
--- a/src/Notepad3.c
+++ b/src/Notepad3.c
@@ -170,6 +170,23 @@ BOOL bTransparentMode;
BOOL bTransparentModeAvailable;
BOOL bShowToolbar;
BOOL bShowStatusbar;
+int iSciDirectWriteTech;
+int iSciFontQuality;
+
+const int DirectWriteTechnology[] = {
+ SC_TECHNOLOGY_DEFAULT
+ , SC_TECHNOLOGY_DIRECTWRITE
+ , SC_TECHNOLOGY_DIRECTWRITERETAIN
+ , SC_TECHNOLOGY_DIRECTWRITEDC
+};
+
+const int FontQuality[] = {
+ SC_EFF_QUALITY_DEFAULT
+ , SC_EFF_QUALITY_NON_ANTIALIASED
+ , SC_EFF_QUALITY_ANTIALIASED
+ , SC_EFF_QUALITY_LCD_OPTIMIZED
+};
+
typedef struct _wi
{
@@ -687,6 +704,13 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int n
if (!(hwnd = InitInstance(hInstance,lpCmdLine,nCmdShow)))
return FALSE;
+
+ if (IsVista()) {
+ if (iSciDirectWriteTech >= 0)
+ SciCall_SetTechnology(DirectWriteTechnology[iSciDirectWriteTech]);
+ if (iSciFontQuality >= 0)
+ SciCall_SetFontQuality(FontQuality[iSciFontQuality]);
+ }
hAccMain = LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_MAINWND));
hAccFindReplace = LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCFINDREPLACE));
@@ -5807,6 +5831,12 @@ void LoadSettings()
xFindReplaceDlg = IniSectionGetInt(pIniSection,L"FindReplaceDlgPosX",0);
yFindReplaceDlg = IniSectionGetInt(pIniSection,L"FindReplaceDlgPosY",0);
+ iSciDirectWriteTech = IniSectionGetInt(pIniSection,L"SciDirectWriteTech",-1);
+ iSciDirectWriteTech = max(min(iSciDirectWriteTech,3),-1);
+
+ iSciFontQuality = IniSectionGetInt(pIniSection,L"SciFontQuality",-1);
+ iSciFontQuality = max(min(iSciFontQuality,3),-1);
+
LoadIniSection(L"Settings2",pIniSection,cchIniSection);
bStickyWinPos = IniSectionGetInt(pIniSection,L"StickyWindowPosition",0);
@@ -5988,6 +6018,8 @@ void SaveSettings(BOOL bSaveSettingsNow)
IniSectionSetInt(pIniSection,L"FavoritesDlgSizeY",cyFavoritesDlg);
IniSectionSetInt(pIniSection,L"FindReplaceDlgPosX",xFindReplaceDlg);
IniSectionSetInt(pIniSection,L"FindReplaceDlgPosY",yFindReplaceDlg);
+ IniSectionSetInt(pIniSection, L"SciDrawTechnology",iSciDirectWriteTech);
+ IniSectionSetInt(pIniSection, L"SciFontQuality",iSciFontQuality);
SaveIniSection(L"Settings",pIniSection);
LocalFree(pIniSection);
diff --git a/src/SciCall.h b/src/SciCall.h
index 8ba899686..d6244ebe2 100644
--- a/src/SciCall.h
+++ b/src/SciCall.h
@@ -148,3 +148,19 @@ DeclareSciCallV1(EnsureVisible, ENSUREVISIBLE, int, line);
//
//
DeclareSciCallV2(SetProperty, SETPROPERTY, const char *, key, const char *, value);
+
+
+//=============================================================================
+//
+// SetTechnology
+//
+//
+DeclareSciCallV1(SetTechnology, SETTECHNOLOGY, int, technology);
+
+
+//=============================================================================
+//
+// SetFontQuality
+//
+//
+DeclareSciCallV1(SetFontQuality, SETFONTQUALITY, int, quality);