4 * Copyright (C) 1997-2014 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "automation.h"
25 #include "cplayback.h"
27 #include "cwindowgui.h"
30 #include "edlsession.h"
33 #include "localsession.h"
34 #include "maincursor.h"
36 #include "mainsession.h"
39 #include "mwindowgui.h"
41 #include "playbackengine.h"
43 #include "pluginset.h"
44 #include "resourcethread.h"
45 #include "samplescroll.h"
47 #include "trackcanvas.h"
50 #include "transportque.h"
54 void MWindow::update_plugins()
56 // Show plugins which are visible and hide plugins which aren't
57 // Update plugin pointers in plugin servers
61 int MWindow::expand_sample()
65 if(edl->local_session->zoom_sample < 0x100000)
67 edl->local_session->zoom_sample *= 2;
68 gui->zoombar->sample_zoom->update(edl->local_session->zoom_sample);
69 zoom_sample(edl->local_session->zoom_sample);
75 int MWindow::zoom_in_sample()
79 if(edl->local_session->zoom_sample > 1)
81 edl->local_session->zoom_sample /= 2;
82 gui->zoombar->sample_zoom->update(edl->local_session->zoom_sample);
83 zoom_sample(edl->local_session->zoom_sample);
89 int MWindow::zoom_sample(int64_t zoom_sample)
91 CLAMP(zoom_sample, 1, 0x100000);
92 edl->local_session->zoom_sample = zoom_sample;
95 TimelinePane *pane = gui->get_focused_pane();
96 samplemovement(edl->local_session->view_start[pane->number], pane->number);
100 void MWindow::find_cursor()
102 TimelinePane *pane = gui->get_focused_pane();
103 edl->local_session->view_start[pane->number] =
104 Units::round((edl->local_session->get_selectionend(1) +
105 edl->local_session->get_selectionstart(1)) /
107 edl->session->sample_rate /
108 edl->local_session->zoom_sample -
109 (double)pane->canvas->get_w() /
112 if(edl->local_session->view_start[pane->number] < 0)
113 edl->local_session->view_start[pane->number] = 0;
117 void MWindow::fit_selection()
119 if(EQUIV(edl->local_session->get_selectionstart(1),
120 edl->local_session->get_selectionend(1)))
122 double total_samples = edl->tracks->total_length() *
123 edl->session->sample_rate;
124 TimelinePane *pane = gui->get_focused_pane();
125 for(edl->local_session->zoom_sample = 1;
126 pane->canvas->get_w() * edl->local_session->zoom_sample < total_samples;
127 edl->local_session->zoom_sample *= 2)
132 double total_samples = (edl->local_session->get_selectionend(1) -
133 edl->local_session->get_selectionstart(1)) *
134 edl->session->sample_rate;
135 TimelinePane *pane = gui->get_focused_pane();
136 for(edl->local_session->zoom_sample = 1;
137 pane->canvas->get_w() * edl->local_session->zoom_sample < total_samples;
138 edl->local_session->zoom_sample *= 2)
142 edl->local_session->zoom_sample = MIN(0x100000,
143 edl->local_session->zoom_sample);
144 zoom_sample(edl->local_session->zoom_sample);
148 void MWindow::fit_autos(int all)
150 float min = 0, max = 0;
154 if(EQUIV(edl->local_session->get_selectionstart(1),
155 edl->local_session->get_selectionend(1)))
158 end = edl->tracks->total_length();
161 // Test autos in highlighting only
163 start = edl->local_session->get_selectionstart(1);
164 end = edl->local_session->get_selectionend(1);
167 int forstart = edl->local_session->zoombar_showautotype;
168 int forend = edl->local_session->zoombar_showautotype + 1;
172 forend = AUTOGROUPTYPE_COUNT;
175 for (int i = forstart; i < forend; i++)
177 // Adjust min and max
178 edl->tracks->get_automation_extents(&min, &max, start, end, i);
179 //printf("MWindow::fit_autos %d %f %f results in ", i, min, max);
181 float range = max - min;
184 case AUTOGROUPTYPE_AUDIO_FADE:
186 min = MIN(min, edl->local_session->automation_mins[i]);
187 max = MAX(max, edl->local_session->automation_maxs[i]);
188 if( min >= max-0.1 ) { min = -80.0; min = 6.0; }
191 case AUTOGROUPTYPE_VIDEO_FADE:
193 min = MIN(min, edl->local_session->automation_mins[i]);
194 max = MAX(max, edl->local_session->automation_maxs[i]);
195 if( min >= max-0.1 ) { min = 0.0; min = 100.0; }
198 case AUTOGROUPTYPE_ZOOM:
200 min = floor(min*50)/100;
201 max = floor(max*200)/100;
204 case AUTOGROUPTYPE_SPEED:
206 min = floor(min*5)/100;
207 max = floor(max*300)/100;
210 case AUTOGROUPTYPE_X:
211 case AUTOGROUPTYPE_Y:
213 float scale = bmin(edl->session->output_w, edl->session->output_h);
214 min = floor((min+max)/2) - 0.5*scale;
215 max = floor((min+max)/2) + 0.5*scale;
219 //printf("%f %f\n", min, max);
220 if (!Automation::autogrouptypes_fixedrange[i])
222 edl->local_session->automation_mins[i] = min;
223 edl->local_session->automation_maxs[i] = max;
227 // Show range in zoombar
228 gui->zoombar->update();
231 gui->draw_overlays(1);
235 void MWindow::change_currentautorange(int autogrouptype, int increment, int changemax)
239 val = edl->local_session->automation_maxs[autogrouptype];
241 val = edl->local_session->automation_mins[autogrouptype];
246 switch (autogrouptype) {
247 case AUTOGROUPTYPE_AUDIO_FADE:
250 case AUTOGROUPTYPE_VIDEO_FADE:
253 case AUTOGROUPTYPE_ZOOM:
254 case AUTOGROUPTYPE_SPEED:
260 case AUTOGROUPTYPE_X:
261 case AUTOGROUPTYPE_Y:
262 val = floor(val + 5);
268 switch (autogrouptype) {
269 case AUTOGROUPTYPE_AUDIO_FADE:
272 case AUTOGROUPTYPE_VIDEO_FADE:
275 case AUTOGROUPTYPE_ZOOM:
276 case AUTOGROUPTYPE_SPEED:
277 if (val > 0) val = val/2;
279 case AUTOGROUPTYPE_X:
280 case AUTOGROUPTYPE_Y:
286 AUTOMATIONVIEWCLAMPS(val, autogrouptype);
289 if (val > edl->local_session->automation_mins[autogrouptype])
290 edl->local_session->automation_maxs[autogrouptype] = val;
294 if (val < edl->local_session->automation_maxs[autogrouptype])
295 edl->local_session->automation_mins[autogrouptype] = val;
300 void MWindow::expand_autos(int changeall, int domin, int domax)
303 for (int i = 0; i < AUTOGROUPTYPE_COUNT; i++) {
304 if (domin) change_currentautorange(i, 1, 0);
305 if (domax) change_currentautorange(i, 1, 1);
309 if (domin) change_currentautorange(edl->local_session->zoombar_showautotype, 1, 0);
310 if (domax) change_currentautorange(edl->local_session->zoombar_showautotype, 1, 1);
312 gui->zoombar->update_autozoom();
313 gui->draw_overlays(0);
314 gui->update_patchbay();
315 gui->flash_canvas(1);
318 void MWindow::shrink_autos(int changeall, int domin, int domax)
321 for (int i = 0; i < AUTOGROUPTYPE_COUNT; i++) {
322 if (domin) change_currentautorange(i, 0, 0);
323 if (domax) change_currentautorange(i, 0, 1);
327 if (domin) change_currentautorange(edl->local_session->zoombar_showautotype, 0, 0);
328 if (domax) change_currentautorange(edl->local_session->zoombar_showautotype, 0, 1);
330 gui->zoombar->update_autozoom();
331 gui->draw_overlays(0);
332 gui->update_patchbay();
333 gui->flash_canvas(1);
337 void MWindow::zoom_autos(float min, float max)
339 int i = edl->local_session->zoombar_showautotype;
340 edl->local_session->automation_mins[i] = min;
341 edl->local_session->automation_maxs[i] = max;
342 gui->zoombar->update_autozoom();
343 gui->draw_overlays(1);
347 void MWindow::zoom_amp(int64_t zoom_amp)
349 edl->local_session->zoom_y = zoom_amp;
350 gui->draw_canvas(0, 0);
351 gui->flash_canvas(0);
352 gui->update_patchbay();
356 void MWindow::zoom_atrack(int64_t zoom)
358 int64_t old_zoom = edl->local_session->zoom_atrack;
359 CLAMP(zoom, MIN_TRACK_ZOOM, MAX_TRACK_ZOOM);
360 edl->local_session->zoom_atrack = zoom;
362 edl->local_session->zoom_atrack = zoom;
363 for( Track *track= edl->tracks->first; track; track=track->next ) {
364 if( track->data_type != TRACK_AUDIO ) continue;
365 track->data_h = zoom;
367 // shift row position
368 for( int i=0; i<TOTAL_PANES; ++i ) edl->local_session->track_start[i] =
369 (edl->local_session->track_start[i] * zoom) / old_zoom;
370 edl->tracks->update_y_pixels(theme);
371 gui->draw_trackmovement();
374 void MWindow::zoom_vtrack(int64_t zoom)
376 int64_t old_zoom = edl->local_session->zoom_vtrack;
377 CLAMP(zoom, MIN_TRACK_ZOOM, MAX_TRACK_ZOOM);
378 edl->local_session->zoom_vtrack = zoom;
380 for( Track *track= edl->tracks->first; track; track=track->next ) {
381 if( track->data_type != TRACK_VIDEO ) continue;
382 track->data_h = zoom;
384 // shift row position
385 for( int i=0; i<TOTAL_PANES; ++i ) edl->local_session->track_start[i] =
386 (edl->local_session->track_start[i] * zoom) / old_zoom;
387 edl->tracks->update_y_pixels(theme);
388 gui->draw_trackmovement();
391 void MWindow::trackmovement(int offset, int pane_number)
393 edl->local_session->track_start[pane_number] += offset;
394 if(edl->local_session->track_start[pane_number] < 0)
395 edl->local_session->track_start[pane_number] = 0;
397 if(pane_number == TOP_RIGHT_PANE ||
398 pane_number == TOP_LEFT_PANE)
400 edl->local_session->track_start[TOP_LEFT_PANE] =
401 edl->local_session->track_start[TOP_RIGHT_PANE] =
402 edl->local_session->track_start[pane_number];
405 if(pane_number == BOTTOM_RIGHT_PANE ||
406 pane_number == BOTTOM_LEFT_PANE)
408 edl->local_session->track_start[BOTTOM_LEFT_PANE] =
409 edl->local_session->track_start[BOTTOM_RIGHT_PANE] =
410 edl->local_session->track_start[pane_number];
414 edl->tracks->update_y_pixels(theme);
415 gui->draw_trackmovement();
418 void MWindow::move_up(int64_t distance)
420 TimelinePane *pane = gui->get_focused_pane();
421 if(distance == 0) distance = pane->canvas->get_h() / 10;
422 trackmovement(-distance, pane->number);
425 void MWindow::move_down(int64_t distance)
427 TimelinePane *pane = gui->get_focused_pane();
428 if(distance == 0) distance = pane->canvas->get_h() / 10;
429 trackmovement(distance, pane->number);
432 int MWindow::goto_end()
434 TimelinePane *pane = gui->get_focused_pane();
435 int64_t old_view_start = edl->local_session->view_start[pane->number];
437 if( edl->tracks->total_length() > (double)pane->canvas->get_w() *
438 edl->local_session->zoom_sample / edl->session->sample_rate ) {
439 edl->local_session->view_start[pane->number] =
440 Units::round(edl->tracks->total_length() *
441 edl->session->sample_rate /
442 edl->local_session->zoom_sample -
443 pane->canvas->get_w() /
448 edl->local_session->view_start[pane->number] = 0;
451 if(gui->shift_down())
453 edl->local_session->set_selectionend(edl->tracks->total_length());
457 edl->local_session->set_selectionstart(edl->tracks->total_length());
458 edl->local_session->set_selectionend(edl->tracks->total_length());
461 if(edl->local_session->view_start[pane->number] != old_view_start)
463 samplemovement(edl->local_session->view_start[pane->number], pane->number);
464 gui->draw_samplemovement();
467 update_plugin_guis();
469 gui->update_patchbay();
470 gui->update_cursor();
471 gui->activate_timeline();
472 gui->zoombar->update();
473 gui->update_timebar(1);
474 cwindow->update(1, 0, 0, 0, 1);
478 int MWindow::goto_start()
480 TimelinePane *pane = gui->get_focused_pane();
481 int64_t old_view_start = edl->local_session->view_start[pane->number];
483 edl->local_session->view_start[pane->number] = 0;
484 if(gui->shift_down())
486 edl->local_session->set_selectionstart(0);
490 edl->local_session->set_selectionstart(0);
491 edl->local_session->set_selectionend(0);
494 if(edl->local_session->view_start[pane->number] != old_view_start)
496 samplemovement(edl->local_session->view_start[pane->number], pane->number);
497 gui->draw_samplemovement();
500 update_plugin_guis();
501 gui->update_patchbay();
502 gui->update_cursor();
503 gui->activate_timeline();
504 gui->zoombar->update();
505 gui->update_timebar(1);
506 cwindow->update(1, 0, 0, 0, 1);
510 int MWindow::goto_position(double position)
512 position = edl->align_to_frame(position, 0);
513 if( position < 0 ) position = 0;
514 select_point(position);
515 gui->activate_timeline();
519 int MWindow::samplemovement(int64_t view_start, int pane_number)
521 if( view_start < 0 ) view_start = 0;
522 edl->local_session->view_start[pane_number] = view_start;
523 if(edl->local_session->view_start[pane_number] < 0)
524 edl->local_session->view_start[pane_number] = 0;
526 if(pane_number == TOP_LEFT_PANE ||
527 pane_number == BOTTOM_LEFT_PANE)
529 edl->local_session->view_start[TOP_LEFT_PANE] =
530 edl->local_session->view_start[BOTTOM_LEFT_PANE] =
531 edl->local_session->view_start[pane_number];
535 edl->local_session->view_start[TOP_RIGHT_PANE] =
536 edl->local_session->view_start[BOTTOM_RIGHT_PANE] =
537 edl->local_session->view_start[pane_number];
540 gui->draw_samplemovement();
545 int MWindow::move_left(int64_t distance)
547 TimelinePane *pane = gui->get_focused_pane();
549 distance = pane->canvas->get_w() / 10;
550 edl->local_session->view_start[pane->number] -= distance;
551 samplemovement(edl->local_session->view_start[pane->number],
556 int MWindow::move_right(int64_t distance)
558 TimelinePane *pane = gui->get_focused_pane();
560 distance = pane->canvas->get_w() / 10;
561 edl->local_session->view_start[pane->number] += distance;
562 samplemovement(edl->local_session->view_start[pane->number],
567 void MWindow::select_all()
569 if( edl->local_session->get_selectionstart(1) == 0 &&
570 edl->local_session->get_selectionend(1) == edl->tracks->total_length() )
571 edl->local_session->set_selectionend(0);
573 edl->local_session->set_selectionstart(0);
574 edl->local_session->set_selectionend(edl->tracks->total_length());
576 gui->update(0, NORMAL_DRAW, 1, 1, 0, 1, 0);
577 gui->activate_timeline();
578 cwindow->update(1, 0, 0, 0, 1);
579 update_plugin_guis();
582 int MWindow::next_label(int shift_down)
584 double position = edl->local_session->get_selectionend(1);
585 double total_length = edl->tracks->total_length();
586 Label *current = edl->labels->next_label(position);
587 double new_position = current ? current->position : total_length;
588 // last playback endpoints as fake label positions
589 double playback_start = edl->local_session->playback_start;
590 double playback_end = edl->local_session->playback_end;
591 if( playback_start > position && playback_start < new_position )
592 new_position = playback_start;
593 else if( playback_end > position && playback_end < new_position )
594 new_position = playback_end;
595 if( new_position > total_length )
596 new_position = total_length;
597 edl->local_session->set_selectionend(new_position);
598 //printf("MWindow::next_edit_handle %d\n", shift_down);
600 edl->local_session->set_selectionstart(new_position);
601 return find_selection(new_position);
604 int MWindow::prev_label(int shift_down)
606 double position = edl->local_session->get_selectionstart(1);
607 Label *current = edl->labels->prev_label(position);
608 double new_position = current ? current->position : 0;
609 // last playback endpoints as fake label positions
610 double playback_start = edl->local_session->playback_start;
611 double playback_end = edl->local_session->playback_end;
612 if( playback_end < position && playback_end > new_position )
613 new_position = playback_end;
614 else if( playback_start < position && playback_start > new_position )
615 new_position = playback_start;
616 if( new_position < 0 )
618 edl->local_session->set_selectionstart(new_position);
619 //printf("MWindow::next_edit_handle %d\n", shift_down);
621 edl->local_session->set_selectionend(new_position);
622 return find_selection(new_position);
625 int MWindow::next_edit_handle(int shift_down)
627 double position = edl->local_session->get_selectionend(1);
628 double new_position = edl->next_edit(position);
629 double total_length = edl->tracks->total_length();
630 if( new_position >= total_length )
631 new_position = total_length;
632 edl->local_session->set_selectionend(new_position);
633 //printf("MWindow::next_edit_handle %d\n", shift_down);
635 edl->local_session->set_selectionstart(new_position);
636 return find_selection(new_position);
639 int MWindow::prev_edit_handle(int shift_down)
641 double position = edl->local_session->get_selectionstart(1);
642 double new_position = edl->prev_edit(position);
643 if( new_position < 0 )
645 edl->local_session->set_selectionstart(new_position);
647 edl->local_session->set_selectionend(new_position);
648 return find_selection(new_position);
651 int MWindow::nearest_plugin_keyframe(int shift_down, int dir)
653 KeyFrame *keyframe = 0;
654 double start = edl->local_session->get_selectionstart(1);
655 double end = edl->local_session->get_selectionend(1);
656 double position = dir == PLAY_FORWARD ? end : start;
657 double new_position = dir == PLAY_FORWARD ? start : end;
658 for( Track *track=edl->tracks->first; track; track=track->next ) {
659 if( !track->is_armed() ) continue;
660 for( int i=0; i<track->plugin_set.size(); ++i ) {
661 PluginSet *plugin_set = track->plugin_set[i];
662 int64_t pos = track->to_units(position, 0);
663 KeyFrame *key = plugin_set->nearest_keyframe(pos, dir);
665 double key_position = track->from_units(key->position);
666 if( keyframe && (dir == PLAY_FORWARD ?
667 key_position >= new_position :
668 new_position >= key_position ) ) continue;
669 keyframe = key; new_position = key_position;
673 new_position = keyframe ?
674 keyframe->autos->track->from_units(keyframe->position) :
675 dir == PLAY_FORWARD ? edl->tracks->total_length() : 0;
678 start = end = new_position;
679 else if( dir == PLAY_FORWARD )
682 start = new_position;
684 edl->local_session->set_selectionstart(start);
685 edl->local_session->set_selectionend(end);
686 return find_selection(new_position);
689 int MWindow::nearest_auto_keyframe(int shift_down, int dir)
692 double start = edl->local_session->get_selectionstart(1);
693 double end = edl->local_session->get_selectionend(1);
694 double position = dir == PLAY_FORWARD ? end : start;
695 double new_position = dir == PLAY_FORWARD ? start : end;
696 for( Track *track=edl->tracks->first; track; track=track->next ) {
697 if( !track->is_armed() ) continue;
698 int64_t pos = track->to_units(position, 0);
699 for( int i=0; i<AUTOMATION_TOTAL; ++i ) {
700 Autos *autos = track->automation->autos[i];
701 if( !autos ) continue;
702 Auto *key = dir == PLAY_FORWARD ?
703 autos->nearest_after(pos) :
704 autos->nearest_before(pos);
706 double key_position = track->from_units(key->position);
707 if( keyframe && (dir == PLAY_FORWARD ?
708 key_position >= new_position :
709 new_position >= key_position ) ) continue;
710 keyframe = key; new_position = key_position;
714 new_position = keyframe ?
715 keyframe->autos->track->from_units(keyframe->position) :
716 dir == PLAY_FORWARD ? edl->tracks->total_length() : 0;
719 start = end = new_position;
720 else if( dir == PLAY_FORWARD )
723 start = new_position;
725 edl->local_session->set_selectionstart(start);
726 edl->local_session->set_selectionend(end);
727 return find_selection(new_position);
730 int MWindow::find_selection(double position, int scroll_display)
732 update_plugin_guis();
733 TimelinePane *pane = gui->get_focused_pane();
734 double pixel_zoom = (double)edl->session->sample_rate / edl->local_session->zoom_sample;
735 if( !scroll_display ) {
736 double timeline_start = edl->local_session->view_start[pane->number] / pixel_zoom;
737 double timeline_end = timeline_start + pane->canvas->time_visible();
738 if( position >= timeline_end || position < timeline_start )
741 if( scroll_display ) {
742 samplemovement((int64_t)(position * pixel_zoom - pane->canvas->get_w() / 2), pane->number);
743 cwindow->update(1, 0, 0, 0, 0);
746 gui->update_patchbay();
747 gui->update_timebar(0);
750 gui->zoombar->update();
751 gui->flash_canvas(1);
752 cwindow->update(1, 0, 0, 0, 1);
757 double MWindow::get_position()
759 return edl->local_session->get_selectionstart(1);
762 void MWindow::set_position(double position)
764 if( position != get_position() ) {
765 if( position < 0 ) position = 0;
766 edl->local_session->set_selectionstart(position);
767 edl->local_session->set_selectionend(position);
770 gui->update(1, NORMAL_DRAW, 1, 1, 1, 1, 0);
771 gui->unlock_window();
772 cwindow->update(1, 0, 0, 0, 0);
777 double MWindow::get_timecode_offset()
779 return edl->session->timecode_offset;
782 void MWindow::set_timecode_offset(double offset)
784 edl->session->time_format = TIME_TIMECODE;
785 edl->session->timecode_offset = offset;
787 gui->update(1, NORMAL_DRAW, 1, 1, 1, 1, 0);
788 gui->unlock_window();
789 cwindow->update(1, 0, 0, 0, 0);
793 int MWindow::expand_y()
795 int result = edl->local_session->zoom_y * 2;
796 result = MIN(result, MAX_AMP_ZOOM);
798 gui->zoombar->update();
802 int MWindow::zoom_in_y()
804 int result = edl->local_session->zoom_y / 2;
805 result = MAX(result, MIN_AMP_ZOOM);
807 gui->zoombar->update();
811 int MWindow::expand_t()
813 int zoom = edl->local_session->zoom_atrack * 2;
814 zoom = MIN(zoom, MAX_TRACK_ZOOM);
816 zoom = edl->local_session->zoom_vtrack * 2;
817 zoom = MIN(zoom, MAX_TRACK_ZOOM);
819 gui->zoombar->update();
823 int MWindow::zoom_in_t()
825 int zoom = edl->local_session->zoom_atrack / 2;
826 zoom = MAX(zoom, MIN_TRACK_ZOOM);
828 zoom = edl->local_session->zoom_vtrack / 2;
829 zoom = MAX(zoom, MIN_TRACK_ZOOM);
831 gui->zoombar->update();
835 void MWindow::split_x()
837 gui->resource_thread->stop_draw(1);
839 if(gui->pane[TOP_RIGHT_PANE])
841 gui->delete_x_pane(theme->mcanvas_w);
842 edl->local_session->x_pane = -1;
846 gui->create_x_pane(theme->mcanvas_w / 2);
847 edl->local_session->x_pane = theme->mcanvas_w / 2;
850 gui->mainmenu->update_toggles(0);
851 gui->update_pane_dividers();
852 gui->update_cursor();
853 gui->draw_samplemovement();
854 // required to get new widgets to appear
857 gui->resource_thread->start_draw();
860 void MWindow::split_y()
862 gui->resource_thread->stop_draw(1);
863 if(gui->pane[BOTTOM_LEFT_PANE])
865 gui->delete_y_pane(theme->mcanvas_h);
866 edl->local_session->y_pane = -1;
870 gui->create_y_pane(theme->mcanvas_h / 2);
871 edl->local_session->y_pane = theme->mcanvas_h / 2;
874 gui->mainmenu->update_toggles(0);
875 gui->update_pane_dividers();
876 gui->update_cursor();
877 gui->draw_trackmovement();
878 // required to get new widgets to appear
880 gui->resource_thread->start_draw();