Narsil / rdev

Simple library to listen and send events to keyboard and mouse (MacOS, Windows, Linux)
MIT License
503 stars 124 forks source link

captured variable in a `Fn` closure cannot assign #95

Open yaojiu19 opened 1 year ago

yaojiu19 commented 1 year ago

when i use grab, i cant modify environment variable;

let mut button_right_act= false;
let mut is_block = false;
rdev::grab(move |event| {
    match event.event_type {
        EventType::ButtonPress(button) => {
            match button {
                Button::Right => {
                    button_right_act = true;
                    is_block = false;
                },
                _ => {}
            }
        },
        EventType::ButtonRelease(button) => {
            match button {
                Button::Right => {
                    button_right_act = false;
                },
                _ => {}
            }
        },
        EventType::MouseMove { x, y } => {
            if button_right_act {
               if x > 100.0 {
                  is_block = true;
               } 
            }
        },
        _ => {}
    }
    if is_block {
        None
    } else {
        Some(event)
    }
}).unwrap();
Narsil commented 1 year ago

What is actually happening ?

yaojiu19 commented 1 year ago

I'm a beginner of rust. I want move of ownership to closure, but Fn applies to closures that don’t move captured values out of their body and that don’t mutate captured values. image T: Fn(Event) -> Option + 'static modify to T: FnMut(Event) -> Option + 'static

Narsil commented 1 year ago

I want move of ownership to closure, but Fn applies to closures that don’t move captured values out of their body and that don’t mutate captured values.

That's because you cannot. You could use a global variable for that (that's unsafe but it works if your program is simple enough). Or an Arc<Mutex<T>>