Release Notes: - Added button tu prevent idle sleep during AI response streaming **Context / Motivation:** When an AI agent takes a long time to generate a response, the operating system might enter an idle sleep (or display sleep) state if there is no user interaction (mouse or keyboard). This can interrupt the workflow. This PR aims to prevent the system from sleeping during an active AI turn by invoking native OS APIs, and provides a UI toggle for users to control this behavior. **Key Changes:** 1. **Cross-Platform Idle Sleep Prevention in GPUI (`gpui`, `gpui_*`)** - Added a new `prevent_idle_sleep` method to the `Platform` trait. It returns a RAII-based `PreventIdleSleepToken`, which automatically restores the original sleep policy when dropped. - **macOS**: Utilizes `NSProcessInfo`'s `beginActivityWithOptions` with `NSActivityIdleDisplaySleepDisabled`. - **Windows**: Uses `SetThreadExecutionState` to prevent display and system sleep, incorporating a reference counter to handle concurrent requests safely. - **Linux**: Uses `ashpd` to request `org.freedesktop.portal.Inhibit` (inhibiting `Idle` and `Suspend` states) via D-Bus. 2. **AI Agent State Integration (`crates/acp_thread`)** - Introduced idle sleep prevention logic in `AcpThread`: Acquires the token at the beginning of `run_turn`, and automatically releases it when the turn completes normally, errors out, or is explicitly canceled by the user. - Added comprehensive unit tests to ensure the token is correctly acquired and released under various cancellation and concurrency scenarios. 3. **Settings and UI (`crates/agent_settings`, `crates/agent_ui`)** - Added `AgentOutputIdleSleepControl` to global state. - Added a new toggle button (screen icon) to the toolbar at the bottom of the `ThreadView` (AI conversation panel). Users can hover to view the tooltip and click to toggle the feature on or off. <img width="419" height="132" alt="截屏2026-04-04 16 09 08" src="https://github.com/user-attachments/assets/619da9ff-10f7-46e0-b959-d7c74b16b918" /> --------- Signed-off-by: Xiaobo Liu <cppcoffee@gmail.com> Co-authored-by: Kirill Bulatov <kirill@zed.dev>
137 lines
3.4 KiB
TOML
137 lines
3.4 KiB
TOML
[package]
|
|
name = "gpui_linux"
|
|
version = "0.1.0"
|
|
edition.workspace = true
|
|
publish.workspace = true
|
|
license = "Apache-2.0"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[lib]
|
|
path = "src/gpui_linux.rs"
|
|
|
|
[features]
|
|
default = ["wayland", "x11"]
|
|
test-support = ["gpui/test-support"]
|
|
wayland = [
|
|
"bitflags",
|
|
"gpui_wgpu",
|
|
"ashpd/wayland",
|
|
|
|
"calloop-wayland-source",
|
|
"wayland-backend",
|
|
"wayland-client",
|
|
"wayland-cursor",
|
|
"wayland-protocols",
|
|
"wayland-protocols-plasma",
|
|
"wayland-protocols-wlr",
|
|
"filedescriptor",
|
|
"xkbcommon/wayland",
|
|
"open",
|
|
"gpui/wayland",
|
|
]
|
|
x11 = [
|
|
"gpui_wgpu",
|
|
"ashpd",
|
|
|
|
"as-raw-xcb-connection",
|
|
"x11rb",
|
|
"xkbcommon/x11",
|
|
"xim",
|
|
"x11-clipboard",
|
|
"filedescriptor",
|
|
"open",
|
|
"scap?/x11",
|
|
]
|
|
screen-capture = [
|
|
"gpui/screen-capture",
|
|
"scap",
|
|
]
|
|
|
|
|
|
[target.'cfg(any(target_os = "linux", target_os = "freebsd"))'.dependencies]
|
|
accesskit.workspace = true
|
|
accesskit_unix.workspace = true
|
|
anyhow.workspace = true
|
|
bytemuck = "1"
|
|
collections.workspace = true
|
|
futures.workspace = true
|
|
gpui.workspace = true
|
|
gpui_util.workspace = true
|
|
gpui_wgpu = { workspace = true, optional = true, features = ["font-kit"] }
|
|
http_client.workspace = true
|
|
libc.workspace = true
|
|
log.workspace = true
|
|
parking_lot.workspace = true
|
|
smallvec.workspace = true
|
|
smol.workspace = true
|
|
strum.workspace = true
|
|
url.workspace = true
|
|
uuid.workspace = true
|
|
|
|
# Always used
|
|
oo7 = { version = "0.6", default-features = false, features = [
|
|
"async-std",
|
|
"native_crypto",
|
|
] }
|
|
calloop = "0.14.3"
|
|
notify-rust.workspace = true
|
|
raw-window-handle.workspace = true
|
|
|
|
# Used in both windowing options
|
|
ashpd = { workspace = true, optional = true }
|
|
bitflags = { workspace = true, optional = true }
|
|
filedescriptor = { version = "0.8.2", optional = true }
|
|
open = { version = "5.2.0", optional = true }
|
|
xkbcommon = { version = "0.8.0", default-features = false, optional = true }
|
|
|
|
# Screen capture
|
|
scap = { workspace = true, optional = true }
|
|
|
|
# Wayland
|
|
calloop-wayland-source = { version = "0.4.1", optional = true }
|
|
wayland-backend = { version = "0.3.15", features = [
|
|
"client_system",
|
|
"dlopen",
|
|
"log",
|
|
], optional = true }
|
|
wayland-client = { version = "0.31.11", optional = true }
|
|
wayland-cursor = { version = "0.31.11", optional = true }
|
|
wayland-protocols = { version = "0.32.9", features = [
|
|
"client",
|
|
"staging",
|
|
"unstable",
|
|
], optional = true }
|
|
wayland-protocols-plasma = { version = "0.3.9", features = [
|
|
"client",
|
|
], optional = true }
|
|
wayland-protocols-wlr = { version = "0.3.9", features = [
|
|
"client",
|
|
], optional = true }
|
|
|
|
# X11
|
|
as-raw-xcb-connection = { version = "1", optional = true }
|
|
x11rb = { version = "0.13.1", features = [
|
|
"allow-unsafe-code",
|
|
"xkb",
|
|
"randr",
|
|
"xinput",
|
|
"cursor",
|
|
"resource_manager",
|
|
"sync",
|
|
"dri3",
|
|
], optional = true }
|
|
# WARNING: If you change this, you must also publish a new version of zed-xim to crates.io
|
|
xim = { git = "https://github.com/zed-industries/xim-rs.git", rev = "16f35a2c881b815a2b6cdfd6687988e84f8447d8", features = [
|
|
"x11rb-xcb",
|
|
"x11rb-client",
|
|
], package = "zed-xim", version = "0.4.0-zed", optional = true }
|
|
x11-clipboard = { version = "0.9.3", optional = true }
|
|
|
|
[target.'cfg(any(target_os = "linux", target_os = "freebsd"))'.dev-dependencies]
|
|
gpui = { workspace = true, features = ["test-support"] }
|
|
|
|
[package.metadata.cargo-shear]
|
|
ignored = ["bitflags", "scap", "x11-clipboard"]
|