[multimedia/kdenlive/release/26.08] 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 80c9d243ea065d2bb550d79cf21463bbdf51f326 by Jean-Baptiste Mardelle.
Committed on 18/08/2026 at 16:42.
Pushed by mardelle into branch 'release/26.08'.

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/80c9d243ea065d2bb550d79cf21463bbdf51f326

diff --git a/src/monitor/monitor.cpp b/src/monitor/monitor.cpp
index b0ff4cca24..9b7d77206f 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();
     }
 }
 
@@ -3133,7 +3135,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 ec70542bcd..0e5f279e73 100644
--- a/src/timeline2/view/timelinecontroller.cpp
+++ b/src/timeline2/view/timelinecontroller.cpp
@@ -2583,9 +2583,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.