@@ -123,7 +123,7 @@ SceneState gSceneState = WaitBeginScene;
123
123
std::chrono::steady_clock::time_point gTimeStart ;
124
124
bool gbBridgeRunning = true ;
125
125
std::string gRemixFolder = " " ;
126
- thread_local int gRemixWndProcEntryExitCount = 0 ;
126
+ thread_local std::unordered_map<UINT, int > gRemixWndProcEntryExitCountMap ;
127
127
128
128
void PrintRecentCommandHistory () {
129
129
// Log history of recent client side commands sent and received by the server
@@ -468,35 +468,11 @@ LRESULT WINAPI RemixWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
468
468
const bool isUnicode = IsWindowUnicode (hWnd);
469
469
470
470
LRESULT lresult = 0 ;
471
- gRemixWndProcEntryExitCount += 1 ;
472
- int curEntryExitCount = gRemixWndProcEntryExitCount ;
473
- // Detecting recursive calls
474
- if (curEntryExitCount > 1 ) {
475
- int wndProcListLen = 0 ;
476
- {
477
- std::scoped_lock lock (gWndProcListMapMutex );
478
- if (ogWndProcList.find (hWnd) != ogWndProcList.end ())
479
- wndProcListLen = ogWndProcList[hWnd].size ();
480
- }
481
- int curWndProcIndex = curEntryExitCount-1 ;
482
- if (curWndProcIndex >= wndProcListLen) {
483
- gRemixWndProcEntryExitCount = 0 ;
484
- lresult = !isUnicode ?
485
- DefWindowProcA (hWnd, msg, wParam, lParam) :
486
- DefWindowProcW (hWnd, msg, wParam, lParam);
487
- }
488
- else {
489
- WNDPROC prevWndProc;
490
- {
491
- std::scoped_lock lock (gWndProcListMapMutex );
492
- prevWndProc = ogWndProcList[hWnd][curWndProcIndex];
493
- }
494
- lresult = !isUnicode ?
495
- CallWindowProcA (prevWndProc, hWnd, msg, wParam, lParam) :
496
- CallWindowProcW (prevWndProc, hWnd, msg, wParam, lParam);
497
- }
498
- }
499
- else {
471
+ gRemixWndProcEntryExitCountMap [msg] += 1 ;
472
+ int curEntryExitCount = gRemixWndProcEntryExitCountMap [msg];
473
+
474
+ if (curEntryExitCount == 1 )
475
+ {
500
476
if (msg == WM_ACTIVATEAPP || msg == WM_SIZE || msg == WM_DESTROY) {
501
477
gSwapChainMapMutex .lock ();
502
478
if (gSwapChainMap .find (hWnd) != gSwapChainMap .end ()) {
@@ -549,7 +525,34 @@ LRESULT WINAPI RemixWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
549
525
CallWindowProcW (prevWndProc, hWnd, msg, wParam, lParam);
550
526
}
551
527
}
552
- gRemixWndProcEntryExitCount -= 1 ;
528
+ else {
529
+ int wndProcListLen = 0 ;
530
+ {
531
+ std::scoped_lock lock (gWndProcListMapMutex );
532
+ if (ogWndProcList.find (hWnd) != ogWndProcList.end ())
533
+ wndProcListLen = ogWndProcList[hWnd].size ();
534
+ }
535
+ int curWndProcIndex = curEntryExitCount-1 ;
536
+ if (curWndProcIndex >= wndProcListLen) {
537
+ Logger::warn (logger_strings::WndProcExcessiveRecCall + std::to_string (msg) + " wParam: " + std::to_string (wParam));
538
+ lresult = !isUnicode ?
539
+ DefWindowProcA (hWnd, msg, wParam, lParam) :
540
+ DefWindowProcW (hWnd, msg, wParam, lParam);
541
+ }
542
+ else {
543
+ WNDPROC prevWndProc;
544
+ {
545
+ std::scoped_lock lock (gWndProcListMapMutex );
546
+ prevWndProc = ogWndProcList[hWnd][curWndProcIndex];
547
+ }
548
+ lresult = !isUnicode ?
549
+ CallWindowProcA (prevWndProc, hWnd, msg, wParam, lParam) :
550
+ CallWindowProcW (prevWndProc, hWnd, msg, wParam, lParam);
551
+ }
552
+ }
553
+
554
+ gRemixWndProcEntryExitCountMap [msg] -= 1 ;
555
+
553
556
return lresult;
554
557
}
555
558
0 commit comments