Skip to content

Commit 400280b

Browse files
committed
finished media key support
1 parent feaaa1f commit 400280b

5 files changed

Lines changed: 114 additions & 42 deletions

File tree

inputshare-client/src/main.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,10 @@ impl<'a> InputTransmitter<'a> {
268268
KeyState::Released => sender.release_key(kc)
269269
},
270270
None => match wsc_to_cdc(sc){
271-
Some(cdc) => println!("{:?}", cdc),
271+
Some(cdc) => match ks {
272+
KeyState::Pressed => sender.press_consumer_device(cdc),
273+
KeyState::Released => sender.release_consumer_device(cdc)
274+
},
272275
None => if! matches!(sc, 0x21d) {
273276
println!("Unknown key: {} ({:x})", vk, sc)
274277
}

inputshare-client/src/sender.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::collections::VecDeque;
2-
use inputshare_common::{HidButtonCode, HidKeyCode, MessageType, MouseType, Vec2};
2+
use inputshare_common::{ConsumerDeviceCode, HidButtonCode, HidKeyCode, MessageType, MouseType, Vec2};
33
use std::io::{Result, Write};
44
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
55

@@ -61,6 +61,14 @@ impl InputSender {
6161
self.message_queue.push_back([MessageType::MouseButtonRelease.into(), button.into()])
6262
}
6363

64+
pub fn press_consumer_device(&mut self, button: ConsumerDeviceCode) {
65+
self.message_queue.push_back([MessageType::ConsumerDevicePress.into(), button.into()])
66+
}
67+
68+
pub fn release_consumer_device(&mut self, button: ConsumerDeviceCode) {
69+
self.message_queue.push_back([MessageType::ConsumerDeviceRelease.into(), button.into()])
70+
}
71+
6472
pub fn scroll_horizontal(&mut self, amount: i8) {
6573
self.message_queue.push_back([MessageType::HorizontalScrolling.into(), amount as u8])
6674
}

inputshare-server/src/main.rs

Lines changed: 69 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use mio::net::UdpSocket;
1515
use mio_signals::{Signal, Signals, SignalSet};
1616
use udp_connections::{MAX_PACKET_SIZE, Server, ServerEvent, Transport};
1717
use vec_map::VecMap;
18-
use inputshare_common::{HidButtonCode, HidKeyCode, IDENTIFIER};
18+
use inputshare_common::{ConsumerDeviceCode, HidButtonCode, HidKeyCode, IDENTIFIER};
1919
use crate::receiver::{InputEvent, InputReceiver};
2020

2121
/// The server for inputshare
@@ -109,8 +109,6 @@ fn server(args: Args) -> Result<()> {
109109
}
110110
}
111111

112-
consumer_device.press_key(1 << 5)?;
113-
consumer_device.release_key(1 << 5)?;
114112
socket.update();
115113
loop {
116114
match socket.next_event(&mut buffer) {
@@ -138,6 +136,8 @@ fn server(args: Args) -> Result<()> {
138136
InputEvent::KeyRelease(key) => keyboard.release_key(key)?,
139137
InputEvent::MouseButtonPress(button) => mouse.press_button(button)?,
140138
InputEvent::MouseButtonRelease(button) => mouse.release_button(button)?,
139+
InputEvent::ConsumerDevicePress(button) => consumer_device.press_key(button)?,
140+
InputEvent::ConsumerDeviceRelease(button) => consumer_device.release_key(button)?,
141141
InputEvent::HorizontalScrolling(amount) => mouse.scroll_horizontal(amount)?,
142142
InputEvent::VerticalScrolling(amount) => mouse.scroll_vertical(amount)?,
143143
InputEvent::Reset => {
@@ -260,7 +260,7 @@ impl Keyboard {
260260
#[derive(Debug)]
261261
pub struct ConsumerDevice {
262262
device: File,
263-
pressed_keys: u16,
263+
pressed_keys: ConsumerDeviceButtons,
264264
}
265265

266266
impl ConsumerDevice {
@@ -269,27 +269,37 @@ impl ConsumerDevice {
269269
let device = OpenOptions::new().write(true).append(true).open("/dev/hidg2")?;
270270
Ok(Self {
271271
device,
272-
pressed_keys: 0
272+
pressed_keys: ConsumerDeviceButtons::empty()
273273
})
274274
}
275275

276276
fn send_report(&mut self) -> std::io::Result<()> {
277-
self.device.write_all(&self.pressed_keys.to_le_bytes())
277+
self.device.write_all(&self.pressed_keys.bits().to_le_bytes())
278278
}
279279

280280
pub fn reset(&mut self) -> std::io::Result<()> {
281-
self.pressed_keys = 0;
281+
self.pressed_keys = ConsumerDeviceButtons::empty();
282282
self.send_report()
283283
}
284284

285-
pub fn press_key(&mut self, key: u16) -> std::io::Result<()> {
286-
self.pressed_keys |= key;
287-
self.send_report()
285+
pub fn press_key(&mut self, key: ConsumerDeviceCode) -> std::io::Result<()> {
286+
match key.try_into() {
287+
Ok(key) => {
288+
self.pressed_keys.insert(key);
289+
self.send_report()
290+
},
291+
Err(()) => Ok(())
292+
}
288293
}
289294

290-
pub fn release_key(&mut self, key: u16) -> std::io::Result<()> {
291-
self.pressed_keys &= !key;
292-
self.send_report()
295+
pub fn release_key(&mut self, key: ConsumerDeviceCode) -> std::io::Result<()> {
296+
match key.try_into() {
297+
Ok(key) => {
298+
self.pressed_keys.remove(key);
299+
self.send_report()
300+
},
301+
Err(()) => Ok(())
302+
}
293303
}
294304

295305
}
@@ -388,7 +398,7 @@ fn abs_min(a: i16, b: i16) -> i16 {
388398
}
389399
}
390400

391-
pub use flags::{HidMouseButtons, HidModifierKeys};
401+
pub use flags::{HidMouseButtons, HidModifierKeys, ConsumerDeviceButtons};
392402

393403
#[allow(non_upper_case_globals)]
394404
pub mod flags {
@@ -412,6 +422,51 @@ pub mod flags {
412422
const Button4 = 0x08;
413423
const Button5 = 0x10;
414424
}
425+
426+
pub struct ConsumerDeviceButtons: u16 {
427+
const NextTrack = 0x0001;
428+
const PreviousTrack = 0x0002;
429+
const Stop = 0x0004;
430+
const PlayPause = 0x0008;
431+
const Mute = 0x0010;
432+
const VolumeUp = 0x0020;
433+
const VolumeDown = 0x0040;
434+
const BrowserHome = 0x0080;
435+
const MyComputer = 0x0100;
436+
const Calculator = 0x0200;
437+
const BrowserFavorites = 0x0400;
438+
const BrowserSearch = 0x0800;
439+
const BrowserStop = 0x1000;
440+
const BrowserBack = 0x2000;
441+
const MediaSelect = 0x4000;
442+
const Mail = 0x8000;
443+
}
444+
}
445+
}
446+
447+
impl TryFrom<ConsumerDeviceCode> for ConsumerDeviceButtons {
448+
type Error = ();
449+
450+
fn try_from(value: ConsumerDeviceCode) -> std::result::Result<Self, Self::Error> {
451+
match value {
452+
ConsumerDeviceCode::NextTrack => Ok(ConsumerDeviceButtons::NextTrack),
453+
ConsumerDeviceCode::PreviousTrack => Ok(ConsumerDeviceButtons::PreviousTrack),
454+
ConsumerDeviceCode::Stop => Ok(ConsumerDeviceButtons::Stop),
455+
ConsumerDeviceCode::PlayPause => Ok(ConsumerDeviceButtons::PlayPause),
456+
ConsumerDeviceCode::Mute => Ok(ConsumerDeviceButtons::Mute),
457+
ConsumerDeviceCode::VolumeUp => Ok(ConsumerDeviceButtons::VolumeUp),
458+
ConsumerDeviceCode::VolumeDown => Ok(ConsumerDeviceButtons::VolumeDown),
459+
ConsumerDeviceCode::MediaSelect => Ok(ConsumerDeviceButtons::MediaSelect),
460+
ConsumerDeviceCode::Mail => Ok(ConsumerDeviceButtons::Mail),
461+
ConsumerDeviceCode::Calculator => Ok(ConsumerDeviceButtons::Calculator),
462+
ConsumerDeviceCode::MyComputer => Ok(ConsumerDeviceButtons::MyComputer),
463+
ConsumerDeviceCode::BrowserSearch => Ok(ConsumerDeviceButtons::BrowserSearch),
464+
ConsumerDeviceCode::BrowserHome => Ok(ConsumerDeviceButtons::BrowserHome),
465+
ConsumerDeviceCode::BrowserBack => Ok(ConsumerDeviceButtons::BrowserBack),
466+
ConsumerDeviceCode::BrowserStop => Ok(ConsumerDeviceButtons::BrowserStop),
467+
ConsumerDeviceCode::BrowserFavorites => Ok(ConsumerDeviceButtons::BrowserFavorites),
468+
_ => Err(())
469+
}
415470
}
416471
}
417472

inputshare-server/src/receiver.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::collections::VecDeque;
22
use std::convert::TryFrom;
3-
use inputshare_common::{HidButtonCode, HidKeyCode, MessageType, MouseType, Vec2};
3+
use inputshare_common::{ConsumerDeviceCode, HidButtonCode, HidKeyCode, MessageType, MouseType, Vec2};
44
use std::io::Result;
55
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
66

@@ -11,6 +11,8 @@ pub enum InputEvent {
1111
KeyRelease(HidKeyCode),
1212
MouseButtonPress(HidButtonCode),
1313
MouseButtonRelease(HidButtonCode),
14+
ConsumerDevicePress(ConsumerDeviceCode),
15+
ConsumerDeviceRelease(ConsumerDeviceCode),
1416
HorizontalScrolling(i8),
1517
VerticalScrolling(i8),
1618
Reset,
@@ -63,6 +65,8 @@ impl InputReceiver {
6365
Ok(MessageType::KeyRelease) => self.events.push_back(InputEvent::KeyRelease(HidKeyCode::from(msg_arg))),
6466
Ok(MessageType::MouseButtonPress) => self.events.push_back(InputEvent::MouseButtonPress(HidButtonCode::from(msg_arg))),
6567
Ok(MessageType::MouseButtonRelease) => self.events.push_back(InputEvent::MouseButtonRelease(HidButtonCode::from(msg_arg))),
68+
Ok(MessageType::ConsumerDevicePress) => self.events.push_back(InputEvent::ConsumerDevicePress(ConsumerDeviceCode::from(msg_arg))),
69+
Ok(MessageType::ConsumerDeviceRelease) => self.events.push_back(InputEvent::ConsumerDeviceRelease(ConsumerDeviceCode::from(msg_arg))),
6670
Ok(MessageType::HorizontalScrolling) => self.events.push_back(InputEvent::HorizontalScrolling(msg_arg as i8)),
6771
Ok(MessageType::VerticalScrolling) => self.events.push_back(InputEvent::VerticalScrolling(msg_arg as i8)),
6872
Ok(MessageType::Reset) => self.events.push_back(InputEvent::Reset),

lib/inputshare-common/src/lib.rs

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ pub enum MessageType {
2424
KeyRelease,
2525
MouseButtonPress,
2626
MouseButtonRelease,
27+
ConsumerDevicePress,
28+
ConsumerDeviceRelease,
2729
HorizontalScrolling,
2830
VerticalScrolling,
2931
Reset
@@ -42,34 +44,34 @@ pub enum HidButtonCode {
4244
}
4345

4446
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, IntoPrimitive, FromPrimitive)]
45-
#[repr(u16)]
47+
#[repr(u8)]
4648
pub enum ConsumerDeviceCode {
4749
#[num_enum(default)]
4850
None = 0x00,
49-
NextTrack = 0x00b5,
50-
PreviousTrack = 0x00b6,
51-
Stop = 0x00b7,
52-
PlayPause = 0x00cd,
53-
Mute = 0x00e2,
54-
BassBoost = 0x00e5,
55-
Loudness = 0x00e7,
56-
VolumeUp = 0x00e9,
57-
VolumeDown = 0x00ea,
58-
BassUp = 0x0152,
59-
BassDown = 0x0153,
60-
TrebleUp = 0x0154,
61-
TrebleDown = 0x0155,
62-
MediaSelect = 0x0183,
63-
Mail = 0x018a,
64-
Calculator = 0x0192,
65-
MyComputer = 0x0194,
66-
BrowserSearch = 0x0221,
67-
BrowserHome = 0x0223,
68-
BrowserBack = 0x0224,
69-
BrowserForward = 0x0225,
70-
BrowserStop = 0x0226,
71-
BrowserRefresh = 0x0227,
72-
BrowserFavorites = 0x022a
51+
NextTrack,
52+
PreviousTrack,
53+
Stop,
54+
PlayPause,
55+
Mute,
56+
BassBoost,
57+
Loudness,
58+
VolumeUp,
59+
VolumeDown,
60+
BassUp,
61+
BassDown,
62+
TrebleUp,
63+
TrebleDown,
64+
MediaSelect,
65+
Mail,
66+
Calculator,
67+
MyComputer,
68+
BrowserSearch,
69+
BrowserHome,
70+
BrowserBack,
71+
BrowserForward,
72+
BrowserStop,
73+
BrowserRefresh,
74+
BrowserFavorites
7375
}
7476

7577
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, IntoPrimitive, FromPrimitive)]

0 commit comments

Comments
 (0)