backend: add DevicesEnumerated event
This commit is contained in:
parent
dddd68ba06
commit
c6c87bdaa1
11 changed files with 65 additions and 4 deletions
|
|
@ -31,6 +31,7 @@ use {
|
|||
clonecell::{CloneCell, UnsafeCellCloneSafe},
|
||||
copyhashmap::CopyHashMap,
|
||||
errorfmt::ErrorFmt,
|
||||
numcell::NumCell,
|
||||
oserror::OsError,
|
||||
smallmap::SmallMap,
|
||||
syncqueue::SyncQueue,
|
||||
|
|
@ -226,6 +227,7 @@ pub async fn create(state: &Rc<State>) -> Result<Rc<MetalBackend>, MetalError> {
|
|||
input_devices: Default::default(),
|
||||
drm_devices: Default::default(),
|
||||
pending_drm_devices: Default::default(),
|
||||
num_pending_devices: Default::default(),
|
||||
});
|
||||
let udev = Rc::new(Udev::new()?);
|
||||
let monitor = Rc::new(udev.create_monitor()?);
|
||||
|
|
@ -309,6 +311,7 @@ struct DeviceHolder {
|
|||
input_devices: RefCell<Vec<Option<Rc<MetalInputDevice>>>>,
|
||||
drm_devices: CopyHashMap<c::dev_t, Rc<MetalDrmDeviceData>>,
|
||||
pending_drm_devices: CopyHashMap<c::dev_t, PendingDrmDevice>,
|
||||
num_pending_devices: NumCell<u32>,
|
||||
}
|
||||
|
||||
impl LibInputAdapter for DeviceHolder {
|
||||
|
|
|
|||
|
|
@ -5,11 +5,13 @@ use {
|
|||
video::{MetalDrmDeviceData, PendingDrmDevice},
|
||||
MetalBackend, MetalDevice, MetalError, MetalInputDevice,
|
||||
},
|
||||
dbus::TRUE,
|
||||
dbus::{DbusError, TRUE},
|
||||
udev::UdevDevice,
|
||||
utils::{bitflags::BitflagsExt, errorfmt::ErrorFmt, nonblock::set_nonblock},
|
||||
video::drm::DrmMaster,
|
||||
wire_dbus::org::freedesktop::login1::session::{PauseDevice, ResumeDevice},
|
||||
wire_dbus::org::freedesktop::login1::session::{
|
||||
PauseDevice, ResumeDevice, TakeDeviceReply,
|
||||
},
|
||||
},
|
||||
bstr::ByteSlice,
|
||||
std::{cell::Cell, rc::Rc},
|
||||
|
|
@ -199,7 +201,7 @@ impl MetalBackend {
|
|||
};
|
||||
self.device_holder.pending_drm_devices.set(devnum, dev);
|
||||
let slf = self.clone();
|
||||
self.session.get_device(devnum, move |res| {
|
||||
self.get_device(devnum, move |res| {
|
||||
let dev = match slf.device_holder.pending_drm_devices.remove(&devnum) {
|
||||
Some(d) if d.id == id => d,
|
||||
_ => return,
|
||||
|
|
@ -303,7 +305,7 @@ impl MetalBackend {
|
|||
self.device_holder
|
||||
.devices
|
||||
.set(devnum, MetalDevice::Input(dev));
|
||||
self.session.get_device(devnum, move |res| {
|
||||
self.get_device(devnum, move |res| {
|
||||
let id = &slf.device_holder.devices;
|
||||
let mut slots = slf.device_holder.input_devices.borrow_mut();
|
||||
let dev = 'dev: {
|
||||
|
|
@ -345,4 +347,23 @@ impl MetalBackend {
|
|||
});
|
||||
None
|
||||
}
|
||||
|
||||
fn get_device<F>(self: &Rc<Self>, dev: c::dev_t, f: F)
|
||||
where
|
||||
F: FnOnce(Result<&TakeDeviceReply, DbusError>) + 'static,
|
||||
{
|
||||
self.device_holder.num_pending_devices.fetch_add(1);
|
||||
let slf = self.clone();
|
||||
self.session.get_device(dev, move |res| {
|
||||
let rem = slf.device_holder.num_pending_devices.fetch_sub(1);
|
||||
f(res);
|
||||
if rem == 1 {
|
||||
slf.state
|
||||
.backend_events
|
||||
.push(BackendEvent::DevicesEnumerated);
|
||||
// Set to 1 to ensure this branch is never taken again.
|
||||
slf.device_holder.num_pending_devices.set(1);
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -299,6 +299,10 @@ impl XBackend {
|
|||
self.active_output(output).await;
|
||||
}
|
||||
|
||||
self.state
|
||||
.backend_events
|
||||
.push(BackendEvent::DevicesEnumerated);
|
||||
|
||||
pending().await
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue