Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-02-20 11:52:49 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2014-02-20 11:52:49 +0400
commit4823bd14542ce1d4251a35bc055cb1a8e947d085 (patch)
tree7444a4f6085d2e88af7646dd7c3b1e7968d78e36
parent361fc09792f12b2efc164e5e4d16789f7659d871 (diff)
Fix crash when deleting strip used as mask in another strip modifier
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 92d8a0ae066..0a37496c88a 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -614,6 +614,26 @@ static Sequence *del_seq_find_replace_recurs(Scene *scene, Sequence *seq)
return seq;
}
+static void del_seq_clear_modifiers_recurs(Scene *scene, Sequence *deleting_sequence)
+{
+ Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
+ Sequence *current_sequence;
+
+ SEQP_BEGIN(ed, current_sequence)
+ {
+ if (!(current_sequence->flag & SELECT) && current_sequence != deleting_sequence) {
+ SequenceModifierData *smd;
+
+ for (smd = current_sequence->modifiers.first; smd; smd = smd->next) {
+ if (smd->mask_sequence == deleting_sequence) {
+ smd->mask_sequence = NULL;
+ }
+ }
+ }
+ }
+ SEQ_END
+}
+
static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short deleteall)
{
Sequence *seq, *seqn;
@@ -1746,10 +1766,17 @@ static int sequencer_delete_exec(bContext *C, wmOperator *UNUSED(op))
if (nothingSelected)
return OPERATOR_FINISHED;
- /* for effects, try to find a replacement input */
- for (seq = ed->seqbasep->first; seq; seq = seq->next)
- if ((seq->type & SEQ_TYPE_EFFECT) && !(seq->flag & SELECT))
- del_seq_find_replace_recurs(scene, seq);
+ /* for effects and modifiers, try to find a replacement input */
+ for (seq = ed->seqbasep->first; seq; seq = seq->next) {
+ if (!(seq->flag & SELECT)) {
+ if ((seq->type & SEQ_TYPE_EFFECT)) {
+ del_seq_find_replace_recurs(scene, seq);
+ }
+ }
+ else {
+ del_seq_clear_modifiers_recurs(scene, seq);
+ }
+ }
/* delete all selected strips */
recurs_del_seq_flag(scene, ed->seqbasep, SELECT, 0);