[multimedia/kdenlive] src: Fix crash on ripple edit with project monitor hidden

Jean-Baptiste Mardelle <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit adb7d27c5ee11d320827ebf9ed0ac5816c5e5a75 by Jean-Baptiste Mardelle.
Committed on 18/08/2026 at 16:29.
Pushed by mardelle into branch 'master'.

Fix crash on ripple edit with project monitor hidden
Replaces !955

M  +3    -1    src/monitor/monitor.cpp
M  +4    -4    src/timeline2/model/trackmodel.cpp
M  +5    -1    src/timeline2/view/timelinecontroller.cpp
M  +1    -0    src/timeline2/view/timelinecontroller.h

https://invent.kde.org/multimedia/kdenlive/-/commit/adb7d27c5ee11d320827ebf9ed0ac5816c5e5a75

diff --git a/src/monitor/monitor.cpp b/src/monitor/monitor.cpp
index c21f39fc16..8573236bf7 100644
--- a/src/monitor/monitor.cpp
+++ b/src/monitor/monitor.cpp
@@ -1866,6 +1866,8 @@ void Monitor::slotRefreshMonitor(bool visible)
         if (slotActivateMonitor()) {
             start();
         }
+    } else {
+        stop();
     }
 }
 
@@ -3126,7 +3128,7 @@ void Monitor::setProducer(const QUuid uuid, std::shared_ptr<Mlt::Producer> produ
         m_dirty = false;
         m_displayedUuid = uuid;
     }
-    m_glMonitor->setProducer(std::move(producer), isActive(), pos);
+    m_glMonitor->setProducer(std::move(producer), isActive() && isVisible(), pos);
 }
 
 void Monitor::reconfigure()
diff --git a/src/timeline2/model/trackmodel.cpp b/src/timeline2/model/trackmodel.cpp
index 36b61163d1..d01d643d13 100644
--- a/src/timeline2/model/trackmodel.cpp
+++ b/src/timeline2/model/trackmodel.cpp
@@ -438,10 +438,10 @@ Fun TrackModel::requestClipDeletion_lambda(int clipId, bool updateView, bool fin
             ptr->_endRemoveRows();
         }
         int target_clip = clip_loc.second;
-        // lock MLT playlist so that we don't end up with invalid frames in monitor
-        m_playlists[target_track].lock();
         std::unique_ptr<Mlt::Field> field(m_track->field());
         field->block();
+        // lock MLT playlist so that we don't end up with invalid frames in monitor
+        m_playlists[target_track].lock();
         Q_ASSERT(target_clip < m_playlists[target_track].count());
         Q_ASSERT(!m_playlists[target_track].is_blank(target_clip));
         auto prod = m_playlists[target_track].replace_with_blank(target_clip);
@@ -451,8 +451,8 @@ Fun TrackModel::requestClipDeletion_lambda(int clipId, bool updateView, bool fin
             // m_allClips[clipId]->setSubPlaylistIndex(-1);
             m_allClips.erase(clipId);
             delete prod;
-            field->unblock();
             m_playlists[target_track].unlock();
+            field->unblock();
             if (auto ptr = m_parent.lock()) {
                 ptr->m_snaps->removePoint(old_in);
                 ptr->m_snaps->removePoint(old_out);
@@ -474,8 +474,8 @@ Fun TrackModel::requestClipDeletion_lambda(int clipId, bool updateView, bool fin
             }
             return true;
         }
-        field->unblock();
         m_playlists[target_track].unlock();
+        field->unblock();
         return false;
     };
 }
diff --git a/src/timeline2/view/timelinecontroller.cpp b/src/timeline2/view/timelinecontroller.cpp
index 0284d92791..374b151582 100644
--- a/src/timeline2/view/timelinecontroller.cpp
+++ b/src/timeline2/view/timelinecontroller.cpp
@@ -2595,9 +2595,13 @@ int TimelineController::requestItemRippleResize(int itemId, int size, bool right
 void TimelineController::updateTrimmingMode()
 {
     if (trimmingActive()) {
-        requestStartTrimmingMode();
+        if (m_trimmingClip != getMainSelectedClip()) {
+            requestStartTrimmingMode();
+            m_trimmingClip = getMainSelectedClip();
+        }
     } else {
         requestEndTrimmingMode();
+        m_trimmingClip = -1;
     }
 }
 
diff --git a/src/timeline2/view/timelinecontroller.h b/src/timeline2/view/timelinecontroller.h
index da250d9c4d..a8ecc46268 100644
--- a/src/timeline2/view/timelinecontroller.h
+++ b/src/timeline2/view/timelinecontroller.h
@@ -831,6 +831,7 @@ private:
     int m_videoTarget;
     int m_audioRef{-1};
     int m_timecodeRef{-1};
+    int m_trimmingClip{-1};
     int m_timelineMouseOffset{0};
     int m_hasAudioTarget {0};
     bool m_hasVideoTarget {false};
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.