From 9cddeb964d52cb28a0b42085b21b0e7d65e9f7d5 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Tue, 2 Apr 2024 13:22:21 +0200 Subject: [PATCH] surface: process offset request without a buffer change --- src/ifs/wl_surface.rs | 16 ++--- src/it/test_ifs/test_pointer.rs | 22 ++++++- src/it/test_ifs/test_registry.rs | 2 +- src/it/test_ifs/test_surface.rs | 9 +++ src/it/testrun.rs | 2 + src/it/tests.rs | 3 + src/it/tests/t0020_surface_offset.rs | 55 ++++++++++++++++++ .../t0020_surface_offset/screenshot_1.qoi | Bin 0 -> 8141 bytes .../t0020_surface_offset/screenshot_2.qoi | Bin 0 -> 8141 bytes 9 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 src/it/tests/t0020_surface_offset.rs create mode 100644 src/it/tests/t0020_surface_offset/screenshot_1.qoi create mode 100644 src/it/tests/t0020_surface_offset/screenshot_2.qoi diff --git a/src/ifs/wl_surface.rs b/src/ifs/wl_surface.rs index e90f6004..decbdf1b 100644 --- a/src/ifs/wl_surface.rs +++ b/src/ifs/wl_surface.rs @@ -910,14 +910,6 @@ impl WlSurface { release, }; self.buffer.set(Some(Rc::new(surface_buffer))); - self.buf_x.fetch_add(dx); - self.buf_y.fetch_add(dy); - if (dx, dy) != (0, 0) { - self.need_extents_update.set(true); - for (_, cursor) in &self.cursors { - cursor.dec_hotspot(dx, dy); - } - } } else { self.buf_x.set(0); self.buf_y.set(0); @@ -926,6 +918,14 @@ impl WlSurface { } } } + if self.buffer.is_some() && (dx, dy) != (0, 0) { + self.buf_x.fetch_add(dx); + self.buf_y.fetch_add(dy); + self.need_extents_update.set(true); + for (_, cursor) in &self.cursors { + cursor.dec_hotspot(dx, dy); + } + } let transform_changed = viewport_changed || scale_changed || buffer_transform_changed; if buffer_changed || transform_changed { let mut buffer_points = self.buffer_points.borrow_mut(); diff --git a/src/it/test_ifs/test_pointer.rs b/src/it/test_ifs/test_pointer.rs index f858c743..e76f9ffa 100644 --- a/src/it/test_ifs/test_pointer.rs +++ b/src/it/test_ifs/test_pointer.rs @@ -2,8 +2,9 @@ use { crate::{ ifs::wl_seat::wl_pointer::WlPointer, it::{ - test_error::TestResult, test_object::TestObject, test_transport::TestTransport, - test_utils::test_expected_event::TEEH, testrun::ParseFull, + test_error::TestResult, test_ifs::test_surface::TestSurface, test_object::TestObject, + test_transport::TestTransport, test_utils::test_expected_event::TEEH, + testrun::ParseFull, }, utils::{buffd::MsgParser, clonecell::CloneCell}, wire::{wl_pointer::*, WlPointerId}, @@ -30,6 +31,23 @@ impl TestPointer { Ok(()) } + pub fn set_cursor( + &self, + serial: u32, + surface: &TestSurface, + hotspot_x: i32, + hotspot_y: i32, + ) -> TestResult { + self.tran.send(SetCursor { + self_id: self.id, + serial, + surface: surface.id, + hotspot_x, + hotspot_y, + })?; + Ok(()) + } + fn handle_enter(&self, parser: MsgParser<'_, '_>) -> TestResult { let ev = Enter::parse_full(parser)?; self.enter.push(ev); diff --git a/src/it/test_ifs/test_registry.rs b/src/it/test_ifs/test_registry.rs index 3154dee6..5f31a73a 100644 --- a/src/it/test_ifs/test_registry.rs +++ b/src/it/test_ifs/test_registry.rs @@ -124,7 +124,7 @@ impl TestRegistry { id: self.tran.id(), tran: self.tran.clone(), }); - self.bind(&jc, singletons.wl_compositor, 4)?; + self.bind(&jc, singletons.wl_compositor, 6)?; self.compositor.set(Some(jc.clone())); Ok(jc) } diff --git a/src/it/test_ifs/test_surface.rs b/src/it/test_ifs/test_surface.rs index 837f7894..fa05c11e 100644 --- a/src/it/test_ifs/test_surface.rs +++ b/src/it/test_ifs/test_surface.rs @@ -36,6 +36,15 @@ impl TestSurface { Ok(()) } + pub fn offset(&self, dx: i32, dy: i32) -> Result<(), TestError> { + self.tran.send(Offset { + self_id: self.id, + x: dx, + y: dy, + })?; + Ok(()) + } + pub fn commit(&self) -> Result<(), TestError> { self.tran.send(Commit { self_id: self.id })?; Ok(()) diff --git a/src/it/testrun.rs b/src/it/testrun.rs index ee5751d9..157258cc 100644 --- a/src/it/testrun.rs +++ b/src/it/testrun.rs @@ -113,7 +113,9 @@ impl TestRun { .set_input_device_seat(self.backend.default_kb.common.id, seat.id())?; self.cfg .set_input_device_seat(self.backend.default_mouse.common.id, seat.id())?; + self.backend.default_mouse.click(1); self.state.eng.yield_now().await; + self.cfg.show_workspace(seat.id(), "")?; Ok(DefaultSetup { connector: self.backend.default_connector.clone(), output, diff --git a/src/it/tests.rs b/src/it/tests.rs index f47ef0dc..a6931da7 100644 --- a/src/it/tests.rs +++ b/src/it/tests.rs @@ -45,6 +45,7 @@ mod t0016_scroll_ws; mod t0017_remove_unused_ws; mod t0018_click_to_active_ws; mod t0019_natural_scrolling; +mod t0020_surface_offset; pub trait TestCase: Sync { fn name(&self) -> &'static str; @@ -62,6 +63,7 @@ pub fn tests() -> Vec<&'static dyn TestCase> { ] } } + tests! { t0001_shm_formats, t0002_window, @@ -82,5 +84,6 @@ pub fn tests() -> Vec<&'static dyn TestCase> { t0017_remove_unused_ws, t0018_click_to_active_ws, t0019_natural_scrolling, + t0020_surface_offset, } } diff --git a/src/it/tests/t0020_surface_offset.rs b/src/it/tests/t0020_surface_offset.rs new file mode 100644 index 00000000..351cdfd6 --- /dev/null +++ b/src/it/tests/t0020_surface_offset.rs @@ -0,0 +1,55 @@ +use { + crate::{ + it::{ + test_error::TestError, + test_utils::{ + test_container_node_ext::TestContainerExt, test_ouput_node_ext::TestOutputNodeExt, + test_toplevel_node_ext::TestToplevelNodeExt, + test_workspace_node_ext::TestWorkspaceNodeExt, + }, + testrun::TestRun, + }, + theme::Color, + }, + std::rc::Rc, +}; + +testcase!(); + +async fn test(run: Rc) -> Result<(), TestError> { + let ds = run.create_default_setup().await?; + + let client = run.create_client().await?; + let seat = client.get_default_seat().await?; + let enter = seat.pointer.enter.expect()?; + let win1 = client.create_window().await?; + win1.map2().await?; + + let buffer = client.spbm.create_buffer(Color::from_rgb(255, 0, 0))?; + let surface = client.comp.create_surface().await?; + let vp = client.viewporter.get_viewport(&surface)?; + vp.set_destination(100, 100)?; + surface.attach(buffer.id)?; + surface.commit()?; + + let (x, y) = ds + .output + .workspace()? + .container()? + .first_toplevel()? + .center(); + ds.move_to(x, y); + + client.sync().await; + let enter = enter.next()?; + seat.pointer.set_cursor(enter.serial, &surface, 0, 0)?; + + client.compare_screenshot("1").await?; + + surface.offset(-100, -100)?; + surface.commit()?; + + client.compare_screenshot("2").await?; + + Ok(()) +} diff --git a/src/it/tests/t0020_surface_offset/screenshot_1.qoi b/src/it/tests/t0020_surface_offset/screenshot_1.qoi new file mode 100644 index 0000000000000000000000000000000000000000..eef5f37a645f72caeef422b0da0ac30b6bbd7161 GIT binary patch literal 8141 zcmXTS&rD-rU{+vYV2WU7_@@zCe*PZ=1H)e=@KpS~DH8YZh~xh=Ha12MfN$c+ykW+^ zVub9WZzwU3EHla;4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu;scnF+``uhaA z2YJD0ls_6C@Z|A#G(C*whtd2nnjc^xfL?hO&ov! z{vAyZqxoSpKaA!FSO}n(2QcwbdNc$^Ltr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU N1W-fZ1Oo&x0s!R7d2Rpz literal 0 HcmV?d00001