Bug 479786 - kwin_wayland hangs when dragging window to top/bottom of screen with "screen&window edge snap zone" set to "None"
Summary: kwin_wayland hangs when dragging window to top/bottom of screen with "screen&...
Status: RESOLVED FIXED
Alias: None
Product: kwin
Classification: Plasma
Component: wayland-generic (show other bugs)
Version: 5.92.0
Platform: Arch Linux Linux
: NOR major
Target Milestone: ---
Assignee: fanzhuyifan
URL:
Keywords: qt6
Depends on:
Blocks:
 
Reported: 2024-01-14 05:53 UTC by TheFeelTrain
Modified: 2024-03-21 15:00 UTC (History)
3 users (show)

See Also:
Latest Commit:
Version Fixed In: 6.0


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description TheFeelTrain 2024-01-14 05:53:15 UTC
SUMMARY

Dragging a window to the top or bottom of the screen when "screen edge snap zone" is set to "None" causes a full graphical freeze. Screen remains stuck even after 5 minutes, mouse does not move, cannot change tty. 

Setting "screen edge snap zone" to 1 px or higher stops the issue.

STEPS TO REPRODUCE

1. Window Behavior > Movement > Screen edge snap zone > Set to "None"
2. Drag a window with a titlebar to the top or bottom of the screen (sides seem to be fine)

OBSERVED RESULT

Screen will freeze, does not recover without a hard reset

EXPECTED RESULT

Does not freeze.

SOFTWARE/OS VERSIONS

Operating System: Arch Linux 
KDE Plasma Version: 5.92.0
KDE Frameworks Version: 5.248.0
Qt Version: 6.7.0
Kernel Version: 6.7.0-zen3-1-zen (64-bit)
Graphics Platform: Wayland
Processors: 32 × AMD Ryzen 9 7950X 16-Core Processor
Memory: 30.5 GiB of RAM
Graphics Processor: AMD Radeon RX 6800 XT
Manufacturer: ASUS

ADDITIONAL INFORMATION

Happened in QT 6.6 so it is not QT 6.7 related. The freeze is purely graphical since SSH still works and commands run fine. It only happens with windows with a titlebar, so borderless and GTK apps are fine. There is nothing in journalctl and no coredump when this happens. No logs of any kind as far as I can tell.

I can provide more information if needed but I am hoping it is reproducible on other systems so that won't be necessary.
Comment 1 fanzhuyifan 2024-01-14 19:45:18 UTC
I can reproduce this on git master under wayland when *both* screen edge snap zone and window snap zone are set to None.
Comment 2 fanzhuyifan 2024-01-14 19:57:24 UTC
gdb backtrace when attaching to stuck kwin_wayland:

+bt
#0  0x000079ccbdacc57d in QRect::QRect(int, int, int, int) (aheight=<optimized out>, awidth=<optimized out>, atop=<optimized out>, aleft=<optimized out>, this=<optimized out>) at /usr/include/qt6/QtCore/qrect.h:155
#1  QRectF::toRect() const (this=<optimized out>) at /usr/include/qt6/QtCore/qrect.h:854
#2  KWin::Window::handleInteractiveMoveResize(double, double, double, double) (this=this@entry=0x611583b35d70, x=<optimized out>, y=<optimized out>, x_root=<optimized out>, y_root=<optimized out>) at /home/yifan/kde/src/kwin/src/window.cpp:1690
#3  0x000079ccbdaccf7d in KWin::Window::handleInteractiveMoveResize(QPointF const&, QPointF const&) (this=this@entry=0x611583b35d70, local=..., global=...) at /usr/include/qt6/QtCore/qpoint.h:335
#4  0x000079ccbdacd578 in KWin::Window::updateInteractiveMoveResize(QPointF const&) (this=this@entry=0x611583b35d70, currentGlobalCursor=...) at /home/yifan/kde/src/kwin/src/window.cpp:1380
#5  0x000079ccbd956308 in KWin::MoveResizeFilter::pointerEvent(KWin::MouseEvent*, unsigned int) (this=<optimized out>, event=<optimized out>, nativeButton=<optimized out>) at /home/yifan/kde/src/kwin/src/input.cpp:604
#6  0x000079ccbd9f06dd in std::__invoke_impl<bool, bool (KWin::InputEventFilter::*&)(KWin::MouseEvent*, unsigned int), KWin::InputEventFilter* const&, KWin::MouseEvent*&, int&>(std::__invoke_memfun_deref, bool (KWin::InputEventFilter::*&)(KWin::MouseEvent*, unsigned int), KWin::InputEventFilter* const&, KWin::MouseEvent*&, int&) (__f=<optimized out>, __t=@0x6115839910e8: 0x6115839bc7e0) at /usr/include/c++/13.2.1/bits/invoke.h:71
#7  std::__invoke<bool (KWin::InputEventFilter::*&)(KWin::MouseEvent*, unsigned int), KWin::InputEventFilter* const&, KWin::MouseEvent*&, int&>(bool (KWin::InputEventFilter::*&)(KWin::MouseEvent*, unsigned int), KWin::InputEventFilter* const&, KWin::MouseEvent*&, int&) (__fn=<optimized out>) at /usr/include/c++/13.2.1/bits/invoke.h:96
#8  std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>::__call<bool, KWin::InputEventFilter* const&, 0ul, 1ul, 2ul>(std::tuple<KWin::InputEventFilter* const&>&&, std::_Index_tuple<0ul, 1ul, 2ul>) (__args=<optimized out>, this=<optimized out>) at /usr/include/c++/13.2.1/functional:506
#9  std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>::operator()<KWin::InputEventFilter* const&, bool>(KWin::InputEventFilter* const&) (this=<optimized out>) at /usr/include/c++/13.2.1/functional:591
#10 __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >::operator()<QList<KWin::InputEventFilter*>::const_iterator>(QList<KWin::InputEventFilter*>::const_iterator) (__it=..., this=<optimized out>) at /usr/include/c++/13.2.1/bits/predefined_ops.h:318
#11 std::__find_if<QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> > >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >, std::random_access_iterator_tag) (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algobase.h:2076
#12 std::__find_if<QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> > >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >) (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algobase.h:2117
#13 std::find_if<QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>) (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algo.h:3923
#14 std::none_of<QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>) (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algo.h:477
#15 std::any_of<QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>) (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algo.h:496
#16 KWin::InputRedirection::processFilters<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>) (function=..., this=<optimized out>) at /home/yifan/kde/src/kwin/src/input.h:194
#17 KWin::PointerInputRedirection::processMotionInternal(QPointF const&, QPointF const&, QPointF const&, std::chrono::duration<long, std::ratio<1l, 1000000l> >, KWin::InputDevice*) (this=0x61158362d8d0, pos=<optimized out>, delta=<optimized out>, deltaNonAccelerated=<optimized out>, time=std::chrono::duration = { <optimized out>us }, device=<optimized out>) at /home/yifan/kde/src/kwin/src/pointer_input.cpp:248
#18 0x000079ccbd9f158c in KWin::PointerInputRedirection::processMotion(QPointF const&, QPointF const&, std::chrono::duration<long, std::ratio<1l, 1000000l> >, KWin::InputDevice*) (this=<optimized out>, delta=<optimized out>, deltaNonAccelerated=<optimized out>, time=std::chrono::duration = { <optimized out>us }, device=<optimized out>) at /home/yifan/kde/src/kwin/src/pointer_input.cpp:225
#19 0x000079ccba7beaa9 in QtPrivate::QSlotObjectBase::call(QObject*, void**) (a=0x7ffdd34e0e50, r=0x61158362d8d0, this=0x6115839b1dd0, this=<optimized out>, r=<optimized out>, a=<optimized out>) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qobjectdefs_impl.h:469
#20 doActivate<false>(QObject*, int, void**) (sender=0x611583bbb380, signal_index=6, argv=0x7ffdd34e0e50) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qobject.cpp:4044
#21 0x000079ccbd8ab2a1 in KWin::InputDevice::pointerMotion(QPointF const&, QPointF const&, std::chrono::duration<long, std::ratio<1l, 1000000l> >, KWin::InputDevice*) (this=this@entry=0x611583bbb380, _t1=..., _t2=..., _t3=_t3@entry=std::chrono::duration = { 328552452us }, _t4=<optimized out>) at /home/yifan/kde/build/kwin/src/kwin_autogen/include/moc_inputdevice.cpp:828
#22 0x000079ccbdb91477 in KWin::LibInput::Connection::processEvents() (this=<optimized out>) at /home/yifan/kde/src/kwin/src/backends/libinput/connection.cpp:373
#23 0x000079ccba7afc74 in QObject::event(QEvent*) (this=0x611583708cf0, e=0x79cc8c04bf70) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qobject.cpp:1446
#24 0x000079ccbb97bf4b in QApplicationPrivate::notify_helper(QObject*, QEvent*) (this=<optimized out>, receiver=0x611583708cf0, e=0x79cc8c04bf70) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/widgets/kernel/qapplication.cpp:3290
#25 0x000079ccba765488 in QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x611583708cf0, event=event@entry=0x79cc8c04bf70) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qcoreapplication.cpp:1134
#26 0x000079ccba765814 in QCoreApplication::sendEvent(QObject*, QEvent*) (event=0x79cc8c04bf70, receiver=<optimized out>) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qcoreapplication.cpp:1575
#27 QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) (receiver=0x0, event_type=0, data=0x6115835008c0) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qcoreapplication.cpp:1946
#28 0x000079ccba8d89cb in QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=0x61158351ddd0, flags=flags@entry=...) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qeventdispatcher_unix.cpp:415
#29 0x000079ccbb3f2ce2 in QUnixEventDispatcherQPA::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=<optimized out>, flags=...) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/gui/platform/unix/qunixeventdispatcher.cpp:27
#30 0x000079ccba76d67e in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (flags=..., this=0x7ffdd34e1320) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qeventloop.cpp:100
#31 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (this=0x7ffdd34e1320, flags=...) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qeventloop.cpp:182
#32 0x000079ccba7690b8 in QCoreApplication::exec() () at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/global/qflags.h:74
#33 0x000079ccbb97849a in QApplication::exec() () at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/widgets/kernel/qapplication.cpp:2568
#34 0x000061158318ddc7 in main(int, char**) (argc=<optimized out>, argv=<optimized out>) at /home/yifan/kde/src/kwin/src/main_wayland.cpp:609
+frame 2
#2  KWin::Window::handleInteractiveMoveResize (this=this@entry=0x611583b35d70, x=<optimized out>, y=<optimized out>, x_root=<optimized out>, y_root=<optimized out>) at /home/yifan/kde/src/kwin/src/window.cpp:1690
1690	                        const QRect r = rect & titleRect.toRect();
+finish
Run till exit from #2  KWin::Window::handleInteractiveMoveResize (this=this@entry=0x611583b35d70, x=<optimized out>, y=<optimized out>, x_root=<optimized out>, y_root=<optimized out>) at /home/yifan/kde/src/kwin/src/window.cpp:1690
[Thread 0x79cc724006c0 (LWP 6016) exited]
[Thread 0x79cc71a006c0 (LWP 6018) exited]
[Thread 0x79cc72e006c0 (LWP 6017) exited]
[Thread 0x79cc738006c0 (LWP 6015) exited]

Thread 1 "kwin_wayland" received signal SIGINT, Interrupt.
0x000079ccbdacc594 in KWin::Window::handleInteractiveMoveResize (this=this@entry=0x611583b35d70, x=<optimized out>, y=<optimized out>, x_root=<optimized out>, y_root=<optimized out>) at /home/yifan/kde/src/kwin/src/window.cpp:1692
1692	                            (!transposed && r.height() == titleRect.height())) { // ...prevents long slim areas
+where
#0  0x000079ccbdacc594 in KWin::Window::handleInteractiveMoveResize(double, double, double, double) (this=this@entry=0x611583b35d70, x=<optimized out>, y=<optimized out>, x_root=<optimized out>, y_root=<optimized out>) at /home/yifan/kde/src/kwin/src/window.cpp:1692
#1  0x000079ccbdaccf7d in KWin::Window::handleInteractiveMoveResize(QPointF const&, QPointF const&) (this=this@entry=0x611583b35d70, local=..., global=...) at /usr/include/qt6/QtCore/qpoint.h:335
#2  0x000079ccbdacd578 in KWin::Window::updateInteractiveMoveResize(QPointF const&) (this=this@entry=0x611583b35d70, currentGlobalCursor=...) at /home/yifan/kde/src/kwin/src/window.cpp:1380
#3  0x000079ccbd956308 in KWin::MoveResizeFilter::pointerEvent(KWin::MouseEvent*, unsigned int) (this=<optimized out>, event=<optimized out>, nativeButton=<optimized out>) at /home/yifan/kde/src/kwin/src/input.cpp:604
#4  0x000079ccbd9f06dd in std::__invoke_impl<bool, bool (KWin::InputEventFilter::*&)(KWin::MouseEvent*, unsigned int), KWin::InputEventFilter* const&, KWin::MouseEvent*&, int&>(std::__invoke_memfun_deref, bool (KWin::InputEventFilter::*&)(KWin::MouseEvent*, unsigned int), KWin::InputEventFilter* const&, KWin::MouseEvent*&, int&) (__f=<optimized out>, __t=@0x6115839910e8: 0x6115839bc7e0) at /usr/include/c++/13.2.1/bits/invoke.h:71
#5  std::__invoke<bool (KWin::InputEventFilter::*&)(KWin::MouseEvent*, unsigned int), KWin::InputEventFilter* const&, KWin::MouseEvent*&, int&>(bool (KWin::InputEventFilter::*&)(KWin::MouseEvent*, unsigned int), KWin::InputEventFilter* const&, KWin::MouseEvent*&, int&) (__fn=<optimized out>) at /usr/include/c++/13.2.1/bits/invoke.h:96
#6  std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>::__call<bool, KWin::InputEventFilter* const&, 0ul, 1ul, 2ul>(std::tuple<KWin::InputEventFilter* const&>&&, std::_Index_tuple<0ul, 1ul, 2ul>) (__args=<optimized out>, this=<optimized out>) at /usr/include/c++/13.2.1/functional:506
#7  std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>::operator()<KWin::InputEventFilter* const&, bool>(KWin::InputEventFilter* const&) (this=<optimized out>) at /usr/include/c++/13.2.1/functional:591
#8  __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >::operator()<QList<KWin::InputEventFilter*>::const_iterator>(QList<KWin::InputEventFilter*>::const_iterator) (__it=..., this=<optimized out>) at /usr/include/c++/13.2.1/bits/predefined_ops.h:318
#9  std::__find_if<QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> > >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >, std::random_access_iterator_tag) (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algobase.h:2076
#10 std::__find_if<QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> > >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >) (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algobase.h:2117
#11 std::find_if<QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>) (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algo.h:3923
#12 std::none_of<QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>) (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algo.h:477
#13 std::any_of<QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>) (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algo.h:496
#14 KWin::InputRedirection::processFilters<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>) (function=..., this=<optimized out>) at /home/yifan/kde/src/kwin/src/input.h:194
#15 KWin::PointerInputRedirection::processMotionInternal(QPointF const&, QPointF const&, QPointF const&, std::chrono::duration<long, std::ratio<1l, 1000000l> >, KWin::InputDevice*) (this=0x61158362d8d0, pos=<optimized out>, delta=<optimized out>, deltaNonAccelerated=<optimized out>, time=std::chrono::duration = { <optimized out>us }, device=<optimized out>) at /home/yifan/kde/src/kwin/src/pointer_input.cpp:248
#16 0x000079ccbd9f158c in KWin::PointerInputRedirection::processMotion(QPointF const&, QPointF const&, std::chrono::duration<long, std::ratio<1l, 1000000l> >, KWin::InputDevice*) (this=<optimized out>, delta=<optimized out>, deltaNonAccelerated=<optimized out>, time=std::chrono::duration = { <optimized out>us }, device=<optimized out>) at /home/yifan/kde/src/kwin/src/pointer_input.cpp:225
#17 0x000079ccba7beaa9 in QtPrivate::QSlotObjectBase::call(QObject*, void**) (a=0x7ffdd34e0e50, r=0x61158362d8d0, this=0x6115839b1dd0, this=<optimized out>, r=<optimized out>, a=<optimized out>) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qobjectdefs_impl.h:469
#18 doActivate<false>(QObject*, int, void**) (sender=0x611583bbb380, signal_index=6, argv=0x7ffdd34e0e50) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qobject.cpp:4044
#19 0x000079ccbd8ab2a1 in KWin::InputDevice::pointerMotion(QPointF const&, QPointF const&, std::chrono::duration<long, std::ratio<1l, 1000000l> >, KWin::InputDevice*) (this=this@entry=0x611583bbb380, _t1=..., _t2=..., _t3=_t3@entry=std::chrono::duration = { 328552452us }, _t4=<optimized out>) at /home/yifan/kde/build/kwin/src/kwin_autogen/include/moc_inputdevice.cpp:828
#20 0x000079ccbdb91477 in KWin::LibInput::Connection::processEvents() (this=<optimized out>) at /home/yifan/kde/src/kwin/src/backends/libinput/connection.cpp:373
#21 0x000079ccba7afc74 in QObject::event(QEvent*) (this=0x611583708cf0, e=0x79cc8c04bf70) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qobject.cpp:1446
#22 0x000079ccbb97bf4b in QApplicationPrivate::notify_helper(QObject*, QEvent*) (this=<optimized out>, receiver=0x611583708cf0, e=0x79cc8c04bf70) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/widgets/kernel/qapplication.cpp:3290
#23 0x000079ccba765488 in QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x611583708cf0, event=event@entry=0x79cc8c04bf70) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qcoreapplication.cpp:1134
#24 0x000079ccba765814 in QCoreApplication::sendEvent(QObject*, QEvent*) (event=0x79cc8c04bf70, receiver=<optimized out>) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qcoreapplication.cpp:1575
#25 QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) (receiver=0x0, event_type=0, data=0x6115835008c0) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qcoreapplication.cpp:1946
#26 0x000079ccba8d89cb in QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=0x61158351ddd0, flags=flags@entry=...) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qeventdispatcher_unix.cpp:415
#27 0x000079ccbb3f2ce2 in QUnixEventDispatcherQPA::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=<optimized out>, flags=...) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/gui/platform/unix/qunixeventdispatcher.cpp:27
#28 0x000079ccba76d67e in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (flags=..., this=0x7ffdd34e1320) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qeventloop.cpp:100
#29 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (this=0x7ffdd34e1320, flags=...) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/kernel/qeventloop.cpp:182
#30 0x000079ccba7690b8 in QCoreApplication::exec() () at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/corelib/global/qflags.h:74
#31 0x000079ccbb97849a in QApplication::exec() () at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.7.0-beta1/src/widgets/kernel/qapplication.cpp:2568
#32 0x000061158318ddc7 in main(int, char**) (argc=<optimized out>, argv=<optimized out>) at /home/yifan/kde/src/kwin/src/main_wayland.cpp:609
+l
1687	                    const QRectF titleRect(bTitleRect.translated(currentTry.topLeft()));
1688	                    int visiblePixels = 0;
1689	                    for (const QRect &rect : availableArea) {
1690	                        const QRect r = rect & titleRect.toRect();
1691	                        if ((transposed && r.width() == titleRect.width()) || // Only the full size regions...
1692	                            (!transposed && r.height() == titleRect.height())) { // ...prevents long slim areas
1693	                            visiblePixels += r.width() * r.height();
1694	                        }
1695	                    }
1696	                    if (visiblePixels >= requiredPixels) {
Comment 3 fanzhuyifan 2024-01-15 06:58:07 UTC
Fyi the MR https://invent.kde.org/plasma/kwin/-/merge_requests/4302 proposes a refactoring of KWin::Window::handleInteractiveMoveResize
Comment 4 fanzhuyifan 2024-01-15 16:32:10 UTC
I plan to work on this.
Comment 5 Bug Janitor Service 2024-01-16 07:13:02 UTC
A possibly relevant merge request was started @ https://invent.kde.org/plasma/kwin/-/merge_requests/4941
Comment 6 fanzhuyifan 2024-01-17 18:14:39 UTC
Git commit 2dba3d30af510a03e2e0bce870b65dad8b763edc by Yifan Zhu.
Committed on 17/01/2024 at 19:05.
Pushed by fanzhuyifan into branch 'master'.

window: don't use exact comparison for QRectFs

With fractional geometries, we can only guarantee that
nextMoveResizeGeom eventually is within one unit of
currentMoveResizeGeom.
FIXED-IN: 6.0

M  +5    -1    src/window.cpp

https://invent.kde.org/plasma/kwin/-/commit/2dba3d30af510a03e2e0bce870b65dad8b763edc
Comment 7 fanzhuyifan 2024-01-17 18:46:43 UTC
Git commit 33077cb81c0504263eda6152bd6fa3776a7a470d by Yifan Zhu.
Committed on 17/01/2024 at 19:37.
Pushed by fanzhuyifan into branch 'Plasma/6.0'.

window: don't use exact comparison for QRectFs

With fractional geometries, we can only guarantee that
nextMoveResizeGeom eventually is within one unit of
currentMoveResizeGeom.
FIXED-IN: 6.0


(cherry picked from commit 2dba3d30af510a03e2e0bce870b65dad8b763edc)

M  +5    -1    src/window.cpp

https://invent.kde.org/plasma/kwin/-/commit/33077cb81c0504263eda6152bd6fa3776a7a470d
Comment 8 serfreeman1337 2024-03-21 13:41:46 UTC
MR https://invent.kde.org/plasma/kwin/-/merge_requests/5468 introduced this bug on master again.
(and systemd now restarts kwin in case of hang, yay)
Comment 9 fanzhuyifan 2024-03-21 14:19:52 UTC
(In reply to serfreeman1337 from comment #8)
> MR https://invent.kde.org/plasma/kwin/-/merge_requests/5468 introduced this
> bug on master again.
> (and systemd now restarts kwin in case of hang, yay)

Ooops...... Maybe we should just wait for the rerwite in https://invent.kde.org/plasma/kwin/-/merge_requests/5296.....
Comment 10 fanzhuyifan 2024-03-21 15:00:20 UTC
(In reply to serfreeman1337 from comment #8)
> MR https://invent.kde.org/plasma/kwin/-/merge_requests/5468 introduced this
> bug on master again.
> (and systemd now restarts kwin in case of hang, yay)

FWIW I can't reproduce on master using fractional scaling, and when *both* screen edge snap zone and window snap zone are set to None. But if you can reproduce consistently and are certain the MR is causing the issue, I would suggest reverting the MR, since having windows move by 1px increments is far less annoying than kwin hanging.