less unsafe code

This commit is contained in:
Ferdinand Schober
2025-01-24 14:23:16 +01:00
parent 346ae79fa6
commit 2e2046dc36

View File

@@ -162,44 +162,48 @@ fn start_routine(
request_buffer: Arc<Mutex<Vec<ClientUpdate>>>, request_buffer: Arc<Mutex<Vec<ClientUpdate>>>,
) { ) {
EVENT_TX.replace(Some(event_tx)); EVENT_TX.replace(Some(event_tx));
/* communicate thread id */
{
let (cnd, mtx) = &*ready;
let mut ready = mtx.lock().unwrap();
*ready = Some(unsafe { GetCurrentThreadId() });
cnd.notify_one();
}
let mouse_proc: HOOKPROC = Some(mouse_proc);
let kybrd_proc: HOOKPROC = Some(kybrd_proc);
let window_proc: WNDPROC = Some(window_proc);
/* register hooks */
unsafe { unsafe {
/* communicate thread id */
{
let (cnd, mtx) = &*ready;
let mut ready = mtx.lock().unwrap();
*ready = Some(GetCurrentThreadId());
cnd.notify_one();
}
let mouse_proc: HOOKPROC = Some(mouse_proc);
let kybrd_proc: HOOKPROC = Some(kybrd_proc);
let window_proc: WNDPROC = Some(window_proc);
/* register hooks */
let _ = SetWindowsHookExW(WH_MOUSE_LL, mouse_proc, HINSTANCE::default(), 0).unwrap(); let _ = SetWindowsHookExW(WH_MOUSE_LL, mouse_proc, HINSTANCE::default(), 0).unwrap();
let _ = SetWindowsHookExW(WH_KEYBOARD_LL, kybrd_proc, HINSTANCE::default(), 0).unwrap(); let _ = SetWindowsHookExW(WH_KEYBOARD_LL, kybrd_proc, HINSTANCE::default(), 0).unwrap();
}
let instance = GetModuleHandleW(None).unwrap(); let instance = unsafe { GetModuleHandleW(None).unwrap() };
let window_class: WNDCLASSW = WNDCLASSW { let window_class: WNDCLASSW = WNDCLASSW {
lpfnWndProc: window_proc, lpfnWndProc: window_proc,
hInstance: instance.into(), hInstance: instance.into(),
lpszClassName: w!("lan-mouse-message-window-class"), lpszClassName: w!("lan-mouse-message-window-class"),
..Default::default() ..Default::default()
}; };
static WINDOW_CLASS_REGISTERED: AtomicBool = AtomicBool::new(false); static WINDOW_CLASS_REGISTERED: AtomicBool = AtomicBool::new(false);
if WINDOW_CLASS_REGISTERED if WINDOW_CLASS_REGISTERED
.compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst) .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst)
.is_ok() .is_ok()
{ {
/* register window class if not yet done so */ /* register window class if not yet done so */
unsafe {
let ret = RegisterClassW(&window_class); let ret = RegisterClassW(&window_class);
if ret == 0 { if ret == 0 {
panic!("RegisterClassW"); panic!("RegisterClassW");
} }
} }
}
/* window is used ro receive WM_DISPLAYCHANGE messages */ /* window is used ro receive WM_DISPLAYCHANGE messages */
unsafe {
CreateWindowExW( CreateWindowExW(
Default::default(), Default::default(),
w!("lan-mouse-message-window-class"), w!("lan-mouse-message-window-class"),
@@ -215,38 +219,40 @@ fn start_routine(
None, None,
) )
.expect("CreateWindowExW"); .expect("CreateWindowExW");
}
/* run message loop */ /* run message loop */
loop { loop {
// mouse / keybrd proc do not actually return a message // mouse / keybrd proc do not actually return a message
let Some(msg) = get_msg() else { let Some(msg) = get_msg() else {
break; break;
}; };
if msg.hwnd.0.is_null() { if msg.hwnd.0.is_null() {
/* messages sent via PostThreadMessage */ /* messages sent via PostThreadMessage */
match msg.wParam.0 { match msg.wParam.0 {
x if x == RequestType::Exit as usize => break, x if x == RequestType::Exit as usize => break,
x if x == RequestType::Release as usize => { x if x == RequestType::Release as usize => {
ACTIVE_CLIENT.take(); ACTIVE_CLIENT.take();
}
x if x == RequestType::ClientUpdate as usize => {
let requests = {
let mut res = vec![];
let mut requests = request_buffer.lock().unwrap();
for request in requests.drain(..) {
res.push(request);
}
res
};
for request in requests {
update_clients(request)
}
}
_ => {}
} }
} else { x if x == RequestType::ClientUpdate as usize => {
/* other messages for window_procs */ let requests = {
let mut res = vec![];
let mut requests = request_buffer.lock().unwrap();
for request in requests.drain(..) {
res.push(request);
}
res
};
for request in requests {
update_clients(request)
}
}
_ => {}
}
} else {
/* other messages for window_procs */
unsafe {
let _ = TranslateMessage(&msg); let _ = TranslateMessage(&msg);
DispatchMessageW(&msg); DispatchMessageW(&msg);
} }