mirror of
https://github.com/rizonesoft/Notepad3.git
synced 2026-06-14 21:09:05 +08:00
Merge pull request #1625 from RaiKoHoff/DevNewFeatures
Small fixes on "Relaunch Elevated" functionality
This commit is contained in:
commit
b921df31b1
@ -1 +1 @@
|
||||
2624
|
||||
2625
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<assemblyIdentity
|
||||
name="Notepad3"
|
||||
processorArchitecture="*"
|
||||
version="5.19.911.2624"
|
||||
version="5.19.911.2625"
|
||||
type="win32"
|
||||
/>
|
||||
<description>Notepad3 BETA</description>
|
||||
|
||||
152
src/Edit.c
152
src/Edit.c
@ -1550,46 +1550,47 @@ void EditInvertCase(HWND hwnd)
|
||||
if (Sci_IsMultiOrRectangleSelection())
|
||||
{
|
||||
InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_SELRECT);
|
||||
return;
|
||||
}
|
||||
const DocPos iSelStart = SciCall_GetSelectionStart();
|
||||
const DocPos iSelEnd = SciCall_GetSelectionEnd();
|
||||
const DocPos iSelSize = SciCall_GetSelText(NULL);
|
||||
else {
|
||||
const DocPos iSelStart = SciCall_GetSelectionStart();
|
||||
const DocPos iSelEnd = SciCall_GetSelectionEnd();
|
||||
const DocPos iSelSize = SciCall_GetSelText(NULL);
|
||||
|
||||
LPSTR pszText = AllocMem(iSelSize, HEAP_ZERO_MEMORY);
|
||||
LPWSTR pszTextW = AllocMem(iSelSize * sizeof(WCHAR), HEAP_ZERO_MEMORY);
|
||||
if (!pszText || !pszTextW) {
|
||||
FreeMem(pszText);
|
||||
FreeMem(pszTextW);
|
||||
return;
|
||||
}
|
||||
|
||||
SciCall_GetSelText(pszText);
|
||||
|
||||
int const cchTextW = MultiByteToWideChar(Encoding_SciCP, 0, pszText, (MBWC_DocPos_Cast)(iSelSize - 1),
|
||||
pszTextW, (MBWC_DocPos_Cast)iSelSize);
|
||||
|
||||
bool bChanged = false;
|
||||
for (int i = 0; i < cchTextW; i++) {
|
||||
if (IsCharUpperW(pszTextW[i])) {
|
||||
pszTextW[i] = LOWORD(CharLowerW((LPWSTR)(LONG_PTR)MAKELONG(pszTextW[i], 0)));
|
||||
bChanged = true;
|
||||
LPSTR pszText = AllocMem(iSelSize, HEAP_ZERO_MEMORY);
|
||||
LPWSTR pszTextW = AllocMem(iSelSize * sizeof(WCHAR), HEAP_ZERO_MEMORY);
|
||||
if (!pszText || !pszTextW) {
|
||||
FreeMem(pszText);
|
||||
FreeMem(pszTextW);
|
||||
}
|
||||
else if (IsCharLowerW(pszTextW[i])) {
|
||||
pszTextW[i] = LOWORD(CharUpperW((LPWSTR)(LONG_PTR)MAKELONG(pszTextW[i], 0)));
|
||||
bChanged = true;
|
||||
else {
|
||||
SciCall_GetSelText(pszText);
|
||||
|
||||
int const cchTextW = MultiByteToWideChar(Encoding_SciCP, 0, pszText, (MBWC_DocPos_Cast)(iSelSize - 1),
|
||||
pszTextW, (MBWC_DocPos_Cast)iSelSize);
|
||||
|
||||
bool bChanged = false;
|
||||
for (int i = 0; i < cchTextW; i++) {
|
||||
if (IsCharUpperW(pszTextW[i])) {
|
||||
pszTextW[i] = LOWORD(CharLowerW((LPWSTR)(LONG_PTR)MAKELONG(pszTextW[i], 0)));
|
||||
bChanged = true;
|
||||
}
|
||||
else if (IsCharLowerW(pszTextW[i])) {
|
||||
pszTextW[i] = LOWORD(CharUpperW((LPWSTR)(LONG_PTR)MAKELONG(pszTextW[i], 0)));
|
||||
bChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (bChanged) {
|
||||
WideCharToMultiByte(Encoding_SciCP, 0, pszTextW, cchTextW,
|
||||
pszText, (MBWC_DocPos_Cast)SizeOfMem(pszText), NULL, NULL);
|
||||
SciCall_Clear();
|
||||
SciCall_AddText((iSelEnd - iSelStart), pszText);
|
||||
SciCall_SetSel(iAnchorPos, iCurPos);
|
||||
}
|
||||
FreeMem(pszText);
|
||||
FreeMem(pszTextW);
|
||||
}
|
||||
}
|
||||
|
||||
if (bChanged) {
|
||||
WideCharToMultiByte(Encoding_SciCP, 0, pszTextW, cchTextW,
|
||||
pszText, (MBWC_DocPos_Cast)SizeOfMem(pszText), NULL, NULL);
|
||||
SciCall_Clear();
|
||||
SciCall_AddText((iSelEnd - iSelStart), pszText);
|
||||
SciCall_SetSel(iAnchorPos, iCurPos);
|
||||
}
|
||||
FreeMem(pszText);
|
||||
FreeMem(pszTextW);
|
||||
_END_UNDO_ACTION_
|
||||
}
|
||||
}
|
||||
@ -2041,53 +2042,51 @@ void EditHex2Char(HWND hwnd)
|
||||
char ch[32] = { L'\0' };
|
||||
if (SciCall_GetSelText(NULL) <= COUNTOF(ch))
|
||||
{
|
||||
_BEGIN_UNDO_ACTION_
|
||||
|
||||
bool bTrySelExpand = false;
|
||||
|
||||
SciCall_GetSelText(ch);
|
||||
|
||||
if (StrChrIA(ch, ' ') || StrChrIA(ch, '\t') || StrChrIA(ch, '\r') || StrChrIA(ch, '\n') || StrChrIA(ch, '-')) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (StrCmpNIA(ch, "0x", 2) == 0 || StrCmpNIA(ch, "\\x", 2) == 0 || StrCmpNIA(ch, "\\u", 2) == 0) {
|
||||
ch[0] = '0';
|
||||
ch[1] = 'x';
|
||||
}
|
||||
else if (StrChrIA("xu", ch[0])) {
|
||||
ch[0] = '0';
|
||||
bTrySelExpand = true;
|
||||
}
|
||||
else
|
||||
return;
|
||||
|
||||
unsigned int i = 0;
|
||||
if (sscanf_s(ch, "%x", &i) == 1) {
|
||||
int cch = 0;
|
||||
if (i == 0) {
|
||||
ch[0] = 0;
|
||||
cch = 1;
|
||||
if (!((StrChrIA(ch, ' ') || StrChrIA(ch, '\t') || StrChrIA(ch, '\r') || StrChrIA(ch, '\n') || StrChrIA(ch, '-'))))
|
||||
{
|
||||
if (StrCmpNIA(ch, "0x", 2) == 0 || StrCmpNIA(ch, "\\x", 2) == 0 || StrCmpNIA(ch, "\\u", 2) == 0) {
|
||||
ch[0] = '0';
|
||||
ch[1] = 'x';
|
||||
}
|
||||
else if (StrChrIA("xu", ch[0])) {
|
||||
ch[0] = '0';
|
||||
bTrySelExpand = true;
|
||||
}
|
||||
else {
|
||||
WCHAR wch[8] = { L'\0' };
|
||||
StringCchPrintfW(wch, COUNTOF(wch), L"%lc", (WCHAR)i);
|
||||
cch = WideCharToMultiByte(Encoding_SciCP, 0, wch, -1, ch, COUNTOF(ch), NULL, NULL) - 1;
|
||||
|
||||
if (bTrySelExpand && (SciCall_GetCharAt(iSelStart - 1) == '\\')) {
|
||||
--iSelStart;
|
||||
if (iCurPos < iAnchorPos) { --iCurPos; } else { --iAnchorPos; }
|
||||
}
|
||||
return;
|
||||
}
|
||||
EditSetSelectionEx(hwnd, iSelStart, iSelEnd, -1, -1);
|
||||
SciCall_ReplaceSel(ch);
|
||||
if (iCurPos < iAnchorPos)
|
||||
EditSetSelectionEx(hwnd, iCurPos + cch, iCurPos, -1, -1);
|
||||
else
|
||||
EditSetSelectionEx(hwnd, iAnchorPos, iAnchorPos + cch, -1, -1);
|
||||
_BEGIN_UNDO_ACTION_
|
||||
unsigned int i = 0;
|
||||
if (sscanf_s(ch, "%x", &i) == 1) {
|
||||
int cch = 0;
|
||||
if (i == 0) {
|
||||
ch[0] = 0;
|
||||
cch = 1;
|
||||
}
|
||||
else {
|
||||
WCHAR wch[8] = { L'\0' };
|
||||
StringCchPrintfW(wch, COUNTOF(wch), L"%lc", (WCHAR)i);
|
||||
cch = WideCharToMultiByte(Encoding_SciCP, 0, wch, -1, ch, COUNTOF(ch), NULL, NULL) - 1;
|
||||
|
||||
if (bTrySelExpand && (SciCall_GetCharAt(iSelStart - 1) == '\\')) {
|
||||
--iSelStart;
|
||||
if (iCurPos < iAnchorPos) { --iCurPos; }
|
||||
else { --iAnchorPos; }
|
||||
}
|
||||
}
|
||||
EditSetSelectionEx(hwnd, iSelStart, iSelEnd, -1, -1);
|
||||
SciCall_ReplaceSel(ch);
|
||||
if (iCurPos < iAnchorPos)
|
||||
EditSetSelectionEx(hwnd, iCurPos + cch, iCurPos, -1, -1);
|
||||
else
|
||||
EditSetSelectionEx(hwnd, iAnchorPos, iAnchorPos + cch, -1, -1);
|
||||
}
|
||||
_END_UNDO_ACTION_
|
||||
}
|
||||
_END_UNDO_ACTION_
|
||||
}
|
||||
}
|
||||
|
||||
@ -3666,8 +3665,6 @@ void EditCompressBlanks(HWND hwnd)
|
||||
const DocLn iLineStart = SciCall_LineFromPosition(iSelStartPos);
|
||||
const DocLn iLineEnd = SciCall_LineFromPosition(iSelEndPos);
|
||||
|
||||
_BEGIN_UNDO_ACTION_
|
||||
|
||||
if (SciCall_IsSelectionRectangle())
|
||||
{
|
||||
if (bIsSelEmpty) { return; }
|
||||
@ -3677,6 +3674,7 @@ void EditCompressBlanks(HWND hwnd)
|
||||
const DocPos vSpcAnchorMainPos = SciCall_GetRectangularSelectionAnchorVirtualSpace();
|
||||
const DocPos vSpcCaretMainPos = SciCall_GetRectangularSelectionCaretVirtualSpace();
|
||||
|
||||
_BEGIN_UNDO_ACTION_
|
||||
_IGNORE_NOTIFY_CHANGE_;
|
||||
|
||||
DocPos iMaxLineLen = Sci_GetRangeMaxLineLength(iLineStart, iLineEnd);
|
||||
@ -3727,6 +3725,7 @@ void EditCompressBlanks(HWND hwnd)
|
||||
SciCall_SetRectangularSelectionCaretVirtualSpace(vSpcCaretMainPos);
|
||||
}
|
||||
_OBSERVE_NOTIFY_CHANGE_;
|
||||
_END_UNDO_ACTION_
|
||||
}
|
||||
else if (Sci_IsMultiOrRectangleSelection()) {
|
||||
// @@@ not implemented
|
||||
@ -3734,6 +3733,7 @@ void EditCompressBlanks(HWND hwnd)
|
||||
}
|
||||
else // SC_SEL_LINES | SC_SEL_STREAM
|
||||
{
|
||||
_BEGIN_UNDO_ACTION_
|
||||
_IGNORE_NOTIFY_CHANGE_;
|
||||
|
||||
const DocPos iCurPos = SciCall_GetCurrentPos();
|
||||
@ -3825,8 +3825,8 @@ void EditCompressBlanks(HWND hwnd)
|
||||
if (pszOut) { FreeMem(pszOut); }
|
||||
|
||||
_OBSERVE_NOTIFY_CHANGE_;
|
||||
_END_UNDO_ACTION_
|
||||
}
|
||||
_END_UNDO_ACTION_
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -826,7 +826,7 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
|
||||
if (s_flagPasteBoard) {
|
||||
StringCchCat(s_wchWndClass, COUNTOF(s_wchWndClass), L"B");
|
||||
}
|
||||
// Relaunch with elevated privileges
|
||||
// Try to Relaunch with elevated privileges
|
||||
if (RelaunchElevated(NULL)) {
|
||||
return 0;
|
||||
}
|
||||
@ -1237,7 +1237,9 @@ HWND InitInstance(HINSTANCE hInstance,LPCWSTR pszCmdLine,int nCmdShow)
|
||||
}
|
||||
SciCall_SetSavePoint();
|
||||
_SetSaveNeededFlag(true);
|
||||
FileSave(true, false, false, false, Flags.bPreserveFileModTime); // issued from elevation instances
|
||||
if (StrIsNotEmpty(Globals.CurrentFile)) {
|
||||
FileSave(true, false, false, false, Flags.bPreserveFileModTime); // issued from elevation instances
|
||||
}
|
||||
}
|
||||
if (s_flagJumpTo) { // Jump to position
|
||||
EditJumpTo(Globals.hwndEdit,s_iInitialLine,s_iInitialColumn);
|
||||
@ -9653,50 +9655,56 @@ bool DoElevatedRelaunch(EditFileIOStatus* pFioStatus)
|
||||
WCHAR wchFlags[32] = { L'\0' };
|
||||
if (s_flagAppIsClosing) { StringCchCopy(wchFlags, COUNTOF(wchFlags), L"/UC"); }
|
||||
|
||||
WININFO wi = GetMyWindowPlacement(Globals.hwndMain, NULL);
|
||||
DocPos const iCurPos = SciCall_GetCurrentPos();
|
||||
int const iCurLn = (int)SciCall_LineFromPosition(iCurPos) + 1;
|
||||
int const iCurCol = (int)SciCall_GetColumn(iCurPos) + 1;
|
||||
WININFO const wi = GetMyWindowPlacement(Globals.hwndMain, NULL);
|
||||
|
||||
if (s_lpOrigFileArg) {
|
||||
lpArgs = StrCutI(lpArgs, s_lpOrigFileArg); // remove file from argument list
|
||||
}
|
||||
StringCchPrintf(szArguments, COUNTOF(szArguments),
|
||||
L"%s /pos %i,%i,%i,%i,%i %s", wchFlags, wi.x, wi.y, wi.cx, wi.cy, wi.max, lpArgs);
|
||||
L"%s /pos %i,%i,%i,%i,%i /g %i,%i %s", wchFlags, wi.x, wi.y, wi.cx, wi.cy, wi.max, iCurLn, iCurCol, lpArgs);
|
||||
|
||||
WCHAR lpTempPathBuffer[MAX_PATH] = { L'\0' };
|
||||
WCHAR szTempFileName[MAX_PATH] = { L'\0' };
|
||||
|
||||
if (StrIsNotEmpty(Globals.CurrentFile))
|
||||
const WCHAR* szCurFile = StrIsNotEmpty(Globals.CurrentFile) ? Globals.CurrentFile : L".\\Untitled.txt";
|
||||
|
||||
WCHAR tchBase[MAX_PATH] = { L'\0' };
|
||||
StringCchCopy(tchBase, COUNTOF(tchBase), szCurFile);
|
||||
PathStripPath(tchBase);
|
||||
|
||||
if (GetTempPath(MAX_PATH, lpTempPathBuffer) && GetTempFileName(lpTempPathBuffer, TEXT("NP3"), 0, szTempFileName))
|
||||
{
|
||||
WCHAR tchBase[MAX_PATH] = { L'\0' };
|
||||
StringCchCopy(tchBase, COUNTOF(tchBase), Globals.CurrentFile);
|
||||
PathStripPath(tchBase);
|
||||
size_t const len = StringCchLen(szTempFileName, MAX_PATH); // replace possible unknown extension
|
||||
LPWSTR p = PathFindExtension(szTempFileName);
|
||||
LPCWSTR q = PathFindExtension(szCurFile);
|
||||
if ((p && *p) && (q && *q)) {
|
||||
StringCchCopy(p, (MAX_PATH - len), q);
|
||||
}
|
||||
|
||||
if (GetTempPath(MAX_PATH, lpTempPathBuffer) && GetTempFileName(lpTempPathBuffer, TEXT("NP3"), 0, szTempFileName))
|
||||
if (pFioStatus && FileIO(false, szTempFileName, true, true, false, true, pFioStatus, true, false))
|
||||
{
|
||||
size_t const len = StringCchLen(szTempFileName, MAX_PATH); // replace possible unknown extension
|
||||
LPWSTR p = PathFindExtension(szTempFileName);
|
||||
LPCWSTR q = PathFindExtension(Globals.CurrentFile);
|
||||
if ((p && *p) && (q && *q)) {
|
||||
StringCchCopy(p, (MAX_PATH - len), q);
|
||||
}
|
||||
// preserve encoding
|
||||
WCHAR wchEncoding[80];
|
||||
Encoding_GetNameW(Encoding_Current(CPI_GET), wchEncoding, COUNTOF(wchEncoding));
|
||||
|
||||
if (pFioStatus && FileIO(false, szTempFileName, true, true, false, true, pFioStatus, true, false))
|
||||
{
|
||||
// preserve encoding
|
||||
WCHAR wchEncoding[80];
|
||||
Encoding_GetNameW(Encoding_Current(CPI_GET), wchEncoding, COUNTOF(wchEncoding));
|
||||
StringCchPrintf(szArguments, COUNTOF(szArguments),
|
||||
L"/%s %s /pos %i,%i,%i,%i,%i /g %i,%i /tmpfbuf=\"%s\" %s", wchEncoding, wchFlags, wi.x, wi.y, wi.cx, wi.cy, wi.max, iCurLn, iCurCol, szTempFileName, lpArgs);
|
||||
|
||||
StringCchPrintf(szArguments, COUNTOF(szArguments),
|
||||
L"/%s %s /pos %i,%i,%i,%i,%i /tmpfbuf=\"%s\" %s", wchEncoding, wchFlags, wi.x, wi.y, wi.cx, wi.cy, wi.max, szTempFileName, lpArgs);
|
||||
|
||||
if (!StrStrI(szArguments, tchBase)) {
|
||||
if (!StrStrI(szArguments, tchBase)) {
|
||||
if (StrIsNotEmpty(Globals.CurrentFile)) {
|
||||
StringCchPrintf(szArguments, COUNTOF(szArguments), L"%s \"%s\"", szArguments, Globals.CurrentFile);
|
||||
}
|
||||
}
|
||||
FreeMem(lpExe);
|
||||
FreeMem(lpArgs);
|
||||
}
|
||||
FreeMem(lpExe);
|
||||
FreeMem(lpArgs);
|
||||
}
|
||||
|
||||
SaveSettings(false);
|
||||
|
||||
if (RelaunchElevated(szArguments)) {
|
||||
// set no change and quit
|
||||
SciCall_SetSavePoint();
|
||||
@ -10274,7 +10282,7 @@ bool RelaunchMultiInst() {
|
||||
// RelaunchElevated()
|
||||
//
|
||||
//
|
||||
bool RelaunchElevated(LPWSTR lpArgs)
|
||||
bool RelaunchElevated(LPWSTR lpNewCmdLnArgs)
|
||||
{
|
||||
if (!IsVista() || s_bIsElevated || !s_flagRelaunchElevated || s_flagDisplayHelp) { return false; }
|
||||
|
||||
@ -10282,30 +10290,26 @@ bool RelaunchElevated(LPWSTR lpArgs)
|
||||
si.cb = sizeof(STARTUPINFO);
|
||||
GetStartupInfo(&si);
|
||||
|
||||
WCHAR lpExe[MAX_PATH] = { L'\0' };
|
||||
WCHAR szOrigArgs[2032] = { L'\0' };
|
||||
|
||||
LPWSTR lpCmdLine = GetCommandLine();
|
||||
size_t wlen = StringCchLenW(lpCmdLine, 0) + 2UL;
|
||||
ExtractFirstArgument(lpCmdLine, lpExe, szOrigArgs, (int)wlen);
|
||||
// override
|
||||
GetModuleFileName(NULL, lpExe, COUNTOF(lpExe)); // full path
|
||||
if (lpNewCmdLnArgs) {
|
||||
StringCchCopy(szOrigArgs, COUNTOF(szOrigArgs), lpNewCmdLnArgs);
|
||||
}
|
||||
|
||||
WCHAR lpExe[MAX_PATH] = { L'\0' };
|
||||
WCHAR szArgs[2032] = { L'\0' };
|
||||
WCHAR szArguments[2032] = { L'\0' };
|
||||
|
||||
ExtractFirstArgument(lpCmdLine, lpExe, szArgs, (int)wlen);
|
||||
|
||||
if (lpArgs) {
|
||||
StringCchCopy(szArgs, COUNTOF(szArgs), lpArgs); // override
|
||||
}
|
||||
|
||||
if (StrStrI(szArgs, L"/f ") || StrStrI(szArgs, L"-f "))
|
||||
if (StrStrI(szOrigArgs, L"/f ") || StrStrI(szOrigArgs, L"-f ") || StrIsEmpty(Globals.IniFile))
|
||||
{
|
||||
StringCchCopy(szArguments, COUNTOF(szArguments), szArgs);
|
||||
StringCchCopy(szArguments, COUNTOF(szArguments), szOrigArgs);
|
||||
}
|
||||
else {
|
||||
if (StrIsNotEmpty(Globals.IniFile)) {
|
||||
StringCchPrintf(szArguments, COUNTOF(szArguments), L"/f \"%s\" %s", Globals.IniFile, szArgs);
|
||||
}
|
||||
else {
|
||||
StringCchCopy(szArguments, COUNTOF(szArguments), szArgs);
|
||||
}
|
||||
StringCchPrintf(szArguments, COUNTOF(szArguments), L"/f \"%s\" %s", Globals.IniFile, szOrigArgs);
|
||||
}
|
||||
|
||||
if (StrIsNotEmpty(szArguments)) {
|
||||
|
||||
@ -123,7 +123,7 @@ void BeginWaitCursor(LPCWSTR text);
|
||||
void EndWaitCursor();
|
||||
bool ActivatePrevInst();
|
||||
bool RelaunchMultiInst();
|
||||
bool RelaunchElevated(LPWSTR lpArgs);
|
||||
bool RelaunchElevated(LPWSTR lpNewCmdLnArgs);
|
||||
bool DoElevatedRelaunch(EditFileIOStatus* pFioStatus);
|
||||
void SnapToWinInfoPos(HWND hwnd, const WININFO* pWinInfo, bool bFullWorkArea);
|
||||
void ShowNotifyIcon(HWND hwnd, bool bAdd);
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
#define VERSION_MAJOR 5
|
||||
#define VERSION_MINOR 19
|
||||
#define VERSION_REV 911
|
||||
#define VERSION_BUILD 2624
|
||||
#define VERSION_BUILD 2625
|
||||
#define SCINTILLA_VER 420
|
||||
#define ONIGURUMA_REGEX_VER 6.9.3
|
||||
#define UCHARDET_VER 2018.09.27
|
||||
|
||||
Loading…
Reference in New Issue
Block a user