Migrate OSS up to 3f1befb06 (Touch Keyboard Invocation)

This commit is contained in:
Dustin Howett 2021-11-09 13:39:23 -06:00
commit 88d58d313a
6 changed files with 30 additions and 7 deletions

View File

@ -29,8 +29,9 @@ extern "C" {
#endif
typedef RECT (*GetSuggestionWindowPos)();
typedef RECT (*GetTextBoxAreaPos)();
BOOL ActivateTextServices(HWND hwndConsole, GetSuggestionWindowPos pfnPosition);
BOOL ActivateTextServices(HWND hwndConsole, GetSuggestionWindowPos pfnPosition, GetTextBoxAreaPos pfnTextArea);
void DeactivateTextServices();
BOOL NotifyTextServices(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* lplResult);

View File

@ -54,3 +54,15 @@ RECT GetImeSuggestionWindowPos()
return rcSuggestion;
}
// Routine Description:
// - This method gives a rectangle to where text box is currently rendered
// such that the touch keyboard can pop up when the rectangle is tapped.
// Arguments:
// - <none>
// Return Value:
// - Rectangle specifying current text box area.
RECT GetTextBoxArea()
{
return Microsoft::Console::Interactivity::ServiceLocator::LocateConsoleWindow()->GetWindowRect();
}

View File

@ -6,3 +6,4 @@
#pragma hdrstop
RECT GetImeSuggestionWindowPos();
RECT GetTextBoxArea();

View File

@ -263,7 +263,7 @@ using namespace Microsoft::Console::Types;
HandleFocusEvent(TRUE);
// ActivateTextServices does nothing if already active so this is OK to be called every focus.
ActivateTextServices(ServiceLocator::LocateConsoleWindow()->GetWindowHandle(), GetImeSuggestionWindowPos);
ActivateTextServices(ServiceLocator::LocateConsoleWindow()->GetWindowHandle(), GetImeSuggestionWindowPos, GetTextBoxArea);
// set the text area to have focus for accessibility consumers
if (_pUiaProvider)

View File

@ -33,9 +33,11 @@ class CConsoleTSF final :
{
public:
CConsoleTSF(HWND hwndConsole,
GetSuggestionWindowPos pfnPosition) :
GetSuggestionWindowPos pfnPosition,
GetTextBoxAreaPos pfnTextArea) :
_hwndConsole(hwndConsole),
_pfnPosition(pfnPosition),
_pfnTextArea(pfnTextArea),
_cRef(1),
_tid()
{
@ -66,21 +68,27 @@ public:
return S_OK;
}
// This returns Rectangle of the text box of whole console.
// When a user taps inside the rectangle while hardware keyboard is not available,
// touch keyboard is invoked.
STDMETHODIMP GetScreenExt(RECT* pRect)
{
if (pRect)
{
*pRect = _pfnPosition();
*pRect = _pfnTextArea();
}
return S_OK;
}
// This returns rectangle of current command line edit area.
// When a user types in East Asian language, candidate window is shown at this position.
// Emoji and more panel (Win+.) is shown at the position, too.
STDMETHODIMP GetTextExt(LONG, LONG, RECT* pRect, BOOL* pbClipped)
{
if (pRect)
{
GetScreenExt(pRect);
*pRect = _pfnPosition();
}
if (pbClipped)
@ -198,6 +206,7 @@ private:
// Console info.
HWND _hwndConsole;
GetSuggestionWindowPos _pfnPosition;
GetTextBoxAreaPos _pfnTextArea;
// Miscellaneous flags
BOOL _fModifyingDoc = FALSE; // Set TRUE, when calls ITfRange::SetText

View File

@ -5,11 +5,11 @@
CConsoleTSF* g_pConsoleTSF = nullptr;
extern "C" BOOL ActivateTextServices(HWND hwndConsole, GetSuggestionWindowPos pfnPosition)
extern "C" BOOL ActivateTextServices(HWND hwndConsole, GetSuggestionWindowPos pfnPosition, GetTextBoxAreaPos pfnTextArea)
{
if (!g_pConsoleTSF && hwndConsole)
{
g_pConsoleTSF = new (std::nothrow) CConsoleTSF(hwndConsole, pfnPosition);
g_pConsoleTSF = new (std::nothrow) CConsoleTSF(hwndConsole, pfnPosition, pfnTextArea);
if (g_pConsoleTSF && SUCCEEDED(g_pConsoleTSF->Initialize()))
{
// Conhost calls this function only when the console window has focus.