Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
feat: rename status bar to cce-status-interface; derive light_source edge
Rename the status namespace/app-id prefixes, socket paths, and adjust-mode file
from cce-status* to cce-status-interface* (accepting the old names as fallback).
Add a light_source status module whose edge is computed from the configured
light_source_position, and round corners for cce app windows.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
src/server/layer_shell.rs | 2 +-
src/server/run_server.rs | 4 ++--
src/server/status_server.rs | 4 ++--
src/server/window.rs | 53 ++++++++++++++++++++++++++++++++++++++++----
src/server/window_manager.rs | 16 ++++++++-----
5 files changed, 64 insertions(+), 15 deletions(-)
diff --git a/src/server/layer_shell.rs b/src/server/layer_shell.rs
index e665589..0f88d27 100644
--- a/src/server/layer_shell.rs
+++ b/src/server/layer_shell.rs
@@ -591,7 +591,7 @@ unsafe extern "C" fn handle_layer_surface_commit(listener: *mut ffi::wl_listener
let mut is_status = false;
if !(*wlr_layer_surface).namespace.is_null() {
let ns = std::ffi::CStr::from_ptr((*wlr_layer_surface).namespace).to_string_lossy();
- if ns == "cce-status" {
+ if ns == "cce-status" || ns == "cce-status-interface" {
blur_enabled = (*server).wm.layout.status_background_blur > 0.001;
ignore_transparent = (*server).wm.layout.status_backdrop_blur_ignore_transparent;
is_status = true;
diff --git a/src/server/run_server.rs b/src/server/run_server.rs
index 24fe0c0..c30fc2f 100644
--- a/src/server/run_server.rs
+++ b/src/server/run_server.rs
@@ -188,7 +188,7 @@ pub fn run_server() {
std::process::exit(1);
}
- // Spawn TOML startup programs
+ // Spawn configured startup programs
let current_startup = server.wm.startup.clone();
for prog in current_startup {
unsafe {
@@ -206,7 +206,7 @@ pub fn run_server() {
}
impl Drop for ServerGuard {
fn drop(&mut self) {
- let _ = std::fs::remove_file("/tmp/cce-status-adjust-mode");
+ let _ = std::fs::remove_file("/tmp/cce-status-interface-adjust-mode");
if let Some(pid) = self.init_pid {
log::info!("sending SIGTERM to child process group {}", pid);
let _ = nix::sys::signal::kill(
diff --git a/src/server/status_server.rs b/src/server/status_server.rs
index 1d4b886..5b3792f 100644
--- a/src/server/status_server.rs
+++ b/src/server/status_server.rs
@@ -67,9 +67,9 @@ impl StatusSender {
pub fn get_status_socket_path(display_socket: Option<&str>) -> String {
if let Some(display) = display_socket {
- format!("/tmp/cce-status-{}.sock", display)
+ format!("/tmp/cce-status-interface-{}.sock", display)
} else {
- "/tmp/cce-status.sock".to_string()
+ "/tmp/cce-status-interface.sock".to_string()
}
}
diff --git a/src/server/window.rs b/src/server/window.rs
index b5b43f6..438bd9f 100644
--- a/src/server/window.rs
+++ b/src/server/window.rs
@@ -741,15 +741,60 @@ impl Window {
self.tiling_mode = crate::tiling::TilingMode::Status;
if is_status_bar && self.status_edge == StatusEdge::Unspecified {
let app_id = std::ffi::CStr::from_ptr(app_id_ptr).to_string_lossy();
- let name = if let Some(stripped) = app_id.strip_prefix("cce-status-left-") {
+ let name = if let Some(stripped) = app_id.strip_prefix("cce-status-interface-left-").or_else(|| app_id.strip_prefix("cce-status-left-")) {
stripped
- } else if let Some(stripped) = app_id.strip_prefix("cce-status-right-") {
+ } else if let Some(stripped) = app_id.strip_prefix("cce-status-interface-right-").or_else(|| app_id.strip_prefix("cce-status-right-")) {
stripped
} else {
&app_id
};
let mut loaded_edge = None;
- if let Ok(content) = std::fs::read_to_string(cce_ui::config::get_config_path()) {
+ if name == "light_source" {
+ let mut light_pos = 2.356194490192345_f32; // Default 135 deg in rad
+ if let Ok(content) = std::fs::read_to_string(cce_ui::config::get_config_path()) {
+ let val = cce_ui::config::parse_kdl_to_json(&content);
+ if let Some(wm_obj) = val.get("window_manager") {
+ if let Some(pos_val) = wm_obj.get("light_source_position") {
+ if let Some(f) = pos_val.as_f64() {
+ light_pos = f as f32;
+ } else if let Some(i) = pos_val.as_i64() {
+ let deg = i as f32;
+ if deg > 2.0 * std::f32::consts::PI {
+ light_pos = deg.to_radians();
+ } else {
+ light_pos = deg;
+ }
+ }
+ }
+ }
+ }
+
+ let two_pi = 2.0 * std::f32::consts::PI;
+ let mut angle = light_pos % two_pi;
+ if angle < 0.0 {
+ angle += two_pi;
+ }
+
+ let pi = std::f32::consts::PI;
+ let edge = if angle < pi / 8.0 || angle >= 15.0 * pi / 8.0 {
+ StatusEdge::Right
+ } else if angle < 3.0 * pi / 8.0 {
+ StatusEdge::TopRight
+ } else if angle < 5.0 * pi / 8.0 {
+ StatusEdge::TopCenter
+ } else if angle < 7.0 * pi / 8.0 {
+ StatusEdge::TopLeft
+ } else if angle < 9.0 * pi / 8.0 {
+ StatusEdge::Left
+ } else if angle < 11.0 * pi / 8.0 {
+ StatusEdge::BottomLeft
+ } else if angle < 13.0 * pi / 8.0 {
+ StatusEdge::BottomCenter
+ } else {
+ StatusEdge::BottomRight
+ };
+ loaded_edge = Some(edge);
+ } else if let Ok(content) = std::fs::read_to_string(cce_ui::config::get_config_path()) {
let val = cce_ui::config::parse_kdl_to_json(&content);
if let Some(layout_obj) = val.get("layout") {
if let Some(status_bar_obj) = layout_obj.get("status_bar") {
@@ -1664,7 +1709,7 @@ impl Window {
let w = self.rendering_sent.width as i32;
let h = self.rendering_sent.height as i32;
w.min(h) / 2
- } else if self.wm_requested.ssd {
+ } else if self.wm_requested.ssd || is_cce_app {
(*self.server).wm.layout.backplate_corner_radius
} else {
0
diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index 0cd50fd..68c6d3d 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -197,7 +197,7 @@ impl WindowManager {
self.last_status_update = std::cell::RefCell::new(None);
self.status_hide_mode = false;
self.adjust_position_mode = false;
- let _ = std::fs::remove_file("/tmp/cce-status-adjust-mode");
+ let _ = std::fs::remove_file("/tmp/cce-status-interface-adjust-mode");
ffi::wl_list_init(&mut self.sent.outputs);
ffi::wl_list_init(&mut self.sent.seats);
@@ -1712,7 +1712,9 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
let sort_left = |w_list: &mut Vec<*mut Window>| {
w_list.sort_by_key(|&w| unsafe {
let app_id = (*w).get_app_id_string().unwrap_or_default();
- let name = app_id.strip_prefix("cce-status-left-").unwrap_or(&app_id);
+ let name = app_id.strip_prefix("cce-status-interface-left-")
+ .or_else(|| app_id.strip_prefix("cce-status-left-"))
+ .unwrap_or(&app_id);
LEFT_ORDER.iter().position(|&m| m == name).unwrap_or(99)
});
};
@@ -1720,7 +1722,9 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
let sort_right = |w_list: &mut Vec<*mut Window>| {
w_list.sort_by_key(|&w| unsafe {
let app_id = (*w).get_app_id_string().unwrap_or_default();
- let name = app_id.strip_prefix("cce-status-right-").unwrap_or(&app_id);
+ let name = app_id.strip_prefix("cce-status-interface-right-")
+ .or_else(|| app_id.strip_prefix("cce-status-right-"))
+ .unwrap_or(&app_id);
RIGHT_ORDER.iter().position(|&m| m == name).unwrap_or(99)
});
};
@@ -2736,9 +2740,9 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
};
self.adjust_position_mode = enable;
if enable {
- let _ = std::fs::File::create("/tmp/cce-status-adjust-mode");
+ let _ = std::fs::File::create("/tmp/cce-status-interface-adjust-mode");
} else {
- let _ = std::fs::remove_file("/tmp/cce-status-adjust-mode");
+ let _ = std::fs::remove_file("/tmp/cce-status-interface-adjust-mode");
}
self.dirty_windowing();
return format!("ok {}\n", enable);
@@ -3292,7 +3296,7 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
}
pub unsafe fn spawn_startup_program(&mut self, prog: crate::config::StartupConfig) {
- log::info!("spawning TOML startup program: {}", prog.exec);
+ log::info!("spawning startup program: {}", prog.exec);
let cmd = prog.exec.clone();
match nix::unistd::fork() {
Ok(nix::unistd::ForkResult::Child) => {