Skip to content

Commit

Permalink
[feat] add argument to ignore devices
Browse files Browse the repository at this point in the history
--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.
  • Loading branch information
aadilshabier committed Feb 27, 2024
1 parent 34b9619 commit 593d28d
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 8 deletions.
82 changes: 82 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'swhkd'",
"cargo": {
"args": [
"build",
"--bin=swhkd",
"--package=Simple-Wayland-HotKey-Daemon"
],
"filter": {
"name": "swhkd",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'swhkd'",
"cargo": {
"args": [
"test",
"--no-run",
"--bin=swhkd",
"--package=Simple-Wayland-HotKey-Daemon"
],
"filter": {
"name": "swhkd",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'swhks'",
"cargo": {
"args": [
"build",
"--bin=swhks",
"--package=swhks"
],
"filter": {
"name": "swhks",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'swhks'",
"cargo": {
"args": [
"test",
"--no-run",
"--bin=swhks",
"--package=swhks"
],
"filter": {
"name": "swhks",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
}
]
}
20 changes: 20 additions & 0 deletions Notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Notes

Uinput docs: <https://kernel.org/doc/html/v4.12/input/uinput.html>
Libevdev: <https://www.freedesktop.org/software/libevdev/doc/latest/>

Command to run swhkd
```sh
pkexec swhkd -d -D 'AT Translated Set 2 keyboard'
```

Language guide: https://github.com/baskerville/sxhkd/blob/master/doc/sxhkd.1.asciidoc

Keyboard recognition: https://unix.stackexchange.com/questions/523108/getting-type-of-evdev-device

Parser discussion: <https://github.com/waycrate/swhkd/issues/168>

Run with minimal config
```sh
pkexec swhkd -d -c $PWD/test.conf
```
4 changes: 4 additions & 0 deletions myinstall.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
set -xe

make
sudo make install
32 changes: 25 additions & 7 deletions swhkd/src/daemon.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,15 +143,25 @@ async fn main() -> Result<(), Box<dyn Error>> {
};
}

let arg_devices: Vec<&str> = args.values_of("device").unwrap_or_default().collect();
let arg_add_devices: Vec<&str> = args.values_of("device").unwrap_or_default().collect();
let arg_ignore_devices: Vec<&str> =
args.values_of("ignore-device").unwrap_or_default().collect();

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()
evdev::enumerate()
.filter(|(_, dev)| {
!arg_ignore_devices.contains(&dev.name().unwrap_or(""))
&& check_device_is_keyboard(dev)
})
.collect()
} else {
evdev::enumerate()
.filter(|(_, dev)| arg_devices.contains(&dev.name().unwrap_or("")))
.filter(|(_, dev)| {
!arg_ignore_devices.contains(&dev.name().unwrap_or(""))
&& arg_add_devices.contains(&dev.name().unwrap_or(""))
})
.collect()
}
};
Expand Down Expand Up @@ -309,7 +319,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
Ok(device) => device
};
let name = device.name().unwrap_or("[unknown]");
if arg_devices.contains(&name) || check_device_is_keyboard(&device) {
if !arg_ignore_devices.contains(&name) && (arg_add_devices.contains(&name) || check_device_is_keyboard(&device)) {
log::info!("Device '{}' at '{}' added.", name, node);
let _ = device.grab();
keyboard_states.insert(node.to_string(), KeyboardState::new());
Expand Down Expand Up @@ -490,14 +500,22 @@ pub fn set_command_line_args() -> Command<'static> {
)
.arg(arg!(-d - -debug).required(false).help("Enable debug mode."))
.arg(
arg!(-D --device <DEVICE_NAME>)
arg!(-D --device <DEVICE_NAMES>)
.required(false)
.takes_value(true)
.multiple_occurrences(true)
.help(
"Specific keyboard devices to use. Seperate multiple devices with semicolon.",
),
);
)
.arg(arg!(-I --ignore-device <DEVICE_NAMES>)
.required(false)
.takes_value(true)
.multiple_occurrences(true)
.help(
"Specific keyboard devices to ignore. Seperate multiple devices with semicolon."
)
);
app
}

Expand Down
2 changes: 1 addition & 1 deletion swhkd/src/uinput.rs
Original file line number Diff line number Diff line change
Expand Up @@ -622,7 +622,7 @@ pub fn get_all_switches() -> &'static [SwitchType] {
SwitchType::SW_LID,
SwitchType::SW_TABLET_MODE,
SwitchType::SW_HEADPHONE_INSERT,
SwitchType::SW_RFKILL_ALL,
// SwitchType::SW_RFKILL_ALL,
SwitchType::SW_MICROPHONE_INSERT,
SwitchType::SW_DOCK,
SwitchType::SW_LINEOUT_INSERT,
Expand Down
2 changes: 2 additions & 0 deletions test.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
alt + ctrl + q
qalculate-gtk

0 comments on commit 593d28d

Please sign in to comment.