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(); } } })?;