From 2a7e815bfabda686ad239fed29d430d06ab14a18 Mon Sep 17 00:00:00 2001 From: Smit Barmase Date: Wed, 13 Aug 2025 17:26:39 +0530 Subject: [PATCH 1/3] version check --- crates/gpui/src/platform/linux/x11/client.rs | 48 +++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/crates/gpui/src/platform/linux/x11/client.rs b/crates/gpui/src/platform/linux/x11/client.rs index 573e4addf7..66810f569d 100644 --- a/crates/gpui/src/platform/linux/x11/client.rs +++ b/crates/gpui/src/platform/linux/x11/client.rs @@ -427,7 +427,12 @@ impl X11Client { let xcb_connection = Rc::new(xcb_connection); - let ximc = X11rbClient::init(Rc::clone(&xcb_connection), x_root_index, None).ok(); + // bug in ibus causes it to crash, which results in us not receiving xim callbacks, see #29083 + let ximc = if get_package_version("ibus").as_deref() == Some("1.5.32~rc2-1") { + None + } else { + X11rbClient::init(Rc::clone(&xcb_connection), x_root_index, None).ok() + }; let xim_handler = if ximc.is_some() { Some(XimHandler::new()) } else { @@ -2488,3 +2493,44 @@ fn get_dpi_factor((width_px, height_px): (u32, u32), (width_mm, height_mm): (u64 fn valid_scale_factor(scale_factor: f32) -> bool { scale_factor.is_sign_positive() && scale_factor.is_normal() } + +fn get_package_version(name: String) -> Option { + use util::command::new_std_command; + + if let Ok(output) = new_std_command("dpkg-query") + .args(["-W", "-f=${Version}", name]) + .output() + { + if output.status.success() { + if let Ok(version) = std::str::from_utf8(&output.stdout) { + return Some(version.trim().to_string()); + } + } + } + + if let Ok(output) = new_std_command("rpm") + .args(["-q", "--qf", "%{VERSION}-%{RELEASE}", name]) + .output() + { + if output.status.success() { + if let Ok(version) = std::str::from_utf8(&output.stdout) { + return Some(version.trim().to_string()); + } + } + } + + if let Ok(output) = new_std_command("pacman") + .args(["-Q", name]) + .output() + { + if output.status.success() { + if let Ok(stdout) = std::str::from_utf8(&output.stdout) { + if let Some(version) = stdout.trim().split_whitespace().nth(1) { + return Some(version.to_string()); + } + } + } + } + + None +} From 8d61979a82ef7f9eea7a570f26643212ecb2b4f1 Mon Sep 17 00:00:00 2001 From: Smit Barmase Date: Wed, 13 Aug 2025 17:49:37 +0530 Subject: [PATCH 2/3] fix --- crates/gpui/src/platform/linux/x11/client.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/crates/gpui/src/platform/linux/x11/client.rs b/crates/gpui/src/platform/linux/x11/client.rs index 66810f569d..ea33103ab2 100644 --- a/crates/gpui/src/platform/linux/x11/client.rs +++ b/crates/gpui/src/platform/linux/x11/client.rs @@ -2494,11 +2494,11 @@ fn valid_scale_factor(scale_factor: f32) -> bool { scale_factor.is_sign_positive() && scale_factor.is_normal() } -fn get_package_version(name: String) -> Option { +fn get_package_version(name: &str) -> Option { use util::command::new_std_command; if let Ok(output) = new_std_command("dpkg-query") - .args(["-W", "-f=${Version}", name]) + .args(["-W", "-f=${Version}", &name]) .output() { if output.status.success() { @@ -2509,7 +2509,7 @@ fn get_package_version(name: String) -> Option { } if let Ok(output) = new_std_command("rpm") - .args(["-q", "--qf", "%{VERSION}-%{RELEASE}", name]) + .args(["-q", "--qf", "%{VERSION}-%{RELEASE}", &name]) .output() { if output.status.success() { @@ -2519,10 +2519,7 @@ fn get_package_version(name: String) -> Option { } } - if let Ok(output) = new_std_command("pacman") - .args(["-Q", name]) - .output() - { + if let Ok(output) = new_std_command("pacman").args(["-Q", &name]).output() { if output.status.success() { if let Ok(stdout) = std::str::from_utf8(&output.stdout) { if let Some(version) = stdout.trim().split_whitespace().nth(1) { From f7a80034588cd4f1e42c30c2fba0aace231aac8e Mon Sep 17 00:00:00 2001 From: Smit Barmase Date: Wed, 13 Aug 2025 18:01:40 +0530 Subject: [PATCH 3/3] remove arch and handle fedora --- crates/gpui/src/platform/linux/x11/client.rs | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/crates/gpui/src/platform/linux/x11/client.rs b/crates/gpui/src/platform/linux/x11/client.rs index ea33103ab2..5b11f93095 100644 --- a/crates/gpui/src/platform/linux/x11/client.rs +++ b/crates/gpui/src/platform/linux/x11/client.rs @@ -428,7 +428,10 @@ impl X11Client { let xcb_connection = Rc::new(xcb_connection); // bug in ibus causes it to crash, which results in us not receiving xim callbacks, see #29083 - let ximc = if get_package_version("ibus").as_deref() == Some("1.5.32~rc2-1") { + let ximc = if get_package_version("ibus") + .as_deref() + .map_or(false, |version| version.starts_with("1.5.32~rc2-1")) + { None } else { X11rbClient::init(Rc::clone(&xcb_connection), x_root_index, None).ok() @@ -2519,15 +2522,5 @@ fn get_package_version(name: &str) -> Option { } } - if let Ok(output) = new_std_command("pacman").args(["-Q", &name]).output() { - if output.status.success() { - if let Ok(stdout) = std::str::from_utf8(&output.stdout) { - if let Some(version) = stdout.trim().split_whitespace().nth(1) { - return Some(version.to_string()); - } - } - } - } - None }