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);