Closes #ISSUE Adds system GPU collection to crash reporting. Currently this is Linux only. The system GPUs are determined by reading the `/sys/class/drm` directory structure, rather than using the exisiting `gpui::Window::gpu_specs()` method in order to gather more information, and so that the GPU context is not dependent on Vulkan context initialization (i.e. we still get GPU info when Zed fails to start because Vulkan failed to initialize). Unfortunately, the `blade` APIs do not support querying which GPU _will_ be used, so we do not know which GPU was attempted to be used when Vulkan context initialization fails, however, when Vulkan initialization succeeds, we send a message to the crash handler containing the result of `gpui::Window::gpu_specs()` to include the "Active" gpu in any crash report that may occur Release Notes: - N/A *or* Added/Fixed/Improved ...
109 lines
3.4 KiB
Rust
109 lines
3.4 KiB
Rust
use gpui::{App, ClipboardItem, PromptLevel, actions};
|
|
use system_specs::{CopySystemSpecsIntoClipboard, SystemSpecs};
|
|
use util::ResultExt;
|
|
use workspace::Workspace;
|
|
use zed_actions::feedback::FileBugReport;
|
|
|
|
pub mod feedback_modal;
|
|
|
|
actions!(
|
|
zed,
|
|
[
|
|
/// Opens email client to send feedback to Zed support.
|
|
EmailZed,
|
|
/// Opens the Zed repository on GitHub.
|
|
OpenZedRepo,
|
|
/// Opens the feature request form.
|
|
RequestFeature,
|
|
]
|
|
);
|
|
|
|
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, window, cx| {
|
|
let Some(window) = window else {
|
|
return;
|
|
};
|
|
feedback_modal::FeedbackModal::register(workspace, window, cx);
|
|
workspace
|
|
.register_action(|_, _: &CopySystemSpecsIntoClipboard, window, cx| {
|
|
let specs = SystemSpecs::new(window, cx);
|
|
|
|
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(|_, _: &RequestFeature, _, cx| {
|
|
cx.open_url(REQUEST_FEATURE_URL);
|
|
})
|
|
.register_action(move |_, _: &FileBugReport, window, cx| {
|
|
let specs = SystemSpecs::new(window, cx);
|
|
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);
|
|
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();
|
|
}
|