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:
@ -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;
|
||||
|
Reference in New Issue
Block a user