mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-04-08 19:51:28 +03:00
less unsafe code
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user