Refactor linux methods
This commit is contained in:
parent
75ca7ec071
commit
79a1b85769
|
@ -100,9 +100,10 @@ impl Source for EVDEVSource {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn eventloop(&self, event_callback: SourceCallback) {
|
fn eventloop(&self, event_callback: SourceCallback) -> Result<()> {
|
||||||
if self.devices.is_empty() {
|
if self.devices.is_empty() {
|
||||||
panic!("can't start eventloop without evdev devices");
|
error!("can't start eventloop without evdev devices");
|
||||||
|
return Err(EVDEVSourceError::NoDevices().into());
|
||||||
}
|
}
|
||||||
|
|
||||||
let raw_epfd = unsafe { libc::epoll_create1(0) };
|
let raw_epfd = unsafe { libc::epoll_create1(0) };
|
||||||
|
@ -111,7 +112,8 @@ impl Source for EVDEVSource {
|
||||||
});
|
});
|
||||||
|
|
||||||
if *epfd < 0 {
|
if *epfd < 0 {
|
||||||
panic!("could not create epoll instance");
|
error!("could not create epoll instance");
|
||||||
|
return Err(EVDEVSourceError::Internal().into());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup epoll for all input devices
|
// Setup epoll for all input devices
|
||||||
|
@ -121,11 +123,12 @@ impl Source for EVDEVSource {
|
||||||
ev.events = EPOLLIN as u32;
|
ev.events = EPOLLIN as u32;
|
||||||
ev.u64 = i as u64;
|
ev.u64 = i as u64;
|
||||||
if unsafe { epoll_ctl(*epfd, EPOLL_CTL_ADD, device.get_raw_fd(), &mut ev) } != 0 {
|
if unsafe { epoll_ctl(*epfd, EPOLL_CTL_ADD, device.get_raw_fd(), &mut ev) } != 0 {
|
||||||
panic!(format!(
|
error!(
|
||||||
"Could not add {} to epoll, errno {}",
|
"Could not add {} to epoll, errno {}",
|
||||||
device.get_path(),
|
device.get_path(),
|
||||||
unsafe { *errno_ptr }
|
unsafe { *errno_ptr }
|
||||||
));
|
);
|
||||||
|
return Err(EVDEVSourceError::Internal().into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,9 +140,10 @@ impl Source for EVDEVSource {
|
||||||
if unsafe { *errno_ptr } == EINTR {
|
if unsafe { *errno_ptr } == EINTR {
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
panic!(format!("Could not poll for events, {}", unsafe {
|
error!("Could not poll for events, {}", unsafe {
|
||||||
*errno_ptr
|
*errno_ptr
|
||||||
}))
|
});
|
||||||
|
return Err(EVDEVSourceError::Internal().into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,6 +176,12 @@ pub enum EVDEVSourceError {
|
||||||
|
|
||||||
#[error("permission denied")]
|
#[error("permission denied")]
|
||||||
PermissionDenied(),
|
PermissionDenied(),
|
||||||
|
|
||||||
|
#[error("no devices")]
|
||||||
|
NoDevices(),
|
||||||
|
|
||||||
|
#[error("internal error")]
|
||||||
|
Internal(),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<RawInputEvent> for Option<InputEvent> {
|
impl From<RawInputEvent> for Option<InputEvent> {
|
||||||
|
|
|
@ -114,13 +114,15 @@ impl Source for X11Source {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn eventloop(&self, event_callback: SourceCallback) {
|
fn eventloop(&self, event_callback: SourceCallback) -> Result<()> {
|
||||||
if self.handle.is_null() {
|
if self.handle.is_null() {
|
||||||
panic!("Attempt to start X11Source eventloop without initialization");
|
error!("Attempt to start X11Source eventloop without initialization");
|
||||||
|
return Err(X11SourceError::Internal().into());
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.callback.fill(event_callback).is_err() {
|
if self.callback.fill(event_callback).is_err() {
|
||||||
panic!("Unable to set X11Source event callback");
|
error!("Unable to set X11Source event callback");
|
||||||
|
return Err(X11SourceError::Internal().into());
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" fn callback(_self: *mut X11Source, event: RawInputEvent) {
|
extern "C" fn callback(_self: *mut X11Source, event: RawInputEvent) {
|
||||||
|
@ -137,8 +139,11 @@ impl Source for X11Source {
|
||||||
let error_code = unsafe { detect_eventloop(self.handle, callback) };
|
let error_code = unsafe { detect_eventloop(self.handle, callback) };
|
||||||
|
|
||||||
if error_code <= 0 {
|
if error_code <= 0 {
|
||||||
panic!("X11Source eventloop returned a negative error code");
|
error!("X11Source eventloop returned a negative error code");
|
||||||
|
return Err(X11SourceError::Internal().into());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,6 +178,9 @@ pub enum X11SourceError {
|
||||||
|
|
||||||
#[error("unknown error")]
|
#[error("unknown error")]
|
||||||
Unknown(),
|
Unknown(),
|
||||||
|
|
||||||
|
#[error("internal error")]
|
||||||
|
Internal(),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<RawInputEvent> for Option<InputEvent> {
|
impl From<RawInputEvent> for Option<InputEvent> {
|
||||||
|
|
|
@ -54,7 +54,8 @@ pub fn create_ui(options: UIOptions) -> Result<(Box<dyn UIRemote>, Box<dyn UIEve
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
pub fn create_ui(options: UIOptions) -> Result<(Box<dyn UIRemote>, Box<dyn UIEventLoop>)> {
|
pub fn create_ui(options: UIOptions) -> Result<(Box<dyn UIRemote>, Box<dyn
|
||||||
|
UIEventLoop>)> {
|
||||||
let (remote, eventloop) = mac::create(mac::MacUIOptions {
|
let (remote, eventloop) = mac::create(mac::MacUIOptions {
|
||||||
show_icon: options.show_icon,
|
show_icon: options.show_icon,
|
||||||
icon_paths: &options.icon_paths,
|
icon_paths: &options.icon_paths,
|
||||||
|
@ -65,7 +66,7 @@ pub fn create_ui(options: UIOptions) -> Result<(Box<dyn UIRemote>, Box<dyn UIEve
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
pub fn create_ui(options: UIOptions) -> Result<(Box<dyn UIRemote>, Box<dyn UIEventLoop>)> {
|
pub fn create_ui(options: UIOptions) -> Result<(Box<dyn UIRemote>, Box<dyn UIEventLoop>)> {
|
||||||
let (remote, eventloop) = linux::create(linux::LinuxUIOptions {
|
let (remote, eventloop) = linux::create(linux::LinuxUIOptions {
|
||||||
notification_icon_path: options.notification_icon_path.ok_or(UIError::MissingOption("notification icon".to_string()))?,
|
notification_icon_path: options.notification_icon_path.ok_or_else(|| UIError::MissingOption("notification icon".to_string()))?,
|
||||||
});
|
});
|
||||||
Ok((Box::new(remote), Box::new(eventloop)))
|
Ok((Box::new(remote), Box::new(eventloop)))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use log::error;
|
use log::error;
|
||||||
|
use anyhow::Result;
|
||||||
use notify_rust::Notification;
|
use notify_rust::Notification;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
use std::sync::mpsc::{Receiver, Sender};
|
use std::sync::mpsc::{Receiver, Sender};
|
||||||
|
@ -66,13 +67,19 @@ impl LinuxEventLoop {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UIEventLoop for LinuxEventLoop {
|
impl UIEventLoop for LinuxEventLoop {
|
||||||
fn initialize(&mut self) {
|
fn initialize(&mut self) -> Result<()> {
|
||||||
// NOOP on linux
|
// NOOP on linux
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run(&self, _: crate::UIEventCallback) {
|
fn run(&self, _: crate::UIEventCallback) -> Result<()> {
|
||||||
// We don't run an event loop on Linux as there is no tray icon or application window needed.
|
// We don't run an event loop on Linux as there is no tray icon or application window needed.
|
||||||
// Thad said, we still need a way to block this method, and thus we use a channel
|
// Thad said, we still need a way to block this method, and thus we use a channel
|
||||||
self.rx.recv().expect("Unable to block the LinuxEventLoop");
|
if let Err(error) = self.rx.recv() {
|
||||||
|
error!("Unable to block the LinuxEventLoop: {}", error);
|
||||||
|
return Err(error.into());
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user