Browse Source

Bug 1386: Prolonging countdown only after mouse moves substantially over message box with "timeout" button

https://winscp.net/tracker/1386

Source commit: e2d2596b103bc9bde8f5000f125966e5b8c3430f
Martin Prikryl 9 years ago
parent
commit
ed10765791
1 changed files with 21 additions and 6 deletions
  1. 21 6
      source/windows/WinInterface.cpp

+ 21 - 6
source/windows/WinInterface.cpp

@@ -320,7 +320,7 @@ public:
   __fastcall TMessageTimeout(TComponent * AOwner, unsigned int Timeout,
     TButton * Button);
 
-  void __fastcall Suspend();
+  void __fastcall MouseMove();
   void __fastcall Cancel();
 
 protected:
@@ -328,6 +328,7 @@ protected:
   unsigned int FTimeout;
   TButton * FButton;
   UnicodeString FOrigCaption;
+  TPoint FOrigCursorPos;
 
   void __fastcall DoTimer(TObject * Sender);
   void __fastcall UpdateButton();
@@ -340,14 +341,28 @@ __fastcall TMessageTimeout::TMessageTimeout(TComponent * AOwner,
   OnTimer = DoTimer;
   Interval = MSecsPerSec;
   FOrigCaption = FButton->Caption;
+  FOrigCursorPos = Mouse->CursorPos;
   UpdateButton();
 }
 //---------------------------------------------------------------------------
-void __fastcall TMessageTimeout::Suspend()
+void __fastcall TMessageTimeout::MouseMove()
 {
-  const unsigned int SuspendTime = 30 * MSecsPerSec;
-  FTimeout = std::max(FOrigTimeout, SuspendTime);
-  UpdateButton();
+  TPoint CursorPos = Mouse->CursorPos;
+  int Delta = std::max(std::abs(FOrigCursorPos.X - CursorPos.X), std::abs(FOrigCursorPos.Y - CursorPos.Y));
+
+  int Threshold = 8;
+  if (DebugAlwaysTrue(FButton != NULL))
+  {
+    Threshold = ScaleByTextHeight(FButton, Threshold);
+  }
+
+  if (Delta > Threshold)
+  {
+    FOrigCursorPos = CursorPos;
+    const unsigned int SuspendTime = 30 * MSecsPerSec;
+    FTimeout = std::max(FOrigTimeout, SuspendTime);
+    UpdateButton();
+  }
 }
 //---------------------------------------------------------------------------
 void __fastcall TMessageTimeout::Cancel()
@@ -396,7 +411,7 @@ static void __fastcall MessageDialogMouseMove(void * Data, TObject * /*Sender*/,
 {
   DebugAssert(Data != NULL);
   TMessageTimeout * Timeout = static_cast<TMessageTimeout *>(Data);
-  Timeout->Suspend();
+  Timeout->MouseMove();
 }
 //---------------------------------------------------------------------------
 static void __fastcall MessageDialogMouseDown(void * Data, TObject * /*Sender*/,