From 4e2fbca7e6ac4ab314ae3204008bb7dfecdb02b4 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Sun, 5 Jul 2026 21:48:05 -0700 Subject: [PATCH 1/2] abstract rendering to new function --- Cargo.toml | 2 +- src/main.rs | 1 + src/render.rs | 33 +++++++++++++++++++++++++++++++++ src/winit.rs | 20 +++----------------- 4 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 src/render.rs diff --git a/Cargo.toml b/Cargo.toml index 1176a6e..df1b55f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ edition = "2024" [dependencies] parking_lot = "0.12.5" -smithay = { path = "./smithay", features = ["desktop", "wayland-backend", "xwayland"] } +smithay = { path = "./smithay", features = ["desktop", "wayland-backend", "wayland_frontend", "xwayland"] } wayland-protocols = { version = "0.32.13", features = ["wayland-server", "server"] } wayland-server = { version = "0.31.13", features = ["dlopen"] } winit = "0.30.13" diff --git a/src/main.rs b/src/main.rs index c386339..6ac2586 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,7 @@ mod handlers; mod audio; mod grabs; mod input; +pub mod render; mod state; mod winit; mod xwayland; diff --git a/src/render.rs b/src/render.rs new file mode 100644 index 0000000..410fe68 --- /dev/null +++ b/src/render.rs @@ -0,0 +1,33 @@ +use smithay::{ + backend::renderer::{ + damage::OutputDamageTracker, + element::surface::WaylandSurfaceRenderElement, + gles::{GlesRenderer, GlesTarget}, + }, + output::Output, +}; + +use crate::State; + +impl State { + pub fn render( + &self, + output: &Output, + renderer: &mut GlesRenderer, + framebuffer: &mut GlesTarget, + damage_tracker: &mut OutputDamageTracker, + ) -> Result<(), Box> { + smithay::desktop::space::render_output::<_, WaylandSurfaceRenderElement, _, _>( + output, + renderer, + framebuffer, + 1.0, + 0, + [&self.space], + &[], + damage_tracker, + [0.07, 0.16, 0.286, 1.0], + )?; + Ok(()) + } +} diff --git a/src/winit.rs b/src/winit.rs index 8056036..986f644 100644 --- a/src/winit.rs +++ b/src/winit.rs @@ -65,23 +65,9 @@ pub fn init_winit(state: &mut State) -> Result<(), Box> { { let (renderer, mut framebuffer) = backend.bind().unwrap(); - smithay::desktop::space::render_output::< - _, - WaylandSurfaceRenderElement, - _, - _, - >( - &output, - renderer, - &mut framebuffer, - 1.0, - 0, - [&state.space], - &[], - &mut damage_tracker, - [0.07, 0.16, 0.286, 1.0], - ) - .unwrap(); + state + .render(&output, renderer, &mut framebuffer, &mut damage_tracker) + .unwrap(); } backend.submit(Some(&[damage])).unwrap(); From 454b14bf3a8f00d1c1e03a3b3d4fcff26544fe82 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Sun, 5 Jul 2026 23:10:15 -0700 Subject: [PATCH 2/2] render --- src/handlers/xdg_decoration.rs | 21 +++++++++++++++------ src/main.rs | 18 +----------------- src/render.rs | 15 ++++++++++++++- src/state.rs | 8 ++++++-- src/xwayland.rs | 9 +++++++-- 5 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/handlers/xdg_decoration.rs b/src/handlers/xdg_decoration.rs index c13d2b7..c56cae3 100644 --- a/src/handlers/xdg_decoration.rs +++ b/src/handlers/xdg_decoration.rs @@ -4,8 +4,11 @@ use wayland_protocols::xdg::decoration::zv1::server::zxdg_toplevel_decoration_v1 impl XdgDecorationHandler for State { fn new_decoration(&mut self, toplevel: smithay::wayland::shell::xdg::ToplevelSurface) { - println!("new_decoration"); - // todo!() + toplevel.with_pending_state(|state| { + state.decoration_mode = Some(Mode::ClientSide); + // state.decoration_mode = Some(Mode::ServerSide); + }); + toplevel.send_configure(); } fn request_mode( @@ -13,12 +16,18 @@ impl XdgDecorationHandler for State { toplevel: smithay::wayland::shell::xdg::ToplevelSurface, mode: Mode, ) { - println!("request_mode"); - // todo!() + toplevel.with_pending_state(|state| { + state.decoration_mode = Some(Mode::ClientSide); + // state.decoration_mode = Some(mode); + }); + toplevel.send_configure(); } fn unset_mode(&mut self, toplevel: smithay::wayland::shell::xdg::ToplevelSurface) { - println!("unset_mode"); - // todo!() + toplevel.with_pending_state(|state| { + state.decoration_mode = Some(Mode::ClientSide); + // state.decoration_mode = Some(Mode::ServerSide); + }); + toplevel.send_configure(); } } diff --git a/src/main.rs b/src/main.rs index 6ac2586..0cdae96 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,7 +28,7 @@ fn main() -> Result<(), Box> { // than the host compositor unsafe { std::env::set_var("WAYLAND_DISPLAY", &state.socket_name) }; - spawn_client(); + // spawn_clients(); if let Some(sysaudioplayer) = &state.sysaudioplayer { sysaudioplayer.blink4(); @@ -48,19 +48,3 @@ fn init_logging() { tracing_subscriber::fmt().init(); } } - -fn spawn_client() { - let mut args = std::env::args().skip(1); - let flag = args.next(); - let arg = args.next(); - - match (flag.as_deref(), arg) { - // (Some("-c") | Some("--command"), Some(command)) => { - // std::process::Command::new(command).spawn().ok(); - // } - _ => { - std::process::Command::new("startmde").spawn().ok(); - std::process::Command::new("konsole").spawn().ok(); - } - } -} diff --git a/src/render.rs b/src/render.rs index 410fe68..5798f83 100644 --- a/src/render.rs +++ b/src/render.rs @@ -1,14 +1,25 @@ use smithay::{ backend::renderer::{ damage::OutputDamageTracker, - element::surface::WaylandSurfaceRenderElement, + element::{ + memory::MemoryRenderBufferRenderElement, solid::SolidColorRenderElement, + surface::WaylandSurfaceRenderElement, + }, gles::{GlesRenderer, GlesTarget}, + ImportMem, }, output::Output, + render_elements, }; use crate::State; +render_elements! { + DecorationElement where R: ImportMem; + Chrome=SolidColorRenderElement, + Label=MemoryRenderBufferRenderElement, +} + impl State { pub fn render( &self, @@ -17,6 +28,8 @@ impl State { framebuffer: &mut GlesTarget, damage_tracker: &mut OutputDamageTracker, ) -> Result<(), Box> { + // let elem = DecorationElement:: + smithay::desktop::space::render_output::<_, WaylandSurfaceRenderElement, _, _>( output, renderer, diff --git a/src/state.rs b/src/state.rs index 1ade4eb..7c25b5d 100644 --- a/src/state.rs +++ b/src/state.rs @@ -118,7 +118,7 @@ impl State { // Windows get a position and stacking order through mapping. // Outputs become views of a part of the Space and can be rendered via Space::render_output. let space = Space::default(); - Self::setup_xwayland(display.handle(), handle.clone())?; + Self::start_programs(display.handle(), handle.clone())?; let socket_name = Self::init_wayland_listener(display, handle.clone()); @@ -218,7 +218,11 @@ impl State { }) } - pub fn run(&mut self) {} + pub fn spawn_clients() { + /* todo: read from shit */ + std::process::Command::new("startmde").spawn().ok(); + std::process::Command::new("konsole").spawn().ok(); + } } /// Data associated with a wayland client that connects to Smallvil. diff --git a/src/xwayland.rs b/src/xwayland.rs index f7429c1..34b0c5b 100644 --- a/src/xwayland.rs +++ b/src/xwayland.rs @@ -88,10 +88,11 @@ impl XWaylandShellHandler for State { } impl State { - pub fn setup_xwayland( + pub fn start_programs( dh: DisplayHandle, loop_handle: LoopHandle<'static, Self>, ) -> Result<(), Box> { + /* try to spawn xwayland first */ let (xwayland, client) = XWayland::spawn( &dh, None, @@ -116,9 +117,13 @@ impl State { println!("XWayland started on display :{display_number}"); unsafe { std::env::set_var("DISPLAY", format!(":{display_number}")) }; + + /* now launch the clients */ + State::spawn_clients(); } XWaylandEvent::Error => { - // warn!("XWayland crashed on startup"); + println!("XWayland crashed on startup"); + State::spawn_clients(); } } })?;