logiguard fork v3: full patch set on verified 8c74db0 tree
Includes prior-session patches (carry forward so the app compiles): - crates/gpui/build.rs: cross-compile manifest fix - crates/gpui/src/platform.rs: PlatformWindow::activate_with_token trait method - crates/gpui/src/window.rs: Window::activate_with_token public API - crates/gpui_linux/src/linux/wayland/window.rs: WaylandWindow::activate_with_token + activate() keyboard-serial fix Plus the focus-serial fix: - serial.rs: SerialKind::KeyboardEnter - client.rs: store wl_keyboard.enter serial; latest_serial_of() Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
57
crates/cli/Cargo.toml
Normal file
57
crates/cli/Cargo.toml
Normal file
@@ -0,0 +1,57 @@
|
||||
[package]
|
||||
name = "cli"
|
||||
version = "0.1.0"
|
||||
edition.workspace = true
|
||||
publish.workspace = true
|
||||
license = "GPL-3.0-or-later"
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
|
||||
[lib]
|
||||
path = "src/cli.rs"
|
||||
doctest = false
|
||||
|
||||
[[bin]]
|
||||
name = "cli"
|
||||
path = "src/main.rs"
|
||||
|
||||
[features]
|
||||
no-bundled-uninstall = []
|
||||
default = []
|
||||
|
||||
[dependencies]
|
||||
anyhow.workspace = true
|
||||
askpass.workspace = true
|
||||
clap.workspace = true
|
||||
collections.workspace = true
|
||||
console.workspace = true
|
||||
dialoguer.workspace = true
|
||||
ipc-channel = "0.19"
|
||||
parking_lot.workspace = true
|
||||
paths.workspace = true
|
||||
release_channel.workspace = true
|
||||
serde.workspace = true
|
||||
util.workspace = true
|
||||
tempfile.workspace = true
|
||||
rayon.workspace = true
|
||||
walkdir = "2.5"
|
||||
|
||||
[dev-dependencies]
|
||||
serde_json.workspace = true
|
||||
util = { workspace = true, features = ["test-support"] }
|
||||
|
||||
[target.'cfg(any(target_os = "linux", target_os = "freebsd"))'.dependencies]
|
||||
exec.workspace = true
|
||||
fork.workspace = true
|
||||
|
||||
[target.'cfg(target_os = "macos")'.dependencies]
|
||||
core-foundation.workspace = true
|
||||
core-services = "0.2"
|
||||
plist = "1.3"
|
||||
|
||||
[target.'cfg(target_os = "windows")'.dependencies]
|
||||
windows.workspace = true
|
||||
|
||||
[build-dependencies]
|
||||
windows_resources = { path = "../windows_resources" }
|
||||
1
crates/cli/LICENSE-GPL
Symbolic link
1
crates/cli/LICENSE-GPL
Symbolic link
@@ -0,0 +1 @@
|
||||
../../LICENSE-GPL
|
||||
15
crates/cli/README.md
Normal file
15
crates/cli/README.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Cli
|
||||
|
||||
## Testing
|
||||
|
||||
You can test your changes to the `cli` crate by first building the main zed binary:
|
||||
|
||||
```
|
||||
cargo build -p zed
|
||||
```
|
||||
|
||||
And then building and running the `cli` crate with the following parameters:
|
||||
|
||||
```
|
||||
cargo run -p cli -- --zed ./target/debug/zed.exe
|
||||
```
|
||||
37
crates/cli/build.rs
Normal file
37
crates/cli/build.rs
Normal file
@@ -0,0 +1,37 @@
|
||||
#![allow(clippy::disallowed_methods, reason = "build scripts are exempt")]
|
||||
use std::process::Command;
|
||||
|
||||
fn main() {
|
||||
if std::env::var("ZED_UPDATE_EXPLANATION").is_ok() {
|
||||
println!(r#"cargo:rustc-cfg=feature="no-bundled-uninstall""#);
|
||||
}
|
||||
|
||||
if cfg!(target_os = "macos") {
|
||||
println!("cargo:rustc-env=MACOSX_DEPLOYMENT_TARGET=10.15.7");
|
||||
}
|
||||
|
||||
// Populate git sha environment variable if git is available
|
||||
println!("cargo:rerun-if-changed=../../.git/logs/HEAD");
|
||||
if let Some(output) = Command::new("git")
|
||||
.args(["rev-parse", "HEAD"])
|
||||
.output()
|
||||
.ok()
|
||||
.filter(|output| output.status.success())
|
||||
{
|
||||
let git_sha = String::from_utf8_lossy(&output.stdout);
|
||||
let git_sha = git_sha.trim();
|
||||
|
||||
println!("cargo:rustc-env=ZED_COMMIT_SHA={git_sha}");
|
||||
}
|
||||
if let Some(build_identifier) = option_env!("GITHUB_RUN_NUMBER") {
|
||||
println!("cargo:rustc-env=ZED_BUILD_ID={build_identifier}");
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
{
|
||||
println!("cargo:rerun-if-env-changed=RELEASE_CHANNEL");
|
||||
println!("cargo:rerun-if-env-changed=GITHUB_RUN_NUMBER");
|
||||
|
||||
windows_resources::compile(false).expect("failed to compile Windows resources");
|
||||
}
|
||||
}
|
||||
106
crates/cli/src/cli.rs
Normal file
106
crates/cli/src/cli.rs
Normal file
@@ -0,0 +1,106 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
use anyhow::Result;
|
||||
use collections::HashMap;
|
||||
pub use ipc_channel::ipc;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct IpcHandshake {
|
||||
pub requests: ipc::IpcSender<CliRequest>,
|
||||
pub responses: ipc::IpcReceiver<CliResponse>,
|
||||
}
|
||||
|
||||
/// Controls how CLI paths are opened — whether to reuse existing windows,
|
||||
/// create new ones, or add to the sidebar.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum OpenBehavior {
|
||||
/// Consult the user's `cli_default_open_behavior` setting to choose between
|
||||
/// `ExistingWindow` or `Classic`.
|
||||
#[default]
|
||||
Default,
|
||||
/// Always create a new window. No matching against existing worktrees.
|
||||
/// Corresponds to `zed -n`.
|
||||
AlwaysNew,
|
||||
/// Match broadly including subdirectories, and fall back to any existing
|
||||
/// window if no worktree matched. Corresponds to `zed -a`.
|
||||
Add,
|
||||
/// Open directories as a new workspace in the current Zed window's sidebar.
|
||||
/// Reuse existing windows for files in open worktrees.
|
||||
/// Corresponds to `zed -e`.
|
||||
ExistingWindow,
|
||||
/// New window for directories, reuse existing window for files in open
|
||||
/// worktrees. The classic pre-sidebar behavior.
|
||||
/// Corresponds to `zed --classic`.
|
||||
Classic,
|
||||
/// Replace the content of an existing window with a new workspace.
|
||||
/// Corresponds to `zed -r`.
|
||||
Reuse,
|
||||
}
|
||||
|
||||
/// The setting-level enum for configuring default behavior. This only has
|
||||
/// two values because the other modes are always explicitly requested via
|
||||
/// CLI flags.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum CliBehaviorSetting {
|
||||
/// Open directories as a new workspace in the current Zed window's sidebar.
|
||||
ExistingWindow,
|
||||
/// Classic behavior: open directories in a new window, but reuse an
|
||||
/// existing window when opening files that are already part of an open
|
||||
/// project.
|
||||
NewWindow,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
pub enum CliRequest {
|
||||
Open {
|
||||
paths: Vec<String>,
|
||||
urls: Vec<String>,
|
||||
diff_paths: Vec<[String; 2]>,
|
||||
diff_all: bool,
|
||||
wsl: Option<String>,
|
||||
wait: bool,
|
||||
#[serde(default)]
|
||||
open_behavior: OpenBehavior,
|
||||
env: Option<HashMap<String, String>>,
|
||||
user_data_dir: Option<String>,
|
||||
dev_container: bool,
|
||||
#[serde(default)]
|
||||
cwd: Option<PathBuf>,
|
||||
},
|
||||
SetOpenBehavior {
|
||||
behavior: CliBehaviorSetting,
|
||||
},
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
pub enum CliResponse {
|
||||
Ping,
|
||||
Stdout { message: String },
|
||||
Stderr { message: String },
|
||||
Exit { status: i32 },
|
||||
PromptOpenBehavior,
|
||||
}
|
||||
|
||||
/// When Zed started not as an *.app but as a binary (e.g. local development),
|
||||
/// there's a possibility to tell it to behave "regularly".
|
||||
///
|
||||
/// Note that in the main zed binary, this variable is unset after it's read for the first time,
|
||||
/// therefore it should always be accessed through the `FORCE_CLI_MODE` static.
|
||||
pub const FORCE_CLI_MODE_ENV_VAR_NAME: &str = "ZED_FORCE_CLI_MODE";
|
||||
|
||||
/// Abstracts the transport for sending CLI responses (Zed → CLI).
|
||||
///
|
||||
/// Production code uses `IpcSender<CliResponse>`. Tests can provide in-memory
|
||||
/// implementations to avoid OS-level IPC.
|
||||
pub trait CliResponseSink: Send + 'static {
|
||||
fn send(&self, response: CliResponse) -> Result<()>;
|
||||
}
|
||||
|
||||
impl CliResponseSink for ipc::IpcSender<CliResponse> {
|
||||
fn send(&self, response: CliResponse) -> Result<()> {
|
||||
ipc::IpcSender::send(self, response).map_err(|error| anyhow::anyhow!("{error}"))
|
||||
}
|
||||
}
|
||||
1449
crates/cli/src/main.rs
Normal file
1449
crates/cli/src/main.rs
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user