git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commitef91492faa37cd9041e5eda1350e96619306f363
parent12f3baae2c
authorLucas Galante <[email protected]>
date2026-07-07 11:50
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) => {