diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-06 09:01:26 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-06 09:40:45 +0400 |
| commit | 122afff7d10ac96250f428a3f06dca6288d3d0b8 (patch) | |
| tree | 1c6d89f1ee1cf08c42be102907a9e4594dedbb1a /niri-visual-tests/src/cases | |
| parent | d2a4e6a0cbc839813c6d4ef68b75820d87cfc5b0 (diff) | |
| download | niri-122afff7d10ac96250f428a3f06dca6288d3d0b8.tar.gz niri-122afff7d10ac96250f428a3f06dca6288d3d0b8.tar.bz2 niri-122afff7d10ac96250f428a3f06dca6288d3d0b8.zip | |
Add niri-visual-tests
Diffstat (limited to 'niri-visual-tests/src/cases')
| -rw-r--r-- | niri-visual-tests/src/cases/mod.rs | 21 | ||||
| -rw-r--r-- | niri-visual-tests/src/cases/tile.rs | 83 | ||||
| -rw-r--r-- | niri-visual-tests/src/cases/window.rs | 57 |
3 files changed, 161 insertions, 0 deletions
diff --git a/niri-visual-tests/src/cases/mod.rs b/niri-visual-tests/src/cases/mod.rs new file mode 100644 index 00000000..b7d71cd0 --- /dev/null +++ b/niri-visual-tests/src/cases/mod.rs @@ -0,0 +1,21 @@ +use std::time::Duration; + +use smithay::backend::renderer::element::RenderElement; +use smithay::backend::renderer::gles::GlesRenderer; +use smithay::utils::{Physical, Size}; + +pub mod tile; +pub mod window; + +pub trait TestCase { + fn resize(&mut self, width: i32, height: i32); + fn are_animations_ongoing(&self) -> bool { + false + } + fn advance_animations(&mut self, _current_time: Duration) {} + fn render( + &mut self, + renderer: &mut GlesRenderer, + size: Size<i32, Physical>, + ) -> Vec<Box<dyn RenderElement<GlesRenderer>>>; +} diff --git a/niri-visual-tests/src/cases/tile.rs b/niri-visual-tests/src/cases/tile.rs new file mode 100644 index 00000000..cdf1e5f6 --- /dev/null +++ b/niri-visual-tests/src/cases/tile.rs @@ -0,0 +1,83 @@ +use std::rc::Rc; +use std::time::Duration; + +use niri::layout::tile::Tile; +use niri::layout::Options; +use niri_config::Color; +use smithay::backend::renderer::element::RenderElement; +use smithay::backend::renderer::gles::GlesRenderer; +use smithay::utils::{Logical, Physical, Point, Scale, Size}; + +use super::TestCase; +use crate::test_window::TestWindow; + +pub struct JustTile { + window: TestWindow, + tile: Tile<TestWindow>, +} + +impl JustTile { + pub fn freeform(size: Size<i32, Logical>) -> Self { + let window = TestWindow::freeform(0); + let mut rv = Self::with_window(window); + rv.tile.request_tile_size(size); + rv.window.communicate(); + rv + } + + pub fn fixed_size(size: Size<i32, Logical>) -> Self { + let window = TestWindow::fixed_size(0); + let mut rv = Self::with_window(window); + rv.tile.request_tile_size(size); + rv.window.communicate(); + rv + } + + pub fn fixed_size_with_csd_shadow(size: Size<i32, Logical>) -> Self { + let window = TestWindow::fixed_size(0); + window.set_csd_shadow_width(64); + let mut rv = Self::with_window(window); + rv.tile.request_tile_size(size); + rv.window.communicate(); + rv + } + + pub fn with_window(window: TestWindow) -> Self { + let options = Options { + border: niri_config::FocusRing { + off: false, + width: 32, + active_color: Color::new(255, 163, 72, 255), + ..Default::default() + }, + ..Default::default() + }; + let tile = Tile::new(window.clone(), Rc::new(options)); + Self { window, tile } + } +} + +impl TestCase for JustTile { + fn resize(&mut self, width: i32, height: i32) { + self.tile.request_tile_size(Size::from((width, height))); + self.window.communicate(); + } + + fn advance_animations(&mut self, current_time: Duration) { + self.tile.advance_animations(current_time, true); + } + + fn render( + &mut self, + renderer: &mut GlesRenderer, + size: Size<i32, Physical>, + ) -> Vec<Box<dyn RenderElement<GlesRenderer>>> { + let tile_size = self.tile.tile_size().to_physical(1); + let location = Point::from(((size.w - tile_size.w) / 2, (size.h - tile_size.h) / 2)); + + self.tile + .render(renderer, location, Scale::from(1.)) + .map(|elem| Box::new(elem) as _) + .collect() + } +} diff --git a/niri-visual-tests/src/cases/window.rs b/niri-visual-tests/src/cases/window.rs new file mode 100644 index 00000000..869cbf45 --- /dev/null +++ b/niri-visual-tests/src/cases/window.rs @@ -0,0 +1,57 @@ +use niri::layout::LayoutElement; +use smithay::backend::renderer::element::RenderElement; +use smithay::backend::renderer::gles::GlesRenderer; +use smithay::utils::{Logical, Physical, Point, Scale, Size}; + +use super::TestCase; +use crate::test_window::TestWindow; + +pub struct JustWindow { + window: TestWindow, +} + +impl JustWindow { + pub fn freeform(size: Size<i32, Logical>) -> Self { + let window = TestWindow::freeform(0); + window.request_size(size); + window.communicate(); + Self { window } + } + + pub fn fixed_size(size: Size<i32, Logical>) -> Self { + let window = TestWindow::fixed_size(0); + window.request_size(size); + window.communicate(); + Self { window } + } + + pub fn fixed_size_with_csd_shadow(size: Size<i32, Logical>) -> Self { + let window = TestWindow::fixed_size(0); + window.set_csd_shadow_width(64); + window.request_size(size); + window.communicate(); + Self { window } + } +} + +impl TestCase for JustWindow { + fn resize(&mut self, width: i32, height: i32) { + self.window.request_size(Size::from((width, height))); + self.window.communicate(); + } + + fn render( + &mut self, + renderer: &mut GlesRenderer, + size: Size<i32, Physical>, + ) -> Vec<Box<dyn RenderElement<GlesRenderer>>> { + let win_size = self.window.size().to_physical(1); + let location = Point::from(((size.w - win_size.w) / 2, (size.h - win_size.h) / 2)); + + self.window + .render(renderer, location, Scale::from(1.)) + .into_iter() + .map(|elem| Box::new(elem) as _) + .collect() + } +} |
