Skip to content

Commit 9fce949

Browse files
committed
[feat] add argument to ignore devices
--ignore-device 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 --ignore-device 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 994b74f commit 9fce949

File tree

2 files changed

+27
-11
lines changed

2 files changed

+27
-11
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, --ignore-device* <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: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,21 @@ async fn main() -> Result<(), Box<dyn Error>> {
143143
};
144144
}
145145

146-
let arg_devices: Vec<&str> = args.values_of("device").unwrap_or_default().collect();
146+
let arg_add_devices: Vec<&str> = args.values_of("device").unwrap_or_default().collect();
147+
let arg_ignore_devices: Vec<&str> =
148+
args.values_of("ignore-device").unwrap_or_default().collect();
149+
150+
let to_add = |dev: &Device| arg_add_devices.contains(&dev.name().unwrap_or("[unknown]"));
151+
let to_ignore = |dev: &Device| arg_ignore_devices.contains(&dev.name().unwrap_or("[unknown]"));
147152

148153
let keyboard_devices: Vec<_> = {
149-
if arg_devices.is_empty() {
154+
if arg_add_devices.is_empty() {
150155
log::trace!("Attempting to find all keyboard file descriptors.");
151-
evdev::enumerate().filter(|(_, dev)| check_device_is_keyboard(dev)).collect()
152-
} else {
153156
evdev::enumerate()
154-
.filter(|(_, dev)| arg_devices.contains(&dev.name().unwrap_or("")))
157+
.filter(|(_, dev)| !to_ignore(dev) && check_device_is_keyboard(dev))
155158
.collect()
159+
} else {
160+
evdev::enumerate().filter(|(_, dev)| !to_ignore(dev) && to_add(dev)).collect()
156161
}
157162
};
158163

@@ -308,8 +313,8 @@ async fn main() -> Result<(), Box<dyn Error>> {
308313
},
309314
Ok(device) => device
310315
};
311-
let name = device.name().unwrap_or("[unknown]");
312-
if arg_devices.contains(&name) || check_device_is_keyboard(&device) {
316+
if !to_ignore(&device) && (to_add(&device) || check_device_is_keyboard(&device)) {
317+
let name = device.name().unwrap_or("[unknown]");
313318
log::info!("Device '{}' at '{}' added.", name, node);
314319
let _ = device.grab();
315320
keyboard_states.insert(node.to_string(), KeyboardState::new());
@@ -490,14 +495,22 @@ pub fn set_command_line_args() -> Command<'static> {
490495
)
491496
.arg(arg!(-d - -debug).required(false).help("Enable debug mode."))
492497
.arg(
493-
arg!(-D --device <DEVICE_NAME>)
498+
arg!(-D --device <DEVICE_NAMES>)
494499
.required(false)
495500
.takes_value(true)
496501
.multiple_occurrences(true)
497502
.help(
498-
"Specific keyboard devices to use. Seperate multiple devices with semicolon.",
503+
"Specific keyboard devices to use. Separate multiple devices with semicolon.",
499504
),
500-
);
505+
)
506+
.arg(arg!(-I --ignore-device <DEVICE_NAMES>)
507+
.required(false)
508+
.takes_value(true)
509+
.multiple_occurrences(true)
510+
.help(
511+
"Specific keyboard devices to ignore. Separate multiple devices with semicolon."
512+
)
513+
);
501514
app
502515
}
503516

0 commit comments

Comments
 (0)