From 65d970495fc624ef0258ed96ba00cc0c31be2a50 Mon Sep 17 00:00:00 2001 From: Adrien Prokopowicz <6529475+prokopyl@users.noreply.github.com> Date: Tue, 26 Mar 2024 00:41:39 +0100 Subject: [PATCH] Render a background for the open_window example (#175) This PR adds code to render a basic gray background to the opened window in the `open_window` example. This also helps making the example a bit more useful, since most users will want to render to their window. And also it looks nicer. :slightly_smiling_face: This is done using the `softbuffer` crate, in the same manner of the `open_parented` introduced in #172. --- examples/open_window.rs | 63 +++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/examples/open_window.rs b/examples/open_window.rs index 1ef4320..da76bea 100644 --- a/examples/open_window.rs +++ b/examples/open_window.rs @@ -1,10 +1,13 @@ +use std::num::NonZeroU32; use std::time::Duration; use rtrb::{Consumer, RingBuffer}; #[cfg(target_os = "macos")] use baseview::copy_to_clipboard; -use baseview::{Event, EventStatus, MouseEvent, Window, WindowHandler, WindowScalePolicy}; +use baseview::{ + Event, EventStatus, MouseEvent, PhySize, Window, WindowEvent, WindowHandler, WindowScalePolicy, +}; #[derive(Debug, Clone)] enum Message { @@ -13,32 +16,48 @@ enum Message { struct OpenWindowExample { rx: Consumer, + + ctx: softbuffer::Context, + surface: softbuffer::Surface, + current_size: PhySize, + damaged: bool, } impl WindowHandler for OpenWindowExample { fn on_frame(&mut self, _window: &mut Window) { + let mut buf = self.surface.buffer_mut().unwrap(); + if self.damaged { + buf.fill(0xFFAAAAAA); + self.damaged = false; + } + buf.present().unwrap(); + while let Ok(message) = self.rx.pop() { println!("Message: {:?}", message); } } fn on_event(&mut self, _window: &mut Window, event: Event) -> EventStatus { - match event { - Event::Mouse(e) => { - println!("Mouse event: {:?}", e); + match &event { + #[cfg(target_os = "macos")] + Event::Mouse(MouseEvent::ButtonPressed { .. }) => copy_to_clipboard(&"This is a test!"), + Event::Window(WindowEvent::Resized(info)) => { + println!("Resized: {:?}", info); + let new_size = info.physical_size(); + self.current_size = new_size; - #[cfg(target_os = "macos")] - match e { - MouseEvent::ButtonPressed { .. } => { - copy_to_clipboard(&"This is a test!") - } - _ => (), + if let (Some(width), Some(height)) = + (NonZeroU32::new(new_size.width), NonZeroU32::new(new_size.height)) + { + self.surface.resize(width, height).unwrap(); + self.damaged = true; } } - Event::Keyboard(e) => println!("Keyboard event: {:?}", e), - Event::Window(e) => println!("Window event: {:?}", e), + _ => {} } + log_event(&event); + EventStatus::Captured } } @@ -56,13 +75,27 @@ fn main() { let (mut tx, rx) = RingBuffer::new(128); - ::std::thread::spawn(move || loop { - ::std::thread::sleep(Duration::from_secs(5)); + std::thread::spawn(move || loop { + std::thread::sleep(Duration::from_secs(5)); if let Err(_) = tx.push(Message::Hello) { println!("Failed sending message"); } }); - Window::open_blocking(window_open_options, |_| OpenWindowExample { rx }); + Window::open_blocking(window_open_options, |window| { + let ctx = unsafe { softbuffer::Context::new(window) }.unwrap(); + let mut surface = unsafe { softbuffer::Surface::new(&ctx, window) }.unwrap(); + surface.resize(NonZeroU32::new(512).unwrap(), NonZeroU32::new(512).unwrap()).unwrap(); + + OpenWindowExample { ctx, surface, rx, current_size: PhySize::new(512, 512), damaged: true } + }); +} + +fn log_event(event: &Event) { + match event { + Event::Mouse(e) => println!("Mouse event: {:?}", e), + Event::Keyboard(e) => println!("Keyboard event: {:?}", e), + Event::Window(e) => println!("Window event: {:?}", e), + } }