https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3bf2f30cf27ce5b6cd923…
commit 3bf2f30cf27ce5b6cd92382d2698d49bea758266
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Tue May 15 11:28:33 2018 +0200
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Tue May 15 11:28:33 2018 +0200
[USETUP] Add support for HOME, END, DEL, LEFT and RIGHT keys to partition size and
install path edit fields.
CORE-13975
---
base/setup/usetup/interface/consup.c | 12 +--
base/setup/usetup/interface/usetup.c | 187 ++++++++++++++++++++++++++++++-----
2 files changed, 164 insertions(+), 35 deletions(-)
diff --git a/base/setup/usetup/interface/consup.c b/base/setup/usetup/interface/consup.c
index 004f9dabf8..d682a73959 100644
--- a/base/setup/usetup/interface/consup.c
+++ b/base/setup/usetup/interface/consup.c
@@ -334,20 +334,12 @@ CONSOLE_SetInputTextXY(
&Written);
coPos.X += Length;
- FillConsoleOutputCharacterA(
- StdOutput,
- '_',
- 1,
- coPos,
- &Written);
-
- if (len > Length + 1)
+ if (len > Length)
{
- coPos.X++;
FillConsoleOutputCharacterA(
StdOutput,
' ',
- len - Length - 1,
+ len - Length,
coPos,
&Written);
}
diff --git a/base/setup/usetup/interface/usetup.c b/base/setup/usetup/interface/usetup.c
index 38085569d7..dbd024d076 100644
--- a/base/setup/usetup/interface/usetup.c
+++ b/base/setup/usetup/interface/usetup.c
@@ -1774,7 +1774,7 @@ ShowPartitionSizeInputBox(SHORT Left,
DWORD Written;
CHAR Buffer[128];
WCHAR PartitionSizeBuffer[100];
- ULONG Index;
+ ULONG Length, Pos;
WCHAR ch;
SHORT iLeft;
SHORT iTop;
@@ -1810,11 +1810,14 @@ ShowPartitionSizeInputBox(SHORT Left,
&Written);
swprintf(PartitionSizeBuffer, L"%lu", MaxSize);
- Index = wcslen(PartitionSizeBuffer);
+ Length = wcslen(PartitionSizeBuffer);
+ Pos = Length;
CONSOLE_SetInputTextXY(iLeft,
iTop,
PARTITION_SIZE_INPUT_FIELD_LENGTH,
PartitionSizeBuffer);
+ CONSOLE_SetCursorXY(iLeft + Length, iTop);
+ CONSOLE_SetCursorType(TRUE, TRUE);
while (TRUE)
{
@@ -1826,11 +1829,13 @@ ShowPartitionSizeInputBox(SHORT Left,
if (Quit != NULL)
*Quit = TRUE;
- PartitionSizeBuffer[0] = 0;
+ PartitionSizeBuffer[0] = UNICODE_NULL;
+ CONSOLE_SetCursorType(TRUE, FALSE);
break;
}
else if (Ir.Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
{
+ CONSOLE_SetCursorType(TRUE, FALSE);
break;
}
else if (Ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESCAPE */
@@ -1838,35 +1843,100 @@ ShowPartitionSizeInputBox(SHORT Left,
if (Cancel != NULL)
*Cancel = TRUE;
- PartitionSizeBuffer[0] = 0;
+ PartitionSizeBuffer[0] = UNICODE_NULL;
+ CONSOLE_SetCursorType(TRUE, FALSE);
break;
}
- else if ((Ir.Event.KeyEvent.wVirtualKeyCode == VK_BACK) && /* BACKSPACE
*/
- (Index > 0))
+ else if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir.Event.KeyEvent.wVirtualKeyCode == VK_HOME)) /* HOME */
{
- Index--;
- PartitionSizeBuffer[Index] = 0;
-
- CONSOLE_SetInputTextXY(iLeft,
- iTop,
- PARTITION_SIZE_INPUT_FIELD_LENGTH,
- PartitionSizeBuffer);
+ Pos = 0;
+ CONSOLE_SetCursorXY(iLeft + Pos, iTop);
+ }
+ else if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir.Event.KeyEvent.wVirtualKeyCode == VK_END)) /* END */
+ {
+ Pos = Length;
+ CONSOLE_SetCursorXY(iLeft + Pos, iTop);
+ }
+ else if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir.Event.KeyEvent.wVirtualKeyCode == VK_LEFT)) /* LEFT */
+ {
+ if (Pos > 0)
+ {
+ Pos--;
+ CONSOLE_SetCursorXY(iLeft + Pos, iTop);
+ }
}
- else if ((Ir.Event.KeyEvent.uChar.AsciiChar != 0x00) &&
- (Index < PARTITION_SIZE_INPUT_FIELD_LENGTH))
+ else if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir.Event.KeyEvent.wVirtualKeyCode == VK_RIGHT)) /* RIGHT */
{
- ch = (WCHAR)Ir.Event.KeyEvent.uChar.AsciiChar;
+ if (Pos < Length)
+ {
+ Pos++;
+ CONSOLE_SetCursorXY(iLeft + Pos, iTop);
+ }
+ }
+ else if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir.Event.KeyEvent.wVirtualKeyCode == VK_DELETE)) /* DEL */
+ {
+ if (Pos < Length)
+ {
+ memmove(&PartitionSizeBuffer[Pos],
+ &PartitionSizeBuffer[Pos + 1],
+ (Length - Pos - 1) * sizeof(WCHAR));
+ PartitionSizeBuffer[Length - 1] = UNICODE_NULL;
- if ((ch >= L'0') && (ch <= L'9'))
+ Length--;
+ CONSOLE_SetInputTextXY(iLeft,
+ iTop,
+ PARTITION_SIZE_INPUT_FIELD_LENGTH,
+ PartitionSizeBuffer);
+ CONSOLE_SetCursorXY(iLeft + Pos, iTop);
+ }
+ }
+ else if (Ir.Event.KeyEvent.wVirtualKeyCode == VK_BACK) /* BACKSPACE */
+ {
+ if (Pos > 0)
{
- PartitionSizeBuffer[Index] = ch;
- Index++;
- PartitionSizeBuffer[Index] = 0;
+ if (Pos < Length)
+ memmove(&PartitionSizeBuffer[Pos - 1],
+ &PartitionSizeBuffer[Pos],
+ (Length - Pos) * sizeof(WCHAR));
+ PartitionSizeBuffer[Length - 1] = UNICODE_NULL;
+ Pos--;
+ Length--;
CONSOLE_SetInputTextXY(iLeft,
iTop,
PARTITION_SIZE_INPUT_FIELD_LENGTH,
PartitionSizeBuffer);
+ CONSOLE_SetCursorXY(iLeft + Pos, iTop);
+ }
+ }
+ else if (Ir.Event.KeyEvent.uChar.AsciiChar != 0x00)
+ {
+ if (Length < PARTITION_SIZE_INPUT_FIELD_LENGTH)
+ {
+ ch = (WCHAR)Ir.Event.KeyEvent.uChar.AsciiChar;
+
+ if ((ch >= L'0') && (ch <= L'9'))
+ {
+ if (Pos < Length)
+ memmove(&PartitionSizeBuffer[Pos + 1],
+ &PartitionSizeBuffer[Pos],
+ (Length - Pos) * sizeof(WCHAR));
+ PartitionSizeBuffer[Length + 1] = UNICODE_NULL;
+ PartitionSizeBuffer[Pos] = ch;
+
+ Pos++;
+ Length++;
+ CONSOLE_SetInputTextXY(iLeft,
+ iTop,
+ PARTITION_SIZE_INPUT_FIELD_LENGTH,
+ PartitionSizeBuffer);
+ CONSOLE_SetCursorXY(iLeft + Pos, iTop);
+ }
}
}
}
@@ -3265,7 +3335,7 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
PPARTENTRY PartEntry;
WCHAR InstallDir[51];
WCHAR c;
- ULONG Length;
+ ULONG Length, Pos;
/* We do not need the filesystem list any more */
if (FileSystemList != NULL)
@@ -3291,7 +3361,10 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
wcscpy(InstallDir, L"\\ReactOS");
Length = wcslen(InstallDir);
+ Pos = Length;
CONSOLE_SetInputTextXY(8, 11, 51, InstallDir);
+ CONSOLE_SetCursorXY(8 + Pos, 11);
+ CONSOLE_SetCursorType(TRUE, TRUE);
MUIDisplayPage(INSTALL_DIRECTORY_PAGE);
// FIXME: Check the validity of the InstallDir; however what to do
@@ -3312,13 +3385,63 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
+ CONSOLE_SetCursorType(TRUE, FALSE);
+
if (ConfirmQuit(Ir) != FALSE)
return QUIT_PAGE;
+ CONSOLE_SetCursorType(TRUE, TRUE);
break;
}
+ else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DELETE)) /* DEL */
+ {
+ if (Pos < Length)
+ {
+ memmove(&InstallDir[Pos],
+ &InstallDir[Pos + 1],
+ (Length - Pos - 1) * sizeof(WCHAR));
+ InstallDir[Length - 1] = UNICODE_NULL;
+
+ Length--;
+ CONSOLE_SetInputTextXY(8, 11, 51, InstallDir);
+ CONSOLE_SetCursorXY(8 + Pos, 11);
+ }
+ }
+ else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir->Event.KeyEvent.wVirtualKeyCode == VK_HOME)) /* HOME */
+ {
+ Pos = 0;
+ CONSOLE_SetCursorXY(8 + Pos, 11);
+ }
+ else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir->Event.KeyEvent.wVirtualKeyCode == VK_END)) /* END */
+ {
+ Pos = Length;
+ CONSOLE_SetCursorXY(8 + Pos, 11);
+ }
+ else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir->Event.KeyEvent.wVirtualKeyCode == VK_LEFT)) /* LEFT */
+ {
+ if (Pos > 0)
+ {
+ Pos--;
+ CONSOLE_SetCursorXY(8 + Pos, 11);
+ }
+ }
+ else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RIGHT)) /* RIGHT */
+ {
+ if (Pos < Length)
+ {
+ Pos++;
+ CONSOLE_SetCursorXY(8 + Pos, 11);
+ }
+ }
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
{
+ CONSOLE_SetCursorType(TRUE, FALSE);
+
/*
* Check for the validity of the installation directory and pop up
* an error if it is not the case. Then the user can fix its input.
@@ -3334,11 +3457,18 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x08) /* BACKSPACE */
{
- if (Length > 0)
+ if (Pos > 0)
{
+ if (Pos < Length)
+ memmove(&InstallDir[Pos - 1],
+ &InstallDir[Pos],
+ (Length - Pos) * sizeof(WCHAR));
+ InstallDir[Length - 1] = UNICODE_NULL;
+
+ Pos--;
Length--;
- InstallDir[Length] = 0;
CONSOLE_SetInputTextXY(8, 11, 51, InstallDir);
+ CONSOLE_SetCursorXY(8 + Pos, 11);
}
}
else if (isprint(Ir->Event.KeyEvent.uChar.AsciiChar))
@@ -3348,10 +3478,17 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
c = (WCHAR)Ir->Event.KeyEvent.uChar.AsciiChar;
if (iswalpha(c) || iswdigit(c) || c == '.' || c == '\\'
|| c == '-' || c == '_')
{
- InstallDir[Length] = c;
+ if (Pos < Length)
+ memmove(&InstallDir[Pos + 1],
+ &InstallDir[Pos],
+ (Length - Pos) * sizeof(WCHAR));
+ InstallDir[Length + 1] = UNICODE_NULL;
+ InstallDir[Pos] = c;
+
+ Pos++;
Length++;
- InstallDir[Length] = 0;
CONSOLE_SetInputTextXY(8, 11, 51, InstallDir);
+ CONSOLE_SetCursorXY(8 + Pos, 11);
}
}
}