diff --git a/src/backend/drm/backend.rs b/src/backend/drm/backend.rs index 76bfbac..95f5223 100644 --- a/src/backend/drm/backend.rs +++ b/src/backend/drm/backend.rs @@ -24,8 +24,8 @@ pub struct DrmBackend { } pub(crate) struct DrmBackendInternal { - context: Rc, GbmDevice>>, - cursor: Cell>, + pub(crate) context: Rc, GbmDevice>>, + pub(crate) cursor: Cell<(BufferObject<()>, (u32, u32))>, current_frame_buffer: Cell, front_buffer: Cell>, next_buffer: Cell>>, @@ -96,14 +96,14 @@ impl DrmBackend { })?; front_bo.set_userdata(fb).unwrap(); - let cursor = Cell::new(context + let cursor = Cell::new((context .create_buffer_object( 1, 1, GbmFormat::ARGB8888, BufferObjectFlags::CURSOR | BufferObjectFlags::WRITE, ) - .chain_err(|| ErrorKind::GbmInitFailed)?); + .chain_err(|| ErrorKind::GbmInitFailed)?, (0,0))); Ok(DrmBackend { backend: Rc::new(DrmBackendInternal { @@ -455,7 +455,7 @@ impl GraphicsBackend for DrmBackend { } // and store it - self.backend.cursor.set(cursor); + self.backend.cursor.set((cursor, hotspot)); Ok(()) } } diff --git a/src/backend/drm/mod.rs b/src/backend/drm/mod.rs index f310382..3a3d590 100644 --- a/src/backend/drm/mod.rs +++ b/src/backend/drm/mod.rs @@ -219,7 +219,7 @@ use drm::control::{connector, crtc, encoder, Mode, ResourceInfo}; use drm::control::Device as ControlDevice; use drm::control::framebuffer; use drm::result::Error as DrmError; -use gbm::Device as GbmDevice; +use gbm::{Device as GbmDevice, BufferObject}; use nix; use nix::sys::stat::{self, dev_t, fstat}; use std::collections::HashMap; @@ -655,6 +655,25 @@ impl SessionObserver for StateToken> { "Failed to activate crtc ({:?}) again. Error: {}", crtc, err ); } + // reset cursor + { + let &(ref cursor, ref hotspot) : &(BufferObject<()>, (u32, u32)) + = unsafe { &*backend.cursor.as_ptr() }; + if crtc::set_cursor2( + &*backend.context, + *crtc, + cursor, + ((*hotspot).0 as i32, (*hotspot).1 as i32), + ).is_err() + { + if let Err(err) = crtc::set_cursor(&*backend.context, *crtc, cursor) { + error!( + device.logger, + "Failed to reset cursor. Error: {}", err + ); + } + } + } } else { crtcs.push(*crtc); }