Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions src/DockManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -548,16 +548,16 @@ CDockManager::CDockManager(QWidget *parent) :
return;
}

// If the user clicks the main window or drags a floating widget or works with a
// modal dialog, then raise the main window, all floating widgets and the focus window
// itself to bring it into foreground of any other application.
bool raise = qobject_cast<QMainWindow*>(widget)
|| qobject_cast<ads::CFloatingDockContainer*>(widget);
if (auto dialog = qobject_cast<QDialog*>(widget))
{
raise |= dialog->isModal();
}
if (!raise)
// Only restack windows while a floating dock widget is actively being dragged.
// Reacting to ordinary focus changes makes this handler raise() multiple
// top-level windows, which can transfer focus and re-emit focusWindowChanged,
// re-entering this handler in a self-sustaining loop that never settles -
// visible as constant flicker on Linux/X11. Gating on an
// active drag breaks that loop: outside a drag we do nothing.
const bool draggingActive = std::any_of(
d->FloatingWidgets.begin(), d->FloatingWidgets.end(),
[](CFloatingDockContainer* fw){ return fw && fw->isDraggingActive(); });
if (!draggingActive)
{
return;
}
Expand Down
6 changes: 6 additions & 0 deletions src/FloatingDockContainer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -817,6 +817,12 @@ CDockContainerWidget* CFloatingDockContainer::dockContainer() const
return d->DockContainer;
}

//============================================================================
bool CFloatingDockContainer::isDraggingActive() const
{
return d->isState(DraggingFloatingWidget);
}

//============================================================================
void CFloatingDockContainer::changeEvent(QEvent *event)
{
Expand Down
5 changes: 5 additions & 0 deletions src/FloatingDockContainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,11 @@ private Q_SLOTS:
*/
void finishDropOperation();

/**
* Returns true while this floating widget is actively being dragged.
*/
bool isDraggingActive() const;

#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
/**
* This is a function that responds to FloatingWidgetTitleBar::maximizeRequest()
Expand Down