Bug 481254

Summary: Desktop files/folders dropped from one screen onto another one disappear until plasmashell is restarted or the other screen is disconnected/reconnected
Product: [Plasma] plasmashell Reporter: groomyrocky
Component: FolderAssignee: Plasma Bugs List <plasma-bugs>
Status: RESOLVED FIXED    
Severity: major CC: dashonwwIII, dougshaw77, hein, nate, nethaven, postix
Priority: HI Keywords: multiscreen, qt6
Version: git-stable-Plasma/6.1   
Target Milestone: 1.0   
Platform: Arch Linux   
OS: Linux   
Latest Commit: Version Fixed In: 6.1.1
Sentry Crash Report:

Description groomyrocky 2024-02-12 09:26:52 UTC
SUMMARY
***
NOTE: If you are reporting a crash, please try to attach a backtrace with debug symbols.
See https://community.kde.org/Guidelines_and_HOWTOs/Debugging/How_to_create_useful_crash_reports
***


STEPS TO REPRODUCE
1. upgrade to KDE6 with existing desktop icons
2. move icons from first monitor desktop to second monitor desktop
3. 

OBSERVED RESULT
icons disappear but can still accessed through desktop directory 

EXPECTED RESULT
show on the second monitor's desktop

SOFTWARE/OS VERSIONS
Windows: 
macOS: 
Linux/KDE Plasma: arch linux, KDE6
(available in About System)
KDE Plasma Version: 6 RC2
KDE Frameworks Version: 
Qt Version: 

ADDITIONAL INFORMATION
Comment 1 Doug 2024-02-17 03:33:41 UTC
Can reproduce.  Icons don't have to be there during upgrade to KDE6.  You can add icons and move them and reproduce.

Operating System: KDE neon Testing Edition
KDE Plasma Version: 6.0.0
KDE Frameworks Version: 6.0.0
Qt Version: 6.6.1
Kernel Version: 6.5.0-18-generic (64-bit)
Graphics Platform: Wayland
Graphics Processor: AMD Radeon Pro WX 3200 Series
Comment 2 Nate Graham 2024-02-23 21:01:58 UTC
Aaaaa can reproduce
Comment 3 Nate Graham 2024-02-23 21:04:36 UTC
If I restart plasmashell, the file appears on the external screen in the position I dragged it to.

If instead, I disconnect the screen that I dragged the file onto, it re-appears on the original screen, but in the top-left-most position, not where it was before.

If I then re-connect the external screen, the file appears on its desktop in the top-left-most position.
Comment 4 Bug Janitor Service 2024-02-26 16:19:20 UTC
A possibly relevant merge request was started @ https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/2069
Comment 5 Marco Martin 2024-02-28 08:49:33 UTC
Git commit f0ede2d83731952012be0d43c77916d18617edb2 by Marco Martin.
Committed on 28/02/2024 at 08:49.
Pushed by mart into branch 'master'.

FolderView Positioner: fix rows insert and remove

The positioner "proxy" model had problems both in rows insertion and
removal.

when an icon is dropped in an empty desktop area as the new "last"
position, the positioner model creates new empty items for the GridView
until it reaches the cell of the drop position.

This broke because of connection slot invocation order: the connection
to QAbstractItemModel::rowsInserted in FolderModel constructor was
executed before the connection in positioner.
In turn that connection emitted move, which invoked move on Positioner,
which at this point thinks its still in the first rows insertion
transaction, because its slot has not been executed yet,
and m_beginInsertRowsCalled is still true, so there won't be a "correct"
new beginInsertRows called.
Make it a Queued connection to push it back.

In the same way, when dragging from a "last" position, the Positioner model
will remove all the trailing empty items. But it modified m_proxyToSource
(from which rowCount() depends) before calling beginRemoveRows, sending
the model into an inconsitent state and causing an assert. Make sure
that m_proxyToSource is touched only after beginRemoveRows.
Related: bug 466337

M  +18   -11   containments/desktop/plugins/folder/foldermodel.cpp
M  +11   -6    containments/desktop/plugins/folder/positioner.cpp

https://invent.kde.org/plasma/plasma-desktop/-/commit/f0ede2d83731952012be0d43c77916d18617edb2
Comment 6 Marco Martin 2024-02-28 08:51:01 UTC
Git commit e306c63ddbeaccea72a03fbb2c3dbd8245addef5 by Marco Martin.
Committed on 28/02/2024 at 08:50.
Pushed by mart into branch 'Plasma/6.0'.

FolderView Positioner: fix rows insert and remove

The positioner "proxy" model had problems both in rows insertion and
removal.

when an icon is dropped in an empty desktop area as the new "last"
position, the positioner model creates new empty items for the GridView
until it reaches the cell of the drop position.

This broke because of connection slot invocation order: the connection
to QAbstractItemModel::rowsInserted in FolderModel constructor was
executed before the connection in positioner.
In turn that connection emitted move, which invoked move on Positioner,
which at this point thinks its still in the first rows insertion
transaction, because its slot has not been executed yet,
and m_beginInsertRowsCalled is still true, so there won't be a "correct"
new beginInsertRows called.
Make it a Queued connection to push it back.

In the same way, when dragging from a "last" position, the Positioner model
will remove all the trailing empty items. But it modified m_proxyToSource
(from which rowCount() depends) before calling beginRemoveRows, sending
the model into an inconsitent state and causing an assert. Make sure
that m_proxyToSource is touched only after beginRemoveRows.
Related: bug 466337

M  +18   -11   containments/desktop/plugins/folder/foldermodel.cpp
M  +11   -6    containments/desktop/plugins/folder/positioner.cpp

https://invent.kde.org/plasma/plasma-desktop/-/commit/e306c63ddbeaccea72a03fbb2c3dbd8245addef5
Comment 7 Dashon 2024-03-04 12:15:09 UTC
I seem to be once again having this issue on plasma 6. I'm using arch's testing repositories, so that may be the issue. Can anyone confirm that there haven't been any regressions?
Comment 8 Dashon 2024-03-04 12:17:05 UTC
Sorry, I didn't check the date. The solution was rather recent and most likely isn't in a current release yet. My apologies for reopening this.
Comment 9 Dashon 2024-03-06 18:33:10 UTC
It is fixed in  6.0.1, although I do see it briefly appear on the previous monitor before jumping to the monitor that you dragged it to. I'll file a different report for that though.
Comment 10 Dashon 2024-05-24 23:31:56 UTC
I'm beta testing plasma 6.1 on arch and currently this issue seems to have popped back up. If I add a file to the desktop and then drag it from one monitor to another. It once again enters the avoid only to be returned on reboot or possibly restarting plasmashell.
Comment 11 nethaven 2024-06-10 19:53:38 UTC
I can file a separate report if needed, but I think this might be related.
I am using Garuda KDE, X11 and Nvidia drivers/card (RTX 3060 12GB), AMD Ryzen 5.
If I create a launcher in the Application Launcher, then add it to the desktop, then edit that desktop launcher's icon, the icon disappears.  It reappears if I restart the machine (presumably the essential shell restart).
Comment 12 Dashon 2024-06-10 23:42:57 UTC
(In reply to nethaven from comment #11)
> I can file a separate report if needed, but I think this might be related.
> I am using Garuda KDE, X11 and Nvidia drivers/card (RTX 3060 12GB), AMD
> Ryzen 5.
> If I create a launcher in the Application Launcher, then add it to the
> desktop, then edit that desktop launcher's icon, the icon disappears.  It
> reappears if I restart the machine (presumably the essential shell restart).

I believe that is a different bug that has already been fixed. I recall seeing it mentioned in ThiWeekInKDE article.
Comment 13 Nate Graham 2024-06-12 15:20:25 UTC
Yup, a different bug, and already fixed in KIO IIRC
Comment 14 Bug Janitor Service 2024-06-17 12:26:46 UTC
A possibly relevant merge request was started @ https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/2316
Comment 15 David Edmundson 2024-06-17 13:37:42 UTC
Git commit 4da2346e42302349422cf7c45e64e838fb4d630f by David Edmundson.
Committed on 17/06/2024 at 12:44.
Pushed by davidedmundson into branch 'master'.

FolderView Positioner: fix dragging files across screens.

f0ede2d83731952012be0d43c77916d18617edb2 fixed a bug in which items
would disappear when dragging between screens. The rationale in the
description was correct. The fix there was to queue the connection of
rowsInserted so that we don't emit move signals before Positioner proxy
model has processed any pending rowsInserted signals.

This was incorrectly simplified in
99a3597285a92531efb09492421fac0a6a2e82dc . The important part isn't to
process it after FolderModel gets a source model set, but to process it
after Positioner gets the source model, which FolderView doesn't know
about and the original bug introduced.

Rather than a straight revert the code is adjusted to emit the move
signal delayed. This is safer than delaying the processing of a signal
with index arguments.
Related: bug 466337

M  +10   -4    containments/desktop/plugins/folder/foldermodel.cpp

https://invent.kde.org/plasma/plasma-desktop/-/commit/4da2346e42302349422cf7c45e64e838fb4d630f
Comment 16 Dashon 2024-06-17 13:39:10 UTC
(In reply to David Edmundson from comment #15)
> Git commit 4da2346e42302349422cf7c45e64e838fb4d630f by David Edmundson.
> Committed on 17/06/2024 at 12:44.
> Pushed by davidedmundson into branch 'master'.
> 
> FolderView Positioner: fix dragging files across screens.
> 
> f0ede2d83731952012be0d43c77916d18617edb2 fixed a bug in which items
> would disappear when dragging between screens. The rationale in the
> description was correct. The fix there was to queue the connection of
> rowsInserted so that we don't emit move signals before Positioner proxy
> model has processed any pending rowsInserted signals.
> 
> This was incorrectly simplified in
> 99a3597285a92531efb09492421fac0a6a2e82dc . The important part isn't to
> process it after FolderModel gets a source model set, but to process it
> after Positioner gets the source model, which FolderView doesn't know
> about and the original bug introduced.
> 
> Rather than a straight revert the code is adjusted to emit the move
> signal delayed. This is safer than delaying the processing of a signal
> with index arguments.
> Related: bug 466337
> 
> M  +10   -4    containments/desktop/plugins/folder/foldermodel.cpp
> 
> https://invent.kde.org/plasma/plasma-desktop/-/commit/
> 4da2346e42302349422cf7c45e64e838fb4d630f

Thanks David
Comment 17 David Edmundson 2024-06-17 13:45:44 UTC
Git commit 97794807a9a974ba32ee160665f0b69795888268 by David Edmundson, on behalf of David Edmundson.
Committed on 17/06/2024 at 13:38.
Pushed by davidedmundson into branch 'Plasma/6.1'.

FolderView Positioner: fix dragging files across screens.

f0ede2d83731952012be0d43c77916d18617edb2 fixed a bug in which items
would disappear when dragging between screens. The rationale in the
description was correct. The fix there was to queue the connection of
rowsInserted so that we don't emit move signals before Positioner proxy
model has processed any pending rowsInserted signals.

This was incorrectly simplified in
99a3597285a92531efb09492421fac0a6a2e82dc . The important part isn't to
process it after FolderModel gets a source model set, but to process it
after Positioner gets the source model, which FolderView doesn't know
about and the original bug introduced.

Rather than a straight revert the code is adjusted to emit the move
signal delayed. This is safer than delaying the processing of a signal
with index arguments.
Related: bug 466337


(cherry picked from commit 4da2346e42302349422cf7c45e64e838fb4d630f)

Co-authored-by: David Edmundson <kde@davidedmundson.co.uk>

M  +10   -4    containments/desktop/plugins/folder/foldermodel.cpp

https://invent.kde.org/plasma/plasma-desktop/-/commit/97794807a9a974ba32ee160665f0b69795888268