diff options
| author | Teddy Wing | 2018-10-13 18:35:28 +0200 | 
|---|---|---|
| committer | Teddy Wing | 2018-10-13 18:35:28 +0200 | 
| commit | d5082eeca37a938e8aa90868cb7c5bae11386601 (patch) | |
| tree | 7d808c09d56f4474f09e28d18efce8eda9cedd47 /src/key_code.rs | |
| parent | d57787a8f45e173a19106c7d3d0140d0ac6a7d46 (diff) | |
| download | dome-key-map-d5082eeca37a938e8aa90868cb7c5bae11386601.tar.bz2 | |
Try to send media key events using `NSEvent` and `CGevent`
Segfaults on key_code.rs:184:
    error: process didn't exit successfully: `.../dome-key-map/target/debug/deps/dome_key_map-0efa5c8428fad354 send_media_key --nocapture` (signal: 11, SIGSEGV: invalid memory reference)
    shell returned 101
This is my attempt to use first the 'cocoa' and 'core-graphics' crates,
then the 'objc' crate (because I hoped that would get around the
segfault), to simulate a media key event.
Once I got the types right and the code compiling, I couldn't get past
segfaults. After struggling with this for over a day and not being able
to figure out what on earth is going on, I wrote the exact same thing in
Objective-C and it just worked. That's it, I'm done with this. This code
is going to be expunged and I'm going to take a C function pointer in
the function that runs map actions that will simulate media key presses
in real Cocoa/Carbon. Enough of this headache.
Diffstat (limited to 'src/key_code.rs')
| -rw-r--r-- | src/key_code.rs | 132 | 
1 files changed, 98 insertions, 34 deletions
| diff --git a/src/key_code.rs b/src/key_code.rs index e148555..9e30dfc 100644 --- a/src/key_code.rs +++ b/src/key_code.rs @@ -4,9 +4,17 @@ use cocoa::appkit::{      NSEventSubtype::NSScreenChangedEventType,      NSEventType::NSSystemDefined,  }; -use cocoa::base::nil; +use cocoa::base::{id, nil};  use cocoa::foundation::NSPoint; -use core_graphics::event::{CGEvent, CGEventTapLocation, CGKeyCode, KeyCode}; +use core_graphics::event::{ +    CGEvent, +    // CGEventPost, +    CGEventRef, +    CGEventTapLocation, +    CGKeyCode, +    KeyCode, +}; +use foreign_types::{ForeignType, ForeignTypeRef};  // impl KeyCode {  //     pub const RETURN: CGKeyCode = 0x24; @@ -110,44 +118,100 @@ unsafe fn press_play() {      let NX_KEYTYPE_PLAY = 16;      let code = NX_KEYTYPE_PLAY; -    let key_down = NSEvent::otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_( -        nil, -        NSSystemDefined, -        NSPoint::new(0.0, 0.0), -        NSEventModifierFlags::NSDeviceIndependentModifierFlagsMask, -        0.0, -        0, -        nil, -        NSScreenChangedEventType, -        (code << 16 as i32) | (0xa << 8 as i32), -        -1 -    ); -    let event = key_down.CGEvent() as *mut CGEvent; -    let event = &*event; -    event.post(CGEventTapLocation::HID); +    // let key_down = NSEvent::otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_( +    //     nil, +    //     NSSystemDefined, +    //     NSPoint::new(0.0, 0.0), +    //     // NSEventModifierFlags::NSDeviceIndependentModifierFlagsMask, // 0xa00 0xb00 +    //     // 0xa00, +    //     // NSEventModifierFlags::empty(), +    //     NSEventModifierFlags::from_bits(0xa00).unwrap(), +    //     0.0, +    //     0, +    //     nil, +    //     NSScreenChangedEventType, +    //     (code << 16 as i32) | (0xa << 8 as i32), +    //     -1 +    // ); +    // let event = key_down.CGEvent() as *mut CGEvent; +    // let event = &*event; +    // event.post(CGEventTapLocation::HID); +    // +    // let key_up = NSEvent::otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_( +    //     nil, +    //     NSSystemDefined, +    //     NSPoint::new(0.0, 0.0), +    //     // NSEventModifierFlags::NSDeviceIndependentModifierFlagsMask, +    //     // NSEventModifierFlags::empty(), +    //     NSEventModifierFlags::from_bits(0xb00).unwrap(), +    //     0.0, +    //     0, +    //     nil, +    //     NSScreenChangedEventType, +    //     (code << 16 as i32) | (0xb << 8 as i32), +    //     -1 +    // ); +    // let event = key_up.CGEvent() as *mut CGEvent; +    // let event = &*event; +    // event.post(CGEventTapLocation::HID); + +    let event: id = msg_send![class!(NSEvent), otherEventWithType:NSSystemDefined +                                         location:NSPoint::new(0.0, 0.0) +                                    modifierFlags:0xa00 +                                        timestamp:0.0 +                                     windowNumber:0 +                                          context:nil +                                          subtype:NSScreenChangedEventType +                                            data1:(code << 16 as i32) | (0xa << 8 as i32) +                                            data2:-1]; + +    // let cg_event: *mut CGEvent = msg_send![event, CGEvent]; +    // let n_cg_event = &*cg_event; +    // println!("{}", cg_event.as_ptr()); +    // n_cg_event.post(CGEventTapLocation::HID); +    // println!("Failed"); -    let key_up = NSEvent::otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_( -        nil, -        NSSystemDefined, -        NSPoint::new(0.0, 0.0), -        NSEventModifierFlags::NSDeviceIndependentModifierFlagsMask, -        0.0, -        0, -        nil, -        NSScreenChangedEventType, -        (code << 16 as i32) | (0xb << 8 as i32), -        -1 -    ); -    let event = key_down.CGEvent() as *mut CGEvent; -    let event = &*event; -    event.post(CGEventTapLocation::HID); +    let cg_event_ref: CGEventRef = msg_send![event, CGEvent]; +    // CGEventPost(CGEventTapLocation::HID, cg_event_ref); +    // let cg_event = CGEvent::from_ptr(cg_event_ref); +    println!("What"); +    // let cg_event: CGEvent = cg_event_ref.to_owned();  // TODO: doesn't work +        // let handle: *mut $ctype = $clone($crate::ForeignTypeRef::as_ptr(self)); +        // $crate::ForeignType::from_ptr(handle) +    let fucking_handle = CGEventRef::as_ptr(&cg_event_ref); +    let cg_event = CGEvent::from_ptr(fucking_handle); +    println!("Fuck"); +    cg_event.post(CGEventTapLocation::HID);  // fucking segfaults +    println!("Failed"); + +    // let event: id = msg_send![class!(NSEvent), otherEventWithType:NSSystemDefined +    //                                      location:NSPoint::new(0.0, 0.0) +    //                                 modifierFlags:0xb00 +    //                                     timestamp:0.0 +    //                                  windowNumber:0 +    //                                       context:nil +    //                                       subtype:NSScreenChangedEventType +    //                                         data1:(code << 16 as i32) | (0xb << 8 as i32) +    //                                         data2:-1]; +    // +    // // let cg_event: *mut CGEvent = msg_send![event, CGEvent]; +    // // let cg_event = &*cg_event; +    // // cg_event.post(CGEventTapLocation::HID); +    // let cg_event_ref: CGEventRef = msg_send![event, CGEvent]; +    // let fucking_handle = CGEventRef::as_ptr(&cg_event_ref); +    // let cg_event = CGEvent::from_ptr(fucking_handle); +    // cg_event.post(CGEventTapLocation::HID);  }  #[cfg(test)]  mod tests { -    #[test] -    fn send_media_key_event() { +use super::*; + +#[test] +fn send_media_key_event() { +    unsafe {          press_play();      }  } +} | 
