From 6191216873d353add90fa7e8d291a200afd9bc5d Mon Sep 17 00:00:00 2001 From: Ferdinand Schober Date: Sat, 5 Oct 2024 21:47:12 +0200 Subject: [PATCH] windows: fix panic when recreating input-capture RegisterWindowClassW fails when called again --- input-capture/src/windows.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/input-capture/src/windows.rs b/input-capture/src/windows.rs index 7517984..ea17dba 100644 --- a/input-capture/src/windows.rs +++ b/input-capture/src/windows.rs @@ -8,7 +8,7 @@ use std::ptr::{addr_of, addr_of_mut}; use futures::executor::block_on; use std::default::Default; -use std::sync::atomic::{AtomicU32, Ordering}; +use std::sync::atomic::{AtomicBool, AtomicU32, Ordering}; use std::sync::{mpsc, Mutex}; use std::task::ready; use std::{pin::Pin, thread}; @@ -493,6 +493,8 @@ fn get_msg() -> Option { } } +static WINDOW_CLASS_REGISTERED: AtomicBool = AtomicBool::new(false); + fn message_thread(ready_tx: mpsc::Sender<()>) { unsafe { set_event_tid(GetCurrentThreadId()); @@ -513,9 +515,13 @@ fn message_thread(ready_tx: mpsc::Sender<()>) { ..Default::default() }; - let ret = RegisterClassW(&window_class); - if ret == 0 { - panic!("RegisterClassW"); + + if WINDOW_CLASS_REGISTERED.compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst).is_ok() { + /* register window class if not yet done so */ + let ret = RegisterClassW(&window_class); + if ret == 0 { + panic!("RegisterClassW"); + } } /* window is used ro receive WM_DISPLAYCHANGE messages */