Skip to content

Commit

Permalink
Fix multiple regressions since #18215
Browse files Browse the repository at this point in the history
  • Loading branch information
lhecker committed Dec 20, 2024
1 parent 1e0bd85 commit 83dadd1
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 29 deletions.
20 changes: 7 additions & 13 deletions src/cascadia/TerminalControl/TermControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ DEFINE_ENUM_FLAG_OPERATORS(winrt::Microsoft::Terminal::Control::MouseButtonState
// the current foreground window, but still on top of another Terminal window in the background.
static void hideCursorUntilMoved()
{
static CoreCursor previousCursor{ nullptr };
static bool cursorIsHidden;
static const auto shouldVanish = []() {
BOOL shouldVanish = TRUE;
SystemParametersInfoW(SPI_GETMOUSEVANISH, 0, &shouldVanish, 0);
Expand All @@ -68,16 +68,16 @@ static void hideCursorUntilMoved()

const auto window = CoreWindow::GetForCurrentThread();
static constexpr auto releaseCapture = [](CoreWindow window, PointerEventArgs) {
if (previousCursor)
if (cursorIsHidden)
{
window.ReleasePointerCapture();
}
};
static constexpr auto restoreCursor = [](CoreWindow window, PointerEventArgs) {
if (previousCursor)
if (cursorIsHidden)
{
window.PointerCursor(previousCursor);
previousCursor = nullptr;
cursorIsHidden = false;
window.PointerCursor(CoreCursor{ CoreCursorType::Arrow, 0 });
}
};

Expand All @@ -90,20 +90,14 @@ static void hideCursorUntilMoved()
return true;
}();

if (shouldVanish && !previousCursor)
if (shouldVanish && !cursorIsHidden)
{
try
{
const auto window = CoreWindow::GetForCurrentThread();

previousCursor = window.PointerCursor();
if (!previousCursor)
{
return;
}

window.PointerCursor(nullptr);
window.SetPointerCapture();
cursorIsHidden = true;
}
catch (...)
{
Expand Down
2 changes: 1 addition & 1 deletion src/cascadia/WindowsTerminal/AppHost.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -815,7 +815,7 @@ void AppHost::_WindowActivated(bool activated)
{
_windowLogic.WindowActivated(activated);

if (activated && _isWindowInitialized != WindowInitializedState::NotInitialized)
if (activated)
{
QueryPerformanceCounter(&_lastActivatedTime);
_virtualDesktopId = {};
Expand Down
51 changes: 36 additions & 15 deletions src/cascadia/WindowsTerminal/WindowEmperor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -413,13 +413,8 @@ void WindowEmperor::HandleCommandlineArgs(int nCmdShow)
// It almost seems like there's a pattern here...
(msg.wParam == VK_SPACE && msg.message == WM_SYSKEYDOWN))
{
if (const auto w = _mostRecentWindow())
{
const auto vkey = gsl::narrow_cast<uint32_t>(msg.wParam);
const auto scanCode = gsl::narrow_cast<uint8_t>(msg.lParam >> 16);
w->OnDirectKeyEvent(vkey, scanCode, keyDown);
continue;
}
_dispatchSpecialKey(msg);
continue;
}
}

Expand All @@ -442,6 +437,36 @@ void WindowEmperor::HandleCommandlineArgs(int nCmdShow)
__assume(false);
}

void WindowEmperor::_dispatchSpecialKey(MSG& msg) const
{
const auto hwnd = msg.hwnd;
AppHost* window = nullptr;

for (const auto& h : _windows)
{
const auto w = h->GetWindow();
if (w && w->GetHandle() == hwnd)
{
window = h.get();
break;
}
}

if (!window)
{
window = _mostRecentWindow();
if (!window)
{
return;
}
}

const auto vkey = gsl::narrow_cast<uint32_t>(msg.wParam);
const auto scanCode = gsl::narrow_cast<uint8_t>(msg.lParam >> 16);
const bool keyDown = msg.message & 1;
window->OnDirectKeyEvent(vkey, scanCode, keyDown);
}

void WindowEmperor::_dispatchCommandline(winrt::TerminalApp::CommandlineArgs args)
{
const auto exitCode = args.ExitCode();
Expand Down Expand Up @@ -826,14 +851,10 @@ LRESULT WindowEmperor::_messageHandler(HWND window, UINT const message, WPARAM c
case WM_QUERYENDSESSION:
// For WM_QUERYENDSESSION and WM_ENDSESSION, refer to:
// https://docs.microsoft.com/en-us/windows/win32/rstmgr/guidelines-for-applications
if (lParam == ENDSESSION_CLOSEAPP)
{
// ENDSESSION_CLOSEAPP: The application is using a file that must be replaced,
// the system is being serviced, or system resources are exhausted.
RegisterApplicationRestart(nullptr, RESTART_NO_CRASH | RESTART_NO_HANG);
return TRUE;
}
return FALSE;
// ENDSESSION_CLOSEAPP: The application is using a file that must be replaced,
// the system is being serviced, or system resources are exhausted.
RegisterApplicationRestart(nullptr, RESTART_NO_CRASH | RESTART_NO_HANG);
return TRUE;
case WM_ENDSESSION:
_forcePersistence = true;
PostQuitMessage(0);
Expand Down
1 change: 1 addition & 0 deletions src/cascadia/WindowsTerminal/WindowEmperor.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class WindowEmperor
AppHost* _mostRecentWindow() const noexcept;
bool _summonWindow(const SummonWindowSelectionArgs& args) const;
void _summonAllWindows() const;
void _dispatchSpecialKey(MSG& msg) const;
void _dispatchCommandline(winrt::TerminalApp::CommandlineArgs args);
safe_void_coroutine _dispatchCommandlineCurrentDesktop(winrt::TerminalApp::CommandlineArgs args);
LRESULT _messageHandler(HWND window, UINT message, WPARAM wParam, LPARAM lParam) noexcept;
Expand Down

0 comments on commit 83dadd1

Please sign in to comment.