Skip to content

Commit 3cd0d17

Browse files
committed
[feat] add argument to ignore devices
--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.
1 parent 7999a9b commit 3cd0d17

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

docs/swhkd.1.scd

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,12 @@ More about the config file syntax in `swhkd(5)`
3838
*-d*, *--debug*
3939
Enable debug mode.
4040

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

44+
*-I, --ignoredevice* <DEVICE_NAMES>
45+
Manually set the keyboard devices to ignore. Can occur multiple times.
46+
4447
# SIGNALS
4548

4649
- Reload config file: `sudo pkill -HUP swhkd`

swhkd/src/daemon.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ struct Args {
6464
/// Take a list of devices from the user
6565
#[arg(short = 'D', long, num_args = 0.., value_delimiter = ' ')]
6666
device: Vec<String>,
67+
68+
/// Take a list of devices to ignore from the user
69+
#[arg(short = 'I', long, num_args = 0.., value_delimiter = ' ')]
70+
ignoredevice: Vec<String>,
6771
}
6872

6973
#[tokio::main]
@@ -110,16 +114,22 @@ async fn main() -> Result<(), Box<dyn Error>> {
110114

111115
let mut modes = load_config();
112116
let mut mode_stack: Vec<usize> = vec![0];
113-
let arg_devices: Vec<String> = args.device;
117+
let arg_add_devices = args.device;
118+
let arg_ignore_devices = args.ignoredevice;
119+
120+
let to_add =
121+
|dev: &Device| arg_add_devices.contains(&dev.name().unwrap_or("[unknown]").to_string());
122+
let to_ignore =
123+
|dev: &Device| arg_ignore_devices.contains(&dev.name().unwrap_or("[unknown]").to_string());
114124

115125
let keyboard_devices: Vec<_> = {
116-
if arg_devices.is_empty() {
126+
if arg_add_devices.is_empty() {
117127
log::trace!("Attempting to find all keyboard file descriptors.");
118-
evdev::enumerate().filter(|(_, dev)| check_device_is_keyboard(dev)).collect()
119-
} else {
120128
evdev::enumerate()
121-
.filter(|(_, dev)| arg_devices.contains(&dev.name().unwrap_or("").to_string()))
129+
.filter(|(_, dev)| !to_ignore(dev) && check_device_is_keyboard(dev))
122130
.collect()
131+
} else {
132+
evdev::enumerate().filter(|(_, dev)| !to_ignore(dev) && to_add(dev)).collect()
123133
}
124134
};
125135

@@ -271,8 +281,8 @@ async fn main() -> Result<(), Box<dyn Error>> {
271281
},
272282
Ok(device) => device
273283
};
274-
let name = device.name().unwrap_or("[unknown]").to_string();
275-
if arg_devices.contains(&name) || check_device_is_keyboard(&device) {
284+
if !to_ignore(&device) && (to_add(&device) || check_device_is_keyboard(&device)) {
285+
let name = device.name().unwrap_or("[unknown]");
276286
log::info!("Device '{}' at '{}' added.", name, node);
277287
let _ = device.grab();
278288
keyboard_states.insert(node.to_string(), KeyboardState::new());

0 commit comments

Comments
 (0)