surface: process offset request without a buffer change
This commit is contained in:
parent
adf6d2ae2b
commit
9cddeb964d
9 changed files with 98 additions and 11 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(())
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
55
src/it/tests/t0020_surface_offset.rs
Normal file
55
src/it/tests/t0020_surface_offset.rs
Normal 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(())
|
||||
}
|
||||
BIN
src/it/tests/t0020_surface_offset/screenshot_1.qoi
Normal file
BIN
src/it/tests/t0020_surface_offset/screenshot_1.qoi
Normal file
Binary file not shown.
BIN
src/it/tests/t0020_surface_offset/screenshot_2.qoi
Normal file
BIN
src/it/tests/t0020_surface_offset/screenshot_2.qoi
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue