1
0
Fork 0
forked from wry/wry

surface: process offset request without a buffer change

This commit is contained in:
Julian Orth 2024-04-02 13:22:21 +02:00
parent adf6d2ae2b
commit 9cddeb964d
9 changed files with 98 additions and 11 deletions

View file

@ -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();

View file

@ -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);

View file

@ -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)
}

View file

@ -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(())

View file

@ -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,

View file

@ -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,
}
}

View file

@ -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<TestRun>) -> 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(())
}

Binary file not shown.

Binary file not shown.