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:
25
crates/feedback/Cargo.toml
Normal file
25
crates/feedback/Cargo.toml
Normal file
@@ -0,0 +1,25 @@
|
||||
[package]
|
||||
name = "feedback"
|
||||
version = "0.1.0"
|
||||
edition.workspace = true
|
||||
publish.workspace = true
|
||||
license = "GPL-3.0-or-later"
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
|
||||
[lib]
|
||||
path = "src/feedback.rs"
|
||||
|
||||
[features]
|
||||
test-support = []
|
||||
|
||||
[dependencies]
|
||||
extension_host.workspace = true
|
||||
gpui.workspace = true
|
||||
system_specs.workspace = true
|
||||
urlencoding.workspace = true
|
||||
util.workspace = true
|
||||
workspace.workspace = true
|
||||
zed_actions.workspace = true
|
||||
client.workspace = true
|
||||
1
crates/feedback/LICENSE-GPL
Symbolic link
1
crates/feedback/LICENSE-GPL
Symbolic link
@@ -0,0 +1 @@
|
||||
../../LICENSE-GPL
|
||||
145
crates/feedback/src/feedback.rs
Normal file
145
crates/feedback/src/feedback.rs
Normal file
@@ -0,0 +1,145 @@
|
||||
use client::telemetry;
|
||||
use extension_host::ExtensionStore;
|
||||
use gpui::{App, ClipboardItem, PromptLevel, actions};
|
||||
use system_specs::{CopySystemSpecsIntoClipboard, SystemSpecs};
|
||||
use util::ResultExt;
|
||||
use workspace::Workspace;
|
||||
use zed_actions::feedback::{EmailZed, FileBugReport, RequestFeature};
|
||||
|
||||
actions!(
|
||||
zed,
|
||||
[
|
||||
/// Opens the Zed repository on GitHub.
|
||||
OpenZedRepo,
|
||||
/// Copies installed extensions to the clipboard for bug reports.
|
||||
CopyInstalledExtensionsIntoClipboard
|
||||
]
|
||||
);
|
||||
|
||||
const ZED_REPO_URL: &str = "https://github.com/zed-industries/zed";
|
||||
|
||||
const REQUEST_FEATURE_URL: &str = "https://github.com/zed-industries/zed/discussions/new/choose";
|
||||
|
||||
fn file_bug_report_url(specs: &SystemSpecs) -> String {
|
||||
format!(
|
||||
concat!(
|
||||
"https://github.com/zed-industries/zed/issues/new",
|
||||
"?",
|
||||
"template=10_bug_report.yml",
|
||||
"&",
|
||||
"environment={}"
|
||||
),
|
||||
urlencoding::encode(&specs.to_string())
|
||||
)
|
||||
}
|
||||
|
||||
fn email_zed_url(specs: &SystemSpecs) -> String {
|
||||
format!(
|
||||
concat!("mailto:hi@zed.dev", "?", "body={}"),
|
||||
email_body(specs)
|
||||
)
|
||||
}
|
||||
|
||||
fn email_body(specs: &SystemSpecs) -> String {
|
||||
let body = format!("\n\nSystem Information:\n\n{}", specs);
|
||||
urlencoding::encode(&body).to_string()
|
||||
}
|
||||
|
||||
pub fn init(cx: &mut App) {
|
||||
cx.observe_new(|workspace: &mut Workspace, _, _| {
|
||||
workspace
|
||||
.register_action(|_, _: &CopySystemSpecsIntoClipboard, window, cx| {
|
||||
let specs =
|
||||
SystemSpecs::new(window, cx, telemetry::os_name(), telemetry::os_version());
|
||||
|
||||
cx.spawn_in(window, async move |_, cx| {
|
||||
let specs = specs.await.to_string();
|
||||
|
||||
cx.update(|_, cx| {
|
||||
cx.write_to_clipboard(ClipboardItem::new_string(specs.clone()))
|
||||
})
|
||||
.log_err();
|
||||
|
||||
cx.prompt(
|
||||
PromptLevel::Info,
|
||||
"Copied into clipboard",
|
||||
Some(&specs),
|
||||
&["OK"],
|
||||
)
|
||||
.await
|
||||
})
|
||||
.detach();
|
||||
})
|
||||
.register_action(|_, _: &CopyInstalledExtensionsIntoClipboard, window, cx| {
|
||||
let clipboard_text = format_installed_extensions_for_clipboard(cx);
|
||||
cx.write_to_clipboard(ClipboardItem::new_string(clipboard_text.clone()));
|
||||
drop(window.prompt(
|
||||
PromptLevel::Info,
|
||||
"Copied into clipboard",
|
||||
Some(&clipboard_text),
|
||||
&["OK"],
|
||||
cx,
|
||||
));
|
||||
})
|
||||
.register_action(|_, _: &RequestFeature, _, cx| {
|
||||
cx.open_url(REQUEST_FEATURE_URL);
|
||||
})
|
||||
.register_action(move |_, _: &FileBugReport, window, cx| {
|
||||
let specs =
|
||||
SystemSpecs::new(window, cx, telemetry::os_name(), telemetry::os_version());
|
||||
cx.spawn_in(window, async move |_, cx| {
|
||||
let specs = specs.await;
|
||||
cx.update(|_, cx| {
|
||||
cx.open_url(&file_bug_report_url(&specs));
|
||||
})
|
||||
.log_err();
|
||||
})
|
||||
.detach();
|
||||
})
|
||||
.register_action(move |_, _: &EmailZed, window, cx| {
|
||||
let specs =
|
||||
SystemSpecs::new(window, cx, telemetry::os_name(), telemetry::os_version());
|
||||
cx.spawn_in(window, async move |_, cx| {
|
||||
let specs = specs.await;
|
||||
cx.update(|_, cx| {
|
||||
cx.open_url(&email_zed_url(&specs));
|
||||
})
|
||||
.log_err();
|
||||
})
|
||||
.detach();
|
||||
})
|
||||
.register_action(move |_, _: &OpenZedRepo, _, cx| {
|
||||
cx.open_url(ZED_REPO_URL);
|
||||
});
|
||||
})
|
||||
.detach();
|
||||
}
|
||||
|
||||
fn format_installed_extensions_for_clipboard(cx: &mut App) -> String {
|
||||
let store = ExtensionStore::global(cx);
|
||||
let store = store.read(cx);
|
||||
let mut lines = Vec::with_capacity(store.extension_index.extensions.len());
|
||||
|
||||
for (extension_id, entry) in store.extension_index.extensions.iter() {
|
||||
let line = format!(
|
||||
"- {} ({}) v{}{}",
|
||||
entry.manifest.name,
|
||||
extension_id,
|
||||
entry.manifest.version,
|
||||
if entry.dev { " (dev)" } else { "" }
|
||||
);
|
||||
lines.push(line);
|
||||
}
|
||||
|
||||
lines.sort();
|
||||
|
||||
if lines.is_empty() {
|
||||
return "No extensions installed.".to_string();
|
||||
}
|
||||
|
||||
format!(
|
||||
"Installed extensions ({}):\n{}",
|
||||
lines.len(),
|
||||
lines.join("\n")
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user