1
0
mirror of https://github.com/winscp/winscp.git synced 2026-10-24 02:28:55 +03:00

Windows shell local file copy status window is centered on the main window

Source commit: 91a0daf05a54079315906c22dca82a0cc4d5a77a
This commit is contained in:
Martin Prikryl
2025-09-30 12:09:47 +00:00
parent 8f55659153
commit b38cf104cc
4 changed files with 101 additions and 24 deletions

View File

@@ -280,6 +280,11 @@ __fastcall TCustomScpExplorerForm::TCustomScpExplorerForm(TComponent* Owner):
// (necessary for "explorer" only, as "commander" loads it for its drive menu)
DriveInfo->NeedData();
UsesCustomColorMode(this);
FOperationStatusWindow = nullptr;
FOperationStatusWindowTimer = nullptr;
DebugAssert(OnActiveFormChange == nullptr);
OnActiveFormChange = ActiveFormChange;
}
//---------------------------------------------------------------------------
__fastcall TCustomScpExplorerForm::~TCustomScpExplorerForm()
@@ -12382,3 +12387,60 @@ void TCustomScpExplorerForm::ChangeDirViewStyle(TOperationSide Side, TDirViewSty
UpdateControls();
}
}
//---------------------------------------------------------------------------
void __fastcall TCustomScpExplorerForm::ActiveFormChange(TObject *)
{
HWND WindowHandle = GetForegroundWindow();
if ((WindowHandle != nullptr) && (WindowHandle != FOperationStatusWindow))
{
DWORD ProcessId;
if ((GetWindowThreadProcessId(WindowHandle, &ProcessId) != 0) &&
(ProcessId == GetCurrentProcessId()))
{
UnicodeString ClassName;
ClassName.SetLength(256);
GetClassName(WindowHandle, ClassName.c_str(), ClassName.Length());
PackStr(ClassName);
if ((ClassName == L"OperationStatusWindow") &&
!IsIconic(WindowHandle))
{
FOperationStatusWindow = WindowHandle;
PlaceOperationStatusWindow();
FOperationStatusWindowIterations = 0;
if (FOperationStatusWindowTimer == nullptr)
{
FOperationStatusWindowTimer = new TTimer(this);
}
FOperationStatusWindowTimer->OnTimer = OperationStatusWindowTimer;
FOperationStatusWindowTimer->Interval = 50;
FOperationStatusWindowTimer->Enabled = true;
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TCustomScpExplorerForm::OperationStatusWindowTimer(TObject *)
{
FOperationStatusWindowIterations++;
PlaceOperationStatusWindow();
if (FOperationStatusWindowIterations == 5)
{
SAFE_DESTROY(FOperationStatusWindowTimer);
}
}
//---------------------------------------------------------------------------
void TCustomScpExplorerForm::PlaceOperationStatusWindow()
{
TRect CurRect;
if ((Screen->ActiveForm != nullptr) &&
GetWindowRect(FOperationStatusWindow, &CurRect))
{
TRect Rect = CurRect;
CenterFormOn(Rect, Screen->ActiveForm, nullptr);
if (Rect != CurRect)
{
// What TWinControl.SetBounds does
SetWindowPos(FOperationStatusWindow, 0, Rect.Left, Rect.Top, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE);
}
}
}

View File

@@ -321,6 +321,9 @@ private:
bool FUpdatingSessionTabs;
TCalculateSizeOperation * FCalculateSizeOperation;
TTBXTheme * FHiContrastTheme;
HWND FOperationStatusWindow;
TTimer * FOperationStatusWindowTimer;
int FOperationStatusWindowIterations;
bool __fastcall GetEnableFocusedOperation(TOperationSide Side, int FilesOnly);
bool __fastcall GetEnableSelectedOperation(TOperationSide Side, int FilesOnly);
@@ -381,6 +384,9 @@ private:
void __fastcall StoreTransitionCloseClick(TObject * Sender);
void __fastcall StoreTransitionLinkClick(TObject * Sender);
void InitializeRemoteThumbnailMask();
void __fastcall OperationStatusWindowTimer(TObject *);
void __fastcall ActiveFormChange(TObject *);
void PlaceOperationStatusWindow();
protected:
TOperationSide FCurrentSide;

View File

@@ -17,6 +17,7 @@
//---------------------------------------------------------------------------
const UnicodeString ContextSeparator(TraceInitStr(L"\x00BB"));
const UnicodeString LinkAppLabelMark(TraceInitStr(UnicodeString(L" ") + ContextSeparator));
TNotifyEvent OnActiveFormChange = nullptr;
//---------------------------------------------------------------------------
class TFormCustomizationComponent : public TComponent
{
@@ -959,6 +960,14 @@ static void __fastcall FormWindowProc(void * Data, TMessage & Message)
CountClicksForWindowPrint(AForm);
WndProc(Message);
}
else if (Message.Msg == WM_ACTIVATE)
{
if (OnActiveFormChange != nullptr)
{
OnActiveFormChange(nullptr);
}
WndProc(Message);
}
else
{
WndProc(Message);
@@ -1752,6 +1761,26 @@ void __fastcall CutFormToDesktop(TForm * Form)
}
}
//---------------------------------------------------------------------------
void CenterFormOn(TRect & Bounds, TCustomForm * CenterForm, Forms::TMonitor * CenterMonitor)
{
int X, Y;
if (CenterForm != NULL)
{
TForm * PublicCenterForm = reinterpret_cast<TForm *>(CenterForm);
X = ((PublicCenterForm->Width - Bounds.Width()) / 2) + PublicCenterForm->Left;
Y = ((PublicCenterForm->Height - Bounds.Height()) / 2) + PublicCenterForm->Top;
}
else
{
X = (CenterMonitor->Width - Bounds.Width()) / 2;
Y = (CenterMonitor->Height - Bounds.Height()) / 2;
}
X = std::max(X, 0);
Y = std::max(Y, 0);
Bounds.SetLocation(X, Y);
}
//---------------------------------------------------------------------------
void __fastcall UpdateFormPosition(TCustomForm * Form, TPosition Position)
{
if ((Position == poScreenCenter) ||
@@ -1771,30 +1800,8 @@ void __fastcall UpdateFormPosition(TCustomForm * Form, TPosition Position)
}
TRect Bounds = Form->BoundsRect;
int X, Y;
if (CenterForm != NULL)
{
X = ((((TForm *)CenterForm)->Width - Bounds.Width()) / 2) +
((TForm *)CenterForm)->Left;
Y = ((((TForm *)CenterForm)->Height - Bounds.Height()) / 2) +
((TForm *)CenterForm)->Top;
}
else
{
X = (Form->Monitor->Width - Bounds.Width()) / 2;
Y = (Form->Monitor->Height - Bounds.Height()) / 2;
}
if (X < 0)
{
X = 0;
}
if (Y < 0)
{
Y = 0;
}
Form->SetBounds(X, Y, Bounds.Width(), Bounds.Height());
CenterFormOn(Bounds, CenterForm, Form->Monitor);
Form->SetBounds(Bounds.Left, Bounds.Top, Bounds.Width(), Bounds.Height());
}
}
//---------------------------------------------------------------------------

View File

@@ -9,6 +9,7 @@
#include <HistoryComboBox.hpp>
//---------------------------------------------------------------------------
extern const UnicodeString ContextSeparator;
extern TNotifyEvent OnActiveFormChange;
//---------------------------------------------------------------------------
void __fastcall FixListColumnWidth(TListView * TListView, int Index);
void __fastcall AutoSizeListColumnsWidth(TListView * ListView, int ColumnToShrinkIndex = -1);
@@ -59,6 +60,7 @@ void __fastcall SetVerticalControlsOrder(TControl ** ControlsOrder, int Count);
void __fastcall SetHorizontalControlsOrder(TControl ** ControlsOrder, int Count);
void __fastcall MakeNextInTabOrder(TWinControl * Control, TWinControl * After);
void __fastcall CutFormToDesktop(TForm * Form);
void CenterFormOn(TRect & Bounds, TCustomForm * CenterForm, Forms::TMonitor * CenterMonitor);
void __fastcall UpdateFormPosition(TCustomForm * Form, TPosition Position);
void __fastcall ResizeForm(TCustomForm * Form, int Width, int Height);
TComponent * __fastcall GetFormOwner();