Be more aggressive about handling user activity

Previously we only trigger unblanking or showing the unlock dialog if
core key or motion events come through.  Now we also do this when xinput
events come in.  We also now reset the last-user-activity time for core
events.

This also changes xcb-xembed to explicitly only handle core events.
This commit is contained in:
2022-06-08 00:30:11 -07:00
parent b0c2ffc74a
commit d3de9f7fad
2 changed files with 44 additions and 36 deletions

View File

@ -122,13 +122,13 @@ impl<'a> Embedder<'a> {
Ok(())
}
pub fn event(&mut self, event: &xcb::Event) -> Result<bool, Error> {
pub fn event(&mut self, event: &x::Event) -> Result<bool, Error> {
if self.client == x::WINDOW_NONE {
return Err(Error::ClientDestroyed);
}
match event {
xcb::Event::X(x::Event::PropertyNotify(ev)) if ev.window() == self.client && ev.atom() == intern_atom(self.conn, XEMBED_INFO_ATOM_NAME)? => {
x::Event::PropertyNotify(ev) if ev.window() == self.client && ev.atom() == intern_atom(self.conn, XEMBED_INFO_ATOM_NAME)? => {
let info = fetch_xembed_info(self.conn, self.client)?;
if (self.flags & XEmbedFlags::MAPPED) != (info.flags & XEmbedFlags::MAPPED) {
if info.flags.contains(XEmbedFlags::MAPPED) {
@ -146,7 +146,7 @@ impl<'a> Embedder<'a> {
}
Ok(true)
},
xcb::Event::X(x::Event::ConfigureNotify(ev)) if ev.window() == self.client => {
x::Event::ConfigureNotify(ev) if ev.window() == self.client => {
let mut cookies = Vec::new();
if ev.x() != 0 || ev.y() != 0 {
cookies.push(self.conn.send_request_checked(&x::ConfigureWindow {
@ -169,7 +169,7 @@ impl<'a> Embedder<'a> {
}
Ok(true)
},
xcb::Event::X(x::Event::ClientMessage(ev)) if ev.window() == self.embedder && ev.r#type() == intern_atom(self.conn, XEMBED_MESSAGE_ATOM_NAME)? => {
x::Event::ClientMessage(ev) if ev.window() == self.embedder && ev.r#type() == intern_atom(self.conn, XEMBED_MESSAGE_ATOM_NAME)? => {
match ev.data() {
x::ClientMessageData::Data32(data) if data[1] == XEmbedMessage::RequestFocus as u32 => {
debug!("Client requests focus");
@ -188,7 +188,7 @@ impl<'a> Embedder<'a> {
_ => Ok(false),
}
},
xcb::Event::X(x::Event::KeyPress(ev)) if ev.event() == self.embedder && self.flags.contains(XEmbedFlags::MAPPED) => {
x::Event::KeyPress(ev) if ev.event() == self.embedder && self.flags.contains(XEmbedFlags::MAPPED) => {
trace!("Forwarding key press to client ({:?} + {})", ev.state(), ev.detail());
self.conn.send_and_check_request(&x::SendEvent {
propagate: false,
@ -199,7 +199,7 @@ impl<'a> Embedder<'a> {
Ok(true)
},
/*
xcb::Event::X(x::Event::KeyRelease(ev)) if ev.event() == self.embedder && self.flags.contains(XEmbedFlags::MAPPED) => {
x::Event::KeyRelease(ev) if ev.event() == self.embedder && self.flags.contains(XEmbedFlags::MAPPED) => {
trace!("Forwarding key release to client ({:?} + {})", ev.state(), ev.detail());
self.conn.send_and_check_request(&x::SendEvent {
propagate: false,
@ -210,7 +210,7 @@ impl<'a> Embedder<'a> {
Ok(true)
},
*/
xcb::Event::X(x::Event::MotionNotify(ev)) if ev.event() == self.embedder && self.flags.contains(XEmbedFlags::MAPPED) => {
x::Event::MotionNotify(ev) if ev.event() == self.embedder && self.flags.contains(XEmbedFlags::MAPPED) => {
trace!("Forwarding pointer motion to client ({}, {})", ev.event_x(), ev.event_y());
self.conn.send_and_check_request(&x::SendEvent {
propagate: false,
@ -220,7 +220,7 @@ impl<'a> Embedder<'a> {
})?;
Ok(true)
},
xcb::Event::X(x::Event::ButtonPress(ev)) if ev.event() == self.embedder && self.flags.contains(XEmbedFlags::MAPPED) => {
x::Event::ButtonPress(ev) if ev.event() == self.embedder && self.flags.contains(XEmbedFlags::MAPPED) => {
trace!("Forwarding button press to client ({:?} + {}: {}, {})", ev.state(), ev.detail(), ev.event_x(), ev.event_y());
self.conn.send_and_check_request(&x::SendEvent {
propagate: false,
@ -230,7 +230,7 @@ impl<'a> Embedder<'a> {
})?;
Ok(true)
},
xcb::Event::X(x::Event::ButtonRelease(ev)) if ev.event() == self.embedder && self.flags.contains(XEmbedFlags::MAPPED) => {
x::Event::ButtonRelease(ev) if ev.event() == self.embedder && self.flags.contains(XEmbedFlags::MAPPED) => {
trace!("Forwarding button release to client ({:?} + {}: {}, {})", ev.state(), ev.detail(), ev.event_x(), ev.event_y());
self.conn.send_and_check_request(&x::SendEvent {
propagate: false,
@ -240,12 +240,12 @@ impl<'a> Embedder<'a> {
})?;
Ok(true)
},
xcb::Event::X(x::Event::UnmapNotify(ev)) if ev.window() == self.client => {
x::Event::UnmapNotify(ev) if ev.window() == self.client => {
debug!("Client was unmapped");
self.flags -= XEmbedFlags::MAPPED;
Ok(true)
},
xcb::Event::X(x::Event::DestroyNotify(ev)) if ev.window() == self.client => {
x::Event::DestroyNotify(ev) if ev.window() == self.client => {
debug!("Client was destroyed");
self.flags -= XEmbedFlags::MAPPED;
self.client = x::WINDOW_NONE;