Skip to content

Commit

Permalink
[feat] add argument to ignore devices
Browse files Browse the repository at this point in the history
--ignoredevice takes the same format as --device and ignores the devices
listed, separated by semicolon. If a device is listed both in the --device
argument and --ignoredevice argument, it is not added.

Also replaced default name from "" to "[unknown]" to prevent devices
without valid names from being matched by empty device arguments.
  • Loading branch information
aadilshabier committed Mar 27, 2024
1 parent b0fe88c commit 53d85df
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 8 deletions.
5 changes: 4 additions & 1 deletion docs/swhkd.1.scd
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,12 @@ More about the config file syntax in `swhkd(5)`
*-d*, *--debug*
Enable debug mode.

*-D, --device* <DEVICE_NAME>
*-D, --device* <DEVICE_NAMES>
Manually set the keyboard devices to use. Can occur multiple times.

*-I, --ignoredevice* <DEVICE_NAMES>
Manually set the keyboard devices to ignore. Can occur multiple times.

# SIGNALS

- Reload config file: `sudo pkill -HUP swhkd`
Expand Down
22 changes: 15 additions & 7 deletions swhkd/src/daemon.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ struct Args {
/// Take a list of devices from the user
#[arg(short = 'D', long, num_args = 0.., value_delimiter = ' ')]
device: Vec<String>,

/// Take a list of devices to ignore from the user
#[arg(short = 'I', long, num_args = 0.., value_delimiter = ' ')]
ignoredevice: Vec<String>,
}

#[tokio::main]
Expand Down Expand Up @@ -155,16 +159,20 @@ async fn main() -> Result<(), Box<dyn Error>> {
};
}

let arg_devices: Vec<String> = args.device;
let arg_add_devices = args.device;
let arg_ignore_devices = args.ignoredevice;

let to_add = |dev: &Device| arg_add_devices.contains(&dev.name().unwrap_or("[unknown]").to_string());
let to_ignore = |dev: &Device| arg_ignore_devices.contains(&dev.name().unwrap_or("[unknown]").to_string());

let keyboard_devices: Vec<_> = {
if arg_devices.is_empty() {
if arg_add_devices.is_empty() {
log::trace!("Attempting to find all keyboard file descriptors.");
evdev::enumerate().filter(|(_, dev)| check_device_is_keyboard(dev)).collect()
} else {
evdev::enumerate()
.filter(|(_, dev)| arg_devices.contains(&dev.name().unwrap_or("").to_string()))
.filter(|(_, dev)| !to_ignore(dev) && check_device_is_keyboard(dev))
.collect()
} else {
evdev::enumerate().filter(|(_, dev)| !to_ignore(dev) && to_add(dev)).collect()
}
};

Expand Down Expand Up @@ -316,8 +324,8 @@ async fn main() -> Result<(), Box<dyn Error>> {
},
Ok(device) => device
};
let name = device.name().unwrap_or("[unknown]").to_string();
if arg_devices.contains(&name) || check_device_is_keyboard(&device) {
if !to_ignore(&device) && (to_add(&device) || check_device_is_keyboard(&device)) {
let name = device.name().unwrap_or("[unknown]");
log::info!("Device '{}' at '{}' added.", name, node);
let _ = device.grab();
keyboard_states.insert(node.to_string(), KeyboardState::new());
Expand Down

0 comments on commit 53d85df

Please sign in to comment.