[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};