IN UINT CodePage,
IN BOOLEAN OutputCP)
{
+ BOOL Success = TRUE;
+
if (Console == NULL || !IsValidCodePage(CodePage))
return STATUS_INVALID_PARAMETER;
if (OutputCP)
{
- Console->OutputCodePage = CodePage;
- Console->IsCJK = IsCJKCodePage(CodePage);
+ /* Request the terminal to change its code page support */
+ Success = TermSetCodePage(Console, CodePage);
+ if (Success)
+ {
+ Console->OutputCodePage = CodePage;
+ Console->IsCJK = IsCJKCodePage(CodePage);
+ }
}
else
{
Console->InputCodePage = CodePage;
}
- return STATUS_SUCCESS;
+ return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
}
/* EOF */
return TRUE;
}
+static BOOL NTAPI
+DummySetCodePage(IN OUT PTERMINAL This,
+ UINT CodePage)
+{
+ return TRUE;
+}
+
static INT NTAPI
DummyShowMouseCursor(IN OUT PTERMINAL This,
BOOL Show)
DummyReleaseScreenBuffer,
DummyGetLargestConsoleWindowSize,
DummySetPalette,
+ DummySetCodePage,
DummyShowMouseCursor,
};
return TRUE;
}
+static BOOL NTAPI
+GuiSetCodePage(IN OUT PFRONTEND This,
+ UINT CodePage)
+{
+ // TODO: Find a suitable console font for the given code page,
+ // and set it if found; otherwise fail the call, or fall back
+ // to some default font...
+
+ return TRUE;
+}
+
static ULONG NTAPI
GuiGetDisplayMode(IN OUT PFRONTEND This)
{
GuiGetLargestConsoleWindowSize,
GuiGetSelectionInfo,
GuiSetPalette,
+ GuiSetCodePage,
GuiGetDisplayMode,
GuiSetDisplayMode,
GuiShowMouseCursor,
return FrontEnd->Vtbl->SetPalette(FrontEnd, PaletteHandle, PaletteUsage);
}
+static BOOL NTAPI
+ConSrvTermSetCodePage(IN OUT PTERMINAL This,
+ UINT CodePage)
+{
+ PFRONTEND FrontEnd = This->Context;
+ return FrontEnd->Vtbl->SetCodePage(FrontEnd, CodePage);
+}
+
static INT NTAPI
ConSrvTermShowMouseCursor(IN OUT PTERMINAL This,
BOOL Show)
ConSrvTermReleaseScreenBuffer,
ConSrvTermGetLargestConsoleWindowSize,
ConSrvTermSetPalette,
+ ConSrvTermSetCodePage,
ConSrvTermShowMouseCursor,
};
return TRUE;
}
+static BOOL NTAPI
+TuiSetCodePage(IN OUT PFRONTEND This,
+ UINT CodePage)
+{
+ // TODO: Find a suitable console font for the given code page,
+ // and set it if found; otherwise fail the call, or fall back
+ // to some default font...
+
+ return TRUE;
+}
+
static ULONG NTAPI
TuiGetDisplayMode(IN OUT PFRONTEND This)
{
TuiGetLargestConsoleWindowSize,
TuiGetSelectionInfo,
TuiSetPalette,
+ TuiSetCodePage,
TuiGetDisplayMode,
TuiSetDisplayMode,
TuiShowMouseCursor,
BOOL (NTAPI *SetPalette)(IN OUT PTERMINAL This,
HPALETTE PaletteHandle,
UINT PaletteUsage);
- INT (NTAPI *ShowMouseCursor)(IN OUT PTERMINAL This,
- BOOL Show);
+ BOOL (NTAPI *SetCodePage)(IN OUT PTERMINAL This,
+ UINT CodePage);
+ INT (NTAPI *ShowMouseCursor)(IN OUT PTERMINAL This,
+ BOOL Show);
#if 0 // Possible future terminal interface
BOOL (NTAPI *GetTerminalProperty)(IN OUT PTERMINAL This,
BOOL (NTAPI *SetPalette)(IN OUT PFRONTEND This,
HPALETTE PaletteHandle,
UINT PaletteUsage);
+ BOOL (NTAPI *SetCodePage)(IN OUT PFRONTEND This,
+ UINT CodePage);
ULONG (NTAPI *GetDisplayMode)(IN OUT PFRONTEND This);
BOOL (NTAPI *SetDisplayMode)(IN OUT PFRONTEND This,
ULONG NewMode);
(Console)->TermIFace.Vtbl->GetLargestConsoleWindowSize(&(Console)->TermIFace, (pSize))
#define TermSetPalette(Console, PaletteHandle, PaletteUsage) \
(Console)->TermIFace.Vtbl->SetPalette(&(Console)->TermIFace, (PaletteHandle), (PaletteUsage))
+#define TermSetCodePage(Console, CodePage) \
+ (Console)->TermIFace.Vtbl->SetCodePage(&(Console)->TermIFace, (CodePage))
#define TermShowMouseCursor(Console, Show) \
(Console)->TermIFace.Vtbl->ShowMouseCursor(&(Console)->TermIFace, (Show))
if ((Console->OutputCodePage != ConsoleInfo->CodePage) &&
IsValidCodePage(ConsoleInfo->CodePage))
{
- Console->InputCodePage = Console->OutputCodePage = ConsoleInfo->CodePage;
// ConDrvSetConsoleCP(Console, ConsoleInfo->CodePage, TRUE); // Output
// ConDrvSetConsoleCP(Console, ConsoleInfo->CodePage, FALSE); // Input
-
- Console->IsCJK = IsCJKCodePage(Console->OutputCodePage);
+ if (TermSetCodePage(Console, ConsoleInfo->CodePage))
+ {
+ Console->InputCodePage = Console->OutputCodePage = ConsoleInfo->CodePage;
+ Console->IsCJK = IsCJKCodePage(Console->OutputCodePage);
+ }
}
// FIXME: Check ConsoleInfo->WindowSize with respect to