[PR #17829] Avoid focus loops in ConPTY #31379

Open
opened 2026-01-31 09:46:52 +00:00 by claunia · 0 comments
Owner

Original Pull Request: https://github.com/microsoft/terminal/pull/17829

State: closed
Merged: Yes


This fixes a lot of subtle issues:

  • Avoid emitting another de-/iconify VT sequence when
    we encounter a (de)iconify VT sequence during parsing.
  • Avoid emitting a de-/iconify VT sequence when
    a focus event is received on the signal pipe.
  • Avoid emitting such sequences on startup.
  • Avoid emitting multiple such sequences
    when rapidly un-/focusing the window.

It's also a minor cleanup, because the GA_ROOTOWNER is not security
relevant. It was added because there was concern that someone can just
spawn a ConPTY session, tell it that it's focused, and spawn a child
which is now focused. But why would someone do that, when the console
IOCTLs to do so are not just publicly available but also documented?

I also disabled the IME window.

Validation Steps Performed

  • First:
    int main() {
        for (bool show = false;; show = !show) {
            printf(show ? "Show in 3s...\n" : "Hide in 3s...\n");
            Sleep(3000);
            ShowWindow(GetConsoleWindow(), show ? SW_SHOW : SW_HIDE);
        }
    }
    
  • PowerShell 5's Get-Credential gains focus ✅
  • sleep 5; Get-Credential and focus another app. WT should start
    blinking in the taskbar. Restore it. The popup has focus ✅
  • Run :hardcopy in vim: Window is shown centered at (0,0) ✖️
    But that's okay because it does that already anyway ✅
  • Connect-AzAccount doesn't crash PowerShell ✅
**Original Pull Request:** https://github.com/microsoft/terminal/pull/17829 **State:** closed **Merged:** Yes --- This fixes a lot of subtle issues: * Avoid emitting another de-/iconify VT sequence when we encounter a (de)iconify VT sequence during parsing. * Avoid emitting a de-/iconify VT sequence when a focus event is received on the signal pipe. * Avoid emitting such sequences on startup. * Avoid emitting multiple such sequences when rapidly un-/focusing the window. It's also a minor cleanup, because the `GA_ROOTOWNER` is not security relevant. It was added because there was concern that someone can just spawn a ConPTY session, tell it that it's focused, and spawn a child which is now focused. But why would someone do that, when the console IOCTLs to do so are not just publicly available but also documented? I also disabled the IME window. ## Validation Steps Performed * First: ```cpp int main() { for (bool show = false;; show = !show) { printf(show ? "Show in 3s...\n" : "Hide in 3s...\n"); Sleep(3000); ShowWindow(GetConsoleWindow(), show ? SW_SHOW : SW_HIDE); } } ``` * PowerShell 5's `Get-Credential` gains focus ✅ * `sleep 5; Get-Credential` and focus another app. WT should start blinking in the taskbar. Restore it. The popup has focus ✅ * Run `:hardcopy` in vim: Window is shown centered at (0,0) ✖️ But that's okay because it does that already anyway ✅ * `Connect-AzAccount` doesn't crash PowerShell ✅
claunia added the pull-request label 2026-01-31 09:46:52 +00:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/terminal#31379