Skip to content

Commit

Permalink
Patch from upstream to fix #63, fix #20
Browse files Browse the repository at this point in the history
  • Loading branch information
TTWNO committed Dec 23, 2022
1 parent 6692fec commit 04bc475
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions sohkd/src/uinput.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@ use evdev::{
AttributeSet, Key, RelativeAxisType, SwitchType,
};

use nix::ioctl_none;
use std::fs::File;
use std::os::unix::io::AsRawFd;

ioctl_none!(rfkill_noinput, b'R', 1);

pub fn create_uinput_device() -> Result<VirtualDevice, Box<dyn std::error::Error>> {
let mut keys = AttributeSet::<Key>::new();
for key in get_all_keys() {
Expand All @@ -14,6 +20,21 @@ pub fn create_uinput_device() -> Result<VirtualDevice, Box<dyn std::error::Error
relative_axes.insert(axis);
}

// We have to disable rfkill-input to avoid blocking all radio devices. When
// a new device (virtual or physical) with the SW_RFKILL_ALL capability bit
// set appears, rfkill reacts immediately depending on the value bit. This
// value bit defaults to unset, which causes rfkill to use its default mode
// (which is eop - emergency power off). The uinput API does not give any
// way to set the corresponding value bit before creating the device, and we
// have no way to avoid rfkill acting upon the device creation or to change
// its default mode. Thus, we disable rfkill-input temporarily, hopefully
// fast enough that it won't impact anyone. rfkill-input will be enabled
// again when the file gets closed.
let rfkill_file = File::open("/dev/rfkill")?;
unsafe {
rfkill_noinput(rfkill_file.as_raw_fd())?;
}

let device = VirtualDeviceBuilder::new()?
.name("sohkd virtual output")
.with_keys(&keys)?
Expand Down

0 comments on commit 04bc475

Please sign in to comment.