Find a file
HuaGu-Dragon 38270bc027
Fix Alt modifier stuck after Alt-Tab on Windows (#52220)
## Context

Fixes a bug on Windows where the Alt modifier key becomes stuck in the
pressed state after using Alt-Tab to switch away from and back to the
Zed application.

### Root Cause
In `crates/gpui_windows/src/events.rs`, when the window loses focus
during Alt-Tab, the WM_KEYUP event for the Alt key is never delivered to
the application. The pending modifier state in GPUI remains as
`alt=true`. When the window regains focus, there is no synchronization
point to reset this stale state.

## How to Review

In `handle_activate_msg()` (WM_ACTIVATE handler), when the window is
activated:
1. Reset the cached modifier tracking state (`last_reported_modifiers`
and `last_reported_capslock` set to `None`)
2. Query the actual current modifier state from Windows using
`GetKeyState()` APIs
3. Dispatch a `ModifiersChanged` event with the true state to
synchronize GPUI

## Self-Review Checklist

<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

I think it's difficult to add tests for this because it's
platform-dependent, but I recorded a video for comparison — sorry I only
have an anime‑style app to show the key presses.

<details>
  <summary>Video</summary>
  


https://github.com/user-attachments/assets/b545178c-b360-4e2b-8d60-d6f95a0b4b79



https://github.com/user-attachments/assets/bc4d41eb-6f42-4040-a588-0fc46c576db7


</details>

Closes #45485

Release Notes: 

- Fixed Alt modifier key stuck after Alt-Tab on Windows. Modifier state
is now synchronized when the window regains focus, ensuring correct key
interpretation after window switching.
2026-04-18 01:11:47 +02:00
.cargo livekit: Use our build of libwebrtc.a (#51433) 2026-03-16 10:47:36 +01:00
.cloudflare docs: Document context servers (#21170) 2024-11-25 11:05:14 -05:00
.config Increase timeout for test_random_blocks (#50724) 2026-03-04 12:25:12 -05:00
.factory Add humanizer skill for AI writing pattern detection (#50021) 2026-02-24 14:58:52 -06:00
.github Run wasm builds in CI against pinned stable (#54081) 2026-04-16 22:39:31 +02:00
.zed git: Add create git worktree hook to task system (#51337) 2026-04-01 16:14:48 -04:00
assets editor: Fix soft-wrap in auto-height editors (#54051) 2026-04-18 00:55:44 +02:00
ci Move Nightly release to gh-workflow (#41349) 2025-10-28 13:57:23 -06:00
crates Fix Alt modifier stuck after Alt-Tab on Windows (#52220) 2026-04-18 01:11:47 +02:00
docs editor: Fix soft-wrap in auto-height editors (#54051) 2026-04-18 00:55:44 +02:00
extensions proto: Bump to v0.3.2 (#53235) 2026-04-06 12:51:13 +00:00
legal Update legal docs to reflect new terms of service (#50530) 2026-03-02 12:36:31 -08:00
nix nix: Fix build on x86_64-linux (#52917) 2026-04-01 20:50:04 +02:00
script Add more harness to the CI scripts (#53816) 2026-04-13 22:28:20 +03:00
tooling Run wasm builds in CI against pinned stable (#54081) 2026-04-16 22:39:31 +02:00
.git-blame-ignore-revs Add PR 50413 to .git-blame-ignore-revs (#50421) 2026-03-01 00:50:33 +01:00
.gitattributes windows: Make sure zed.sh using the correct line ending (#37650) 2025-09-05 16:25:55 +00:00
.gitignore agent_ui: Unify draft and background threads into retained threads (#53737) 2026-04-13 09:07:09 +00:00
.mailmap Update .mailmap (#47413) 2026-01-22 23:57:26 +05:30
.prettierrc ci: Add check for formatting default.json (#30034) 2025-05-06 18:55:26 +00:00
.rules Update AI docs for retired hosted models (#49486) 2026-02-18 10:36:38 -06:00
AGENTS.md ai: Symlink an AGENTS.md file to .rules (#45939) 2026-01-19 15:29:42 +01:00
Cargo.lock Fix YAML custom tags incorrectly showing as errors (#54148) 2026-04-17 22:52:50 +05:30
Cargo.toml Fix YAML custom tags incorrectly showing as errors (#54148) 2026-04-17 22:52:50 +05:30
CLAUDE.md Initial .rules file for agent with symlinks for other rules file paths (#29014) 2025-04-17 23:41:23 +00:00
clippy.toml Revert "Revert scheduler update (#46659)" (#46671) 2026-01-14 07:19:13 +00:00
CODE_OF_CONDUCT.md Remove community content from docs and point to zed.dev (#19895) 2024-10-29 09:44:58 -04:00
codebook.toml editor: Introduce Bookmarks (#54174) 2026-04-17 13:54:43 +02:00
compose.yml Remove Postgres and stripe-mock from Docker Compose (#48313) 2026-02-04 03:42:58 +00:00
CONTRIBUTING.md Add Zed Feature Process document (#50747) 2026-03-06 14:14:53 -08:00
debug.plist
default.nix nix: Use flake-parts, partitions, and treefmt-nix (#45321) 2026-02-02 14:26:42 +00:00
Dockerfile-collab Bump Rust version to 1.94 (#51086) 2026-03-30 09:06:59 +00:00
Dockerfile-collab.dockerignore
Dockerfile-cross.dockerignore Add remote server cross compilation (#19136) 2024-10-12 23:23:56 -07:00
Dockerfile-distros Removal of mold/wild scripts and mentions in docs (#53078) 2026-04-08 21:20:02 +03:00
Dockerfile-distros.dockerignore
flake.lock nix: Fix build on x86_64-linux (#52917) 2026-04-01 20:50:04 +02:00
flake.nix Try to improve nix caching (#48297) 2026-02-03 20:31:02 -07:00
GEMINI.md Add missing GEMINI.md rule file for gemini-cli (#38885) 2025-10-02 09:47:29 -04:00
LICENSE-AGPL Update license year (#24191) 2025-02-04 09:02:59 -05:00
LICENSE-APACHE Update license year (#24191) 2025-02-04 09:02:59 -05:00
LICENSE-GPL
livekit.yaml
lychee.toml ci: Check for broken links (#30844) 2025-06-06 09:39:35 +00:00
Procfile Update instructions for local collaboration (#35689) 2025-08-06 11:10:28 -07:00
Procfile.all Add agent thread sharing (#46140) 2026-01-06 12:49:51 -08:00
Procfile.web Remove PostgREST (#41299) 2025-10-27 13:27:59 -04:00
README.md Add sponsor button to main Zed repo (#46807) 2026-01-14 10:38:51 -06:00
renovate.json Remove workspace-hack (#40216) 2025-10-17 18:58:14 +00:00
REVIEWERS.conl Remove past reviewer (#51767) 2026-03-17 16:34:35 +00:00
rust-toolchain.toml Bump Rust version to 1.94 (#51086) 2026-03-30 09:06:59 +00:00
rustfmt.toml nix: Use flake-parts, partitions, and treefmt-nix (#45321) 2026-02-02 14:26:42 +00:00
shell.nix nix: Use flake-parts, partitions, and treefmt-nix (#45321) 2026-02-02 14:26:42 +00:00
typos.toml Fix crash and enable GIF animation in markdown preview (#53459) 2026-04-16 10:44:00 +03:00

Zed

Zed CI

Welcome to Zed, a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.


Installation

On macOS, Linux, and Windows you can download Zed directly or install Zed via your local package manager (macOS/Linux/Windows).

Other platforms are not yet available:

Developing Zed

Contributing

See CONTRIBUTING.md for ways you can contribute to Zed.

Also... we're hiring! Check out our jobs page for open roles.

Licensing

License information for third party dependencies must be correctly provided for CI to pass.

We use cargo-about to automatically comply with open source licenses. If CI is failing, check the following:

  • Is it showing a no license specified error for a crate you've created? If so, add publish = false under [package] in your crate's Cargo.toml.
  • Is the error failed to satisfy license requirements for a dependency? If so, first determine what license the project has and whether this system is sufficient to comply with this license's requirements. If you're unsure, ask a lawyer. Once you've verified that this system is acceptable add the license's SPDX identifier to the accepted array in script/licenses/zed-licenses.toml.
  • Is cargo-about unable to find the license for a dependency? If so, add a clarification field at the end of script/licenses/zed-licenses.toml, as specified in the cargo-about book.

Sponsorship

Zed is developed by Zed Industries, Inc., a for-profit company.

If youd like to financially support the project, you can do so via GitHub Sponsors. Sponsorships go directly to Zed Industries and are used as general company revenue. There are no perks or entitlements associated with sponsorship.