Browse Source

Bug 1907: Main window follows Login dialog to another monitor, when switched using keyboard shortcuts Win+Shift+Left/Right

https://winscp.net/tracker/1907

Source commit: 26365e6aff9de86960886fb0ff4ba07ce8ab59a9
Martin Prikryl 5 years ago
parent
commit
71ea8f8072
2 changed files with 30 additions and 12 deletions
  1. 27 11
      source/forms/Login.cpp
  2. 3 1
      source/forms/Login.h

+ 27 - 11
source/forms/Login.cpp

@@ -71,6 +71,7 @@ __fastcall TLoginDialog::TLoginDialog(TComponent* AOwner)
   FSortEnablePending = false;
   FSiteSearch = isName;
   FLinkedForm = NULL;
+  FRestoring = false;
   FPrevPos = TPoint(std::numeric_limits<LONG>::min(), std::numeric_limits<LONG>::min());
 
   // we need to make sure that window procedure is set asap
@@ -1590,25 +1591,36 @@ void __fastcall TLoginDialog::CMDialogKey(TWMKeyDown & Message)
   TForm::Dispatch(&Message);
 }
 //---------------------------------------------------------------------------
-void __fastcall TLoginDialog::WMMoving(TMessage & Message)
+void __fastcall TLoginDialog::WMWindowPosChanged(TWMWindowPosChanged & Message)
 {
   TForm::Dispatch(&Message);
-
-  if (FLinkedForm != NULL)
+  if (FLAGCLEAR(Message.WindowPos->flags, SWP_NOMOVE) && (FLinkedForm != NULL))
   {
     if (FPrevPos.X == std::numeric_limits<LONG>::min())
     {
       FPrevPos = BoundsRect.TopLeft();
     }
-    TRect Rect = *reinterpret_cast<RECT*>(Message.LParam);
-    FLinkedForm->SetBounds(
-      FLinkedForm->Left + (Rect.Left - FPrevPos.X),
-      FLinkedForm->Top + (Rect.Top - FPrevPos.Y),
-      FLinkedForm->Width, FLinkedForm->Height);
-    FPrevPos = Rect.TopLeft();
+    TPoint P = TPoint(Message.WindowPos->x, Message.WindowPos->y);
+    if (FPrevPos != P)
+    {
+      if (!FRestoring)
+      {
+        FLinkedForm->SetBounds(
+          FLinkedForm->Left + (P.X - FPrevPos.X),
+          FLinkedForm->Top + (P.Y - FPrevPos.Y),
+          FLinkedForm->Width, FLinkedForm->Height);
+      }
+      FPrevPos = P;
+    }
   }
 }
 //---------------------------------------------------------------------------
+void __fastcall TLoginDialog::CMVisibleChanged(TMessage & Message)
+{
+  TAutoFlag RestoringSwitch(FRestoring);
+  TForm::Dispatch(&Message);
+}
+//---------------------------------------------------------------------------
 void __fastcall TLoginDialog::CMDpiChanged(TMessage & Message)
 {
   TForm::Dispatch(&Message);
@@ -1654,9 +1666,13 @@ void __fastcall TLoginDialog::Dispatch(void * Message)
       TForm::Dispatch(Message);
     }
   }
-  else if (M->Msg == WM_MOVING)
+  else if (M->Msg == WM_WINDOWPOSCHANGED)
+  {
+    WMWindowPosChanged(*reinterpret_cast<TWMWindowPosChanged *>(M));
+  }
+  else if (M->Msg == CM_VISIBLECHANGED)
   {
-    WMMoving(*M);
+    CMVisibleChanged(*M);
   }
   else if (M->Msg == CM_DPICHANGED)
   {

+ 3 - 1
source/forms/Login.h

@@ -317,6 +317,7 @@ private:
   UnicodeString FUserNameLabel;
   UnicodeString FPasswordLabel;
   int FFixedSessionImages;
+  bool FRestoring;
 
   void __fastcall LoadSession(TSessionData * SessionData);
   void __fastcall LoadContents();
@@ -396,9 +397,10 @@ private:
   void __fastcall ResetNewSiteData();
   TModalResult __fastcall DefaultResult();
   int __fastcall AddLoginButtonImage(bool Enabled);
-  void __fastcall WMMoving(TMessage & Message);
+  void __fastcall WMWindowPosChanged(TWMWindowPosChanged & Message);
   void __fastcall CMDpiChanged(TMessage & Message);
   void __fastcall GenerateImages();
+  void __fastcall CMVisibleChanged(TMessage & Message);
 
 protected:
   void __fastcall Default();