Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
Fix Chromium margin right/bottom scale 2 gap
src/window.rs | 26 +++++++++++++++++++++++++-
src/xdg_toplevel.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 70 insertions(+), 1 deletion(-)
diff --git a/src/window.rs b/src/window.rs
index ed34b0f..0233dab 100644
--- a/src/window.rs
+++ b/src/window.rs
@@ -215,6 +215,8 @@ pub struct Window {
pub rendering_sent: WindowRenderingSent,
pub rendering_requested: WindowRenderingRequested,
pub box_geom: ffi::wlr_box,
+ pub margin_x: i32,
+ pub margin_y: i32,
pub foreign_toplevel_handle: *mut ffi::wlr_ext_foreign_toplevel_handle_v1,
pub wlr_toplevel_handle: *mut ffi::wlr_foreign_toplevel_handle_v1,
}
@@ -347,6 +349,8 @@ impl Window {
blur: false,
},
box_geom: ffi::wlr_box { x: 0, y: 0, width: 0, height: 0 },
+ margin_x: 0,
+ margin_y: 0,
foreign_toplevel_handle: std::ptr::null_mut(),
wlr_toplevel_handle: std::ptr::null_mut(),
});
@@ -423,6 +427,13 @@ impl Window {
}
}
+ pub unsafe fn is_chromium_electron(&self) -> bool {
+ let app_id_ptr = self.get_app_id();
+ if app_id_ptr.is_null() { return false; }
+ let app_id = std::ffi::CStr::from_ptr(app_id_ptr).to_str().unwrap_or("").to_lowercase();
+ app_id.contains("antigravity") || app_id.contains("chromium") || app_id.contains("chrome") || app_id.contains("electron") || app_id.contains("code") || app_id.contains("discord") || app_id.contains("slack")
+ }
+
pub unsafe fn get_parent(&self) -> *mut Window {
match self.impl_type {
WindowImpl::Toplevel(toplevel) => {
@@ -962,7 +973,7 @@ impl Window {
ffi::wlr_foreign_toplevel_handle_v1_set_activated(self.wlr_toplevel_handle, activated);
}
- let (width, height) = if !self.wm_requested.fullscreen.is_null() {
+ let (mut width, mut height) = if !self.wm_requested.fullscreen.is_null() {
let output = self.wm_requested.fullscreen;
let (w, h) = (*output).sent.dimensions();
if self.configure_sent.width != Some(w as u32) || self.configure_sent.height != Some(h as u32) {
@@ -981,6 +992,19 @@ impl Window {
};
self.wm_requested.dimensions = None;
+ if self.wm_requested.ssd && self.is_chromium_electron() && self.wm_requested.fullscreen.is_null() {
+ let margin_x = if self.margin_x > 0 { self.margin_x } else { 10 };
+ let margin_y = if self.margin_y > 0 { self.margin_y } else { 10 };
+ let (left_margin, right_margin) = if margin_x == 10 { (10, 34) } else { (margin_x, margin_x) };
+ let (top_margin, bottom_margin) = if margin_y == 10 { (10, 34) } else { (margin_y, margin_y) };
+ if let Some(w) = width {
+ width = Some(w + left_margin as u32 + right_margin as u32);
+ }
+ if let Some(h) = height {
+ height = Some(h + top_margin as u32 + bottom_margin as u32);
+ }
+ }
+
self.configure_scheduled = Configure {
width,
height,
diff --git a/src/xdg_toplevel.rs b/src/xdg_toplevel.rs
index 222e6c3..6d56250 100644
--- a/src/xdg_toplevel.rs
+++ b/src/xdg_toplevel.rs
@@ -411,6 +411,7 @@ unsafe extern "C" fn handle_commit(listener: *mut ffi::wl_listener, _data: *mut
let capture_node = &mut (*(*window).capture_scene).tree as *mut ffi::wlr_scene_tree as *mut ffi::wlr_scene_node;
let mut geom = std::mem::zeroed();
ffi::river_wlr_xdg_surface_get_geometry(base, &mut geom);
+ override_geometry_if_needed(window, &mut geom);
ffi::wlr_scene_subsurface_tree_set_clip(capture_node, &geom);
let mut min_w = 0;
@@ -442,6 +443,7 @@ unsafe extern "C" fn handle_commit(listener: *mut ffi::wl_listener, _data: *mut
let old_geometry = (*toplevel).geometry;
let mut new_geometry = std::mem::zeroed();
ffi::river_wlr_xdg_surface_get_geometry(base, &mut new_geometry);
+ override_geometry_if_needed(window, &mut new_geometry);
(*toplevel).geometry = new_geometry;
let size_changed = new_geometry.width != old_geometry.width || new_geometry.height != old_geometry.height;
@@ -462,6 +464,7 @@ unsafe extern "C" fn handle_commit(listener: *mut ffi::wl_listener, _data: *mut
ConfigureState::Acked | ConfigureState::TimedOutAcked => {
let mut new_geometry = std::mem::zeroed();
ffi::river_wlr_xdg_surface_get_geometry(base, &mut new_geometry);
+ override_geometry_if_needed(window, &mut new_geometry);
(*toplevel).geometry = new_geometry;
(*window).rendering_scheduled.width = new_geometry.width as u32;
@@ -654,3 +657,45 @@ impl XdgDecoration {
let _ = Box::from_raw(decoration);
}
}
+
+pub unsafe fn override_geometry_if_needed(window: *mut crate::window::Window, geom: &mut ffi::wlr_box) {
+ let is_chromium = (*window).is_chromium_electron();
+ if is_chromium {
+ log::info!(
+ "CHROMIUM COMMIT before override: x={} y={} w={} h={} wm_ssd={}",
+ geom.x,
+ geom.y,
+ geom.width,
+ geom.height,
+ (*window).wm_requested.ssd,
+ );
+ }
+ if (*window).wm_requested.ssd && is_chromium {
+ if geom.x == 10 || geom.y == 10 {
+ (*window).margin_x = 10;
+ (*window).margin_y = 10;
+ } else if geom.x == 6 || geom.y == 6 {
+ (*window).margin_x = 6;
+ (*window).margin_y = 6;
+ }
+
+ let margin_x = if (*window).margin_x > 0 { (*window).margin_x } else { 10 };
+ let margin_y = if (*window).margin_y > 0 { (*window).margin_y } else { 10 };
+
+ let (left_margin, right_margin) = if margin_x == 10 { (10, 34) } else { (margin_x, margin_x) };
+ let (top_margin, bottom_margin) = if margin_y == 10 { (10, 34) } else { (margin_y, margin_y) };
+
+ geom.x = left_margin;
+ geom.y = top_margin;
+ geom.width = geom.width.saturating_sub(left_margin + right_margin);
+ geom.height = geom.height.saturating_sub(top_margin + bottom_margin);
+
+ log::info!(
+ "CHROMIUM COMMIT after override: x={} y={} w={} h={}",
+ geom.x,
+ geom.y,
+ geom.width,
+ geom.height,
+ );
+ }
+}