1- use crate :: rdev:: { Event , EventType , GrabCallback , GrabError } ;
1+ use crate :: rdev:: { Event , EventType , GrabError } ;
22use crate :: windows:: common:: { convert, set_key_hook, set_mouse_hook, HookError , HOOK , KEYBOARD } ;
33use std:: ptr:: null_mut;
44use std:: time:: SystemTime ;
55use winapi:: um:: winuser:: { CallNextHookEx , GetMessageA , HC_ACTION } ;
66
7- fn default_callback ( event : Event ) -> Option < Event > {
8- println ! ( "Default : Event {:?}" , event) ;
9- Some ( event)
10- }
11- static mut GLOBAL_CALLBACK : GrabCallback = default_callback;
7+ static mut GLOBAL_CALLBACK : Option < Box < dyn Fn ( Event ) -> Option < Event > > > = None ;
128
139unsafe extern "system" fn raw_callback ( code : i32 , param : usize , lpdata : isize ) -> isize {
1410 if code == HC_ACTION {
@@ -26,12 +22,14 @@ unsafe extern "system" fn raw_callback(code: i32, param: usize, lpdata: isize) -
2622 time : SystemTime :: now ( ) ,
2723 name,
2824 } ;
29- if GLOBAL_CALLBACK ( event) . is_none ( ) {
30- // https://stackoverflow.com/questions/42756284/blocking-windows-mouse-click-using-setwindowshookex
31- // https://android.developreference.com/article/14560004/Blocking+windows+mouse+click+using+SetWindowsHookEx()
32- // https://cboard.cprogramming.com/windows-programming/99678-setwindowshookex-wm_keyboard_ll.html
33- // let _result = CallNextHookEx(HOOK, code, param, lpdata);
34- return 1 ;
25+ if let Some ( callback) = & GLOBAL_CALLBACK {
26+ if callback ( event) . is_none ( ) {
27+ // https://stackoverflow.com/questions/42756284/blocking-windows-mouse-click-using-setwindowshookex
28+ // https://android.developreference.com/article/14560004/Blocking+windows+mouse+click+using+SetWindowsHookEx()
29+ // https://cboard.cprogramming.com/windows-programming/99678-setwindowshookex-wm_keyboard_ll.html
30+ // let _result = CallNextHookEx(HOOK, code, param, lpdata);
31+ return 1 ;
32+ }
3533 }
3634 }
3735 }
@@ -46,9 +44,12 @@ impl From<HookError> for GrabError {
4644 }
4745}
4846
49- pub fn grab ( callback : GrabCallback ) -> Result < ( ) , GrabError > {
47+ pub fn grab < T > ( callback : T ) -> Result < ( ) , GrabError >
48+ where
49+ T : Fn ( Event ) -> Option < Event > + ' static ,
50+ {
5051 unsafe {
51- GLOBAL_CALLBACK = callback;
52+ GLOBAL_CALLBACK = Some ( Box :: new ( callback) ) ;
5253 set_key_hook ( raw_callback) ?;
5354 set_mouse_hook ( raw_callback) ?;
5455
0 commit comments