clip fixes, ladspa build fixes
[goodguy/history.git] / cinelerra-5.1 / cinelerra / vwindowgui.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 1997-2011 Adam Williams <broadcast at earthling dot net>
5  *
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.
10  *
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.
15  *
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
19  *
20  */
21
22 #include "asset.h"
23 #include "assets.h"
24 #include "awindowgui.h"
25 #include "awindow.h"
26 #include "canvas.h"
27 #include "clip.h"
28 #include "clipedit.h"
29 #include "edl.h"
30 #include "edlsession.h"
31 #include "filesystem.h"
32 #include "filexml.h"
33 #include "fonts.h"
34 #include "keys.h"
35 #include "labels.h"
36 #include "language.h"
37 #include "localsession.h"
38 #include "mainclock.h"
39 #include "mainmenu.h"
40 #include "mainsession.h"
41 #include "mainundo.h"
42 #include "meterpanel.h"
43 #include "mwindowgui.h"
44 #include "mwindow.h"
45 #include "playtransport.h"
46 #include "preferences.h"
47 #include "theme.h"
48 #include "timebar.h"
49 #include "tracks.h"
50 #include "vframe.h"
51 #include "vplayback.h"
52 #include "vtimebar.h"
53 #include "vwindowgui.h"
54 #include "vwindow.h"
55
56
57
58
59 VWindowGUI::VWindowGUI(MWindow *mwindow, VWindow *vwindow)
60  : BC_Window(_(PROGRAM_NAME ": Viewer"),
61         mwindow->session->vwindow_x,
62         mwindow->session->vwindow_y,
63         mwindow->session->vwindow_w,
64         mwindow->session->vwindow_h,
65         100,
66         100,
67         1,
68         1,
69         0) // Hide it
70 {
71         this->mwindow = mwindow;
72         this->vwindow = vwindow;
73         canvas = 0;
74         transport = 0;
75         edit_panel = 0;
76         meters = 0;
77 //      source = 0;
78         strcpy(loaded_title, "");
79         highlighted = 0;
80 }
81
82 VWindowGUI::~VWindowGUI()
83 {
84         vwindow->playback_engine->interrupt_playback(1);
85         sources.remove_all_objects();
86         labels.remove_all_objects();
87         delete canvas;
88         delete transport;
89         delete edit_panel;
90         delete meters;
91 //      delete source;
92 }
93
94 void VWindowGUI::change_source(EDL *edl, const char *title)
95 {
96 //printf("VWindowGUI::change_source %d\n", __LINE__);
97
98         update_sources(title);
99         strcpy(loaded_title, title);
100         char string[BCTEXTLEN];
101         if(title[0])
102                 sprintf(string, _(PROGRAM_NAME ": %s"), title);
103         else
104                 sprintf(string, _(PROGRAM_NAME ": Viewer"));
105
106         lock_window("VWindowGUI::change_source");
107         timebar->update(0);
108         set_title(string);
109         unlock_window();
110 }
111
112
113 // Get source list from master EDL
114 void VWindowGUI::update_sources(const char *title)
115 {
116         lock_window("VWindowGUI::update_sources");
117
118 //printf("VWindowGUI::update_sources 1\n");
119         sources.remove_all_objects();
120 //printf("VWindowGUI::update_sources 2\n");
121
122
123
124         for(int i = 0;
125                 i < mwindow->edl->clips.total;
126                 i++)
127         {
128                 char *clip_title = mwindow->edl->clips.values[i]->local_session->clip_title;
129                 int exists = 0;
130
131                 for(int j = 0; j < sources.total; j++)
132                 {
133                         if(!strcasecmp(sources.values[j]->get_text(), clip_title))
134                         {
135                                 exists = 1;
136                         }
137                 }
138
139                 if(!exists)
140                 {
141                         sources.append(new BC_ListBoxItem(clip_title));
142                 }
143         }
144 //printf("VWindowGUI::update_sources 3\n");
145
146         FileSystem fs;
147         for(Asset *current = mwindow->edl->assets->first;
148                 current;
149                 current = NEXT)
150         {
151                 char clip_title[BCTEXTLEN];
152                 fs.extract_name(clip_title, current->path);
153                 int exists = 0;
154
155                 for(int j = 0; j < sources.total; j++)
156                 {
157                         if(!strcasecmp(sources.values[j]->get_text(), clip_title))
158                         {
159                                 exists = 1;
160                         }
161                 }
162
163                 if(!exists)
164                 {
165                         sources.append(new BC_ListBoxItem(clip_title));
166                 }
167         }
168
169 //printf("VWindowGUI::update_sources 4\n");
170
171 //      source->update_list(&sources);
172 //      source->update(title);
173         unlock_window();
174 }
175
176 void VWindowGUI::create_objects()
177 {
178         in_point = 0;
179         out_point = 0;
180         lock_window("VWindowGUI::create_objects");
181         set_icon(mwindow->theme->get_image("vwindow_icon"));
182
183 //printf("VWindowGUI::create_objects 1\n");
184         mwindow->theme->get_vwindow_sizes(this);
185         mwindow->theme->draw_vwindow_bg(this);
186         flash(0);
187
188         meters = new VWindowMeters(mwindow,
189                 this,
190                 mwindow->theme->vmeter_x,
191                 mwindow->theme->vmeter_y,
192                 mwindow->theme->vmeter_h);
193         meters->create_objects();
194
195 //printf("VWindowGUI::create_objects 1\n");
196 // Requires meters to build
197         edit_panel = new VWindowEditing(mwindow, vwindow);
198         edit_panel->set_meters(meters);
199         edit_panel->create_objects();
200
201 //printf("VWindowGUI::create_objects 1\n");
202         transport = new VWindowTransport(mwindow,
203                 this,
204                 mwindow->theme->vtransport_x,
205                 mwindow->theme->vtransport_y);
206         transport->create_objects();
207
208 //printf("VWindowGUI::create_objects 1\n");
209 //      add_subwindow(fps_title = new BC_Title(mwindow->theme->vedit_x, y, ""));
210     add_subwindow(clock = new MainClock(mwindow,
211                 mwindow->theme->vtime_x,
212                 mwindow->theme->vtime_y,
213                 mwindow->theme->vtime_w));
214
215         canvas = new VWindowCanvas(mwindow, this);
216         canvas->create_objects(mwindow->edl);
217         canvas->use_vwindow();
218
219
220 //printf("VWindowGUI::create_objects 1\n");
221         add_subwindow(timebar = new VTimeBar(mwindow,
222                 this,
223                 mwindow->theme->vtimebar_x,
224                 mwindow->theme->vtimebar_y,
225                 mwindow->theme->vtimebar_w,
226                 mwindow->theme->vtimebar_h));
227         timebar->create_objects();
228 //printf("VWindowGUI::create_objects 2\n");
229
230
231 //printf("VWindowGUI::create_objects 1\n");
232 //      source = new VWindowSource(mwindow,
233 //              this,
234 //              mwindow->theme->vsource_x,
235 //              mwindow->theme->vsource_y);
236 //      source->create_objects();
237         update_sources(_("None"));
238
239 //printf("VWindowGUI::create_objects 2\n");
240         deactivate();
241
242         show_window();
243         unlock_window();
244 }
245
246 int VWindowGUI::resize_event(int w, int h)
247 {
248         mwindow->session->vwindow_x = get_x();
249         mwindow->session->vwindow_y = get_y();
250         mwindow->session->vwindow_w = w;
251         mwindow->session->vwindow_h = h;
252
253         mwindow->theme->get_vwindow_sizes(this);
254         mwindow->theme->draw_vwindow_bg(this);
255         flash(0);
256
257 //printf("VWindowGUI::resize_event %d %d\n", __LINE__, mwindow->theme->vedit_y);
258         edit_panel->reposition_buttons(mwindow->theme->vedit_x,
259                 mwindow->theme->vedit_y);
260
261         timebar->resize_event();
262         transport->reposition_buttons(mwindow->theme->vtransport_x,
263                 mwindow->theme->vtransport_y);
264         clock->reposition_window(mwindow->theme->vtime_x,
265                 mwindow->theme->vtime_y,
266                 mwindow->theme->vtime_w,
267                 clock->get_h());
268         canvas->reposition_window(0,
269                 mwindow->theme->vcanvas_x,
270                 mwindow->theme->vcanvas_y,
271                 mwindow->theme->vcanvas_w,
272                 mwindow->theme->vcanvas_h);
273 //printf("VWindowGUI::resize_event %d %d\n", __LINE__, mwindow->theme->vcanvas_x);
274 //      source->reposition_window(mwindow->theme->vsource_x,
275 //              mwindow->theme->vsource_y);
276         meters->reposition_window(mwindow->theme->vmeter_x,
277                 mwindow->theme->vmeter_y,
278                 -1,
279                 mwindow->theme->vmeter_h);
280
281         BC_WindowBase::resize_event(w, h);
282         return 1;
283 }
284
285
286
287
288
289 int VWindowGUI::translation_event()
290 {
291         mwindow->session->vwindow_x = get_x();
292         mwindow->session->vwindow_y = get_y();
293         return 0;
294 }
295
296 int VWindowGUI::close_event()
297 {
298         hide_window();
299         int i = mwindow->vwindows.size();
300         while( --i >= 0 && mwindow->vwindows.get(i)->gui != this );
301         if( i > 0 ) {
302                 set_done(0);
303                 return 1;
304         }
305
306         mwindow->session->show_vwindow = 0;
307         unlock_window();
308
309         mwindow->gui->lock_window("VWindowGUI::close_event");
310         mwindow->gui->mainmenu->show_vwindow->set_checked(0);
311         mwindow->gui->unlock_window();
312
313         lock_window("VWindowGUI::close_event");
314         mwindow->save_defaults();
315         return 1;
316 }
317
318 int VWindowGUI::keypress_event()
319 {
320         int result = 0;
321         switch(get_keypress())
322         {
323                 case 'w':
324                 case 'W':
325                         close_event();
326                         result = 1;
327                         break;
328                 case 'z':
329                         mwindow->undo_entry(this);
330                         break;
331                 case 'Z':
332                         mwindow->redo_entry(this);
333                         break;
334                 case 'f':
335                         unlock_window();
336                         if(mwindow->session->vwindow_fullscreen)
337                                 canvas->stop_fullscreen();
338                         else
339                                 canvas->start_fullscreen();
340                         lock_window("VWindowGUI::keypress_event 1");
341                         break;
342                 case ESC:
343                         unlock_window();
344                         if(mwindow->session->vwindow_fullscreen)
345                                 canvas->stop_fullscreen();
346                         lock_window("VWindowGUI::keypress_event 2");
347                         break;
348         }
349         if(!result) result = transport->keypress_event();
350
351         return result;
352 }
353
354 int VWindowGUI::button_press_event()
355 {
356         if(canvas->get_canvas())
357                 return canvas->button_press_event_base(canvas->get_canvas());
358         return 0;
359 }
360
361 int VWindowGUI::cursor_leave_event()
362 {
363         if(canvas->get_canvas())
364                 return canvas->cursor_leave_event_base(canvas->get_canvas());
365         return 0;
366 }
367
368 int VWindowGUI::cursor_enter_event()
369 {
370         if(canvas->get_canvas())
371                 return canvas->cursor_enter_event_base(canvas->get_canvas());
372         return 0;
373 }
374
375 int VWindowGUI::button_release_event()
376 {
377         if(canvas->get_canvas())
378                 return canvas->button_release_event();
379         return 0;
380 }
381
382 int VWindowGUI::cursor_motion_event()
383 {
384         if(canvas->get_canvas())
385         {
386                 canvas->get_canvas()->unhide_cursor();
387                 return canvas->cursor_motion_event();
388         }
389         return 0;
390 }
391
392
393 void VWindowGUI::drag_motion()
394 {
395 // Window hidden
396         if(get_hidden()) return;
397         if(mwindow->session->current_operation != DRAG_ASSET) return;
398         int need_highlight = cursor_above() && get_cursor_over_window() ? 1 : 0;
399         if( highlighted == need_highlight ) return;
400         highlighted = need_highlight;
401         canvas->draw_refresh();
402 }
403
404 int VWindowGUI::drag_stop()
405 {
406         if(get_hidden()) return 0;
407
408         if(highlighted &&
409                 mwindow->session->current_operation == DRAG_ASSET)
410         {
411                 highlighted = 0;
412                 canvas->draw_refresh();
413
414                 Indexable *indexable = mwindow->session->drag_assets->size() ?
415                         mwindow->session->drag_assets->get(0) :
416                         0;
417                 EDL *edl = mwindow->session->drag_clips->size() ?
418                         mwindow->session->drag_clips->get(0) :
419                         0;
420
421                 if(indexable)
422                         vwindow->change_source(indexable);
423                 else
424                 if(edl)
425                         vwindow->change_source(edl);
426                 return 1;
427         }
428
429         return 0;
430 }
431
432
433 void VWindowGUI::update_meters()
434 {
435         if(mwindow->edl->session->vwindow_meter != meters->visible)
436         {
437                 meters->set_meters(meters->meter_count,
438                         mwindow->edl->session->vwindow_meter);
439                 mwindow->theme->get_vwindow_sizes(this);
440                 resize_event(get_w(), get_h());
441         }
442 }
443
444
445
446 VWindowMeters::VWindowMeters(MWindow *mwindow,
447         VWindowGUI *gui,
448         int x,
449         int y,
450         int h)
451  : MeterPanel(mwindow,
452                 gui,
453                 x,
454                 y,
455                 -1,
456                 h,
457                 mwindow->edl->session->audio_channels,
458                 mwindow->edl->session->vwindow_meter,
459                 0,
460                 0)
461 {
462         this->mwindow = mwindow;
463         this->gui = gui;
464 }
465
466 VWindowMeters::~VWindowMeters()
467 {
468 }
469
470 int VWindowMeters::change_status_event(int new_status)
471 {
472         mwindow->edl->session->vwindow_meter = new_status;
473         gui->update_meters();
474         return 1;
475 }
476
477
478
479
480
481
482
483 VWindowEditing::VWindowEditing(MWindow *mwindow, VWindow *vwindow)
484  : EditPanel(mwindow,
485                 vwindow->gui,
486                 mwindow->theme->vedit_x,
487                 mwindow->theme->vedit_y,
488                 EDITING_ARROW,
489                 0,
490                 0,
491                 1,
492                 1,
493                 0,
494                 0,
495                 1,
496                 0,
497                 0,
498                 0,
499                 0, // locklabels
500                 1,
501                 1,
502                 1,
503                 0,
504                 0,
505                 0)
506 {
507         this->mwindow = mwindow;
508         this->vwindow = vwindow;
509 }
510
511 VWindowEditing::~VWindowEditing()
512 {
513 }
514
515 void VWindowEditing::copy_selection()
516 {
517         vwindow->copy();
518 }
519
520 void VWindowEditing::splice_selection()
521 {
522         if(vwindow->get_edl())
523         {
524                 mwindow->gui->lock_window("VWindowEditing::splice_selection");
525                 mwindow->splice(vwindow->get_edl());
526                 mwindow->gui->unlock_window();
527         }
528 }
529
530 void VWindowEditing::overwrite_selection()
531 {
532         if(vwindow->get_edl())
533         {
534                 mwindow->gui->lock_window("VWindowEditing::overwrite_selection");
535                 mwindow->overwrite(vwindow->get_edl());
536                 mwindow->gui->unlock_window();
537         }
538 }
539
540 void VWindowEditing::toggle_label()
541 {
542         if(vwindow->get_edl())
543         {
544                 EDL *edl = vwindow->get_edl();
545                 edl->labels->toggle_label(edl->local_session->get_selectionstart(1),
546                         edl->local_session->get_selectionend(1));
547                 vwindow->gui->timebar->update(1);
548         }
549 }
550
551 void VWindowEditing::prev_label()
552 {
553         if(vwindow->get_edl())
554         {
555                 EDL *edl = vwindow->get_edl();
556                 vwindow->gui->unlock_window();
557                 vwindow->playback_engine->interrupt_playback(1);
558                 vwindow->gui->lock_window("VWindowEditing::prev_label");
559
560                 Label *current = edl->labels->prev_label(
561                         edl->local_session->get_selectionstart(1));
562
563
564                 if(!current)
565                 {
566                         edl->local_session->set_selectionstart(0);
567                         edl->local_session->set_selectionend(0);
568                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
569                         vwindow->gui->timebar->update(1);
570                 }
571                 else
572                 {
573                         edl->local_session->set_selectionstart(current->position);
574                         edl->local_session->set_selectionend(current->position);
575                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
576                         vwindow->gui->timebar->update(1);
577                 }
578         }
579 }
580
581 void VWindowEditing::next_label()
582 {
583         if(vwindow->get_edl())
584         {
585                 EDL *edl = vwindow->get_edl();
586                 Label *current = edl->labels->next_label(
587                         edl->local_session->get_selectionstart(1));
588                 if(!current)
589                 {
590                         vwindow->gui->unlock_window();
591                         vwindow->playback_engine->interrupt_playback(1);
592                         vwindow->gui->lock_window("VWindowEditing::next_label 1");
593
594                         double position = edl->tracks->total_length();
595                         edl->local_session->set_selectionstart(position);
596                         edl->local_session->set_selectionend(position);
597                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
598                         vwindow->gui->timebar->update(1);
599                 }
600                 else
601                 {
602                         vwindow->gui->unlock_window();
603                         vwindow->playback_engine->interrupt_playback(1);
604                         vwindow->gui->lock_window("VWindowEditing::next_label 2");
605
606                         edl->local_session->set_selectionstart(current->position);
607                         edl->local_session->set_selectionend(current->position);
608                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
609                         vwindow->gui->timebar->update(1);
610                 }
611         }
612 }
613
614 double VWindowEditing::get_position()
615 {
616         EDL *edl = vwindow->get_edl();
617         double position = !edl ? 0 : edl->local_session->get_selectionstart(1) +
618                         edl->session->get_frame_offset() / edl->session->frame_rate;
619         return position;
620 }
621
622 void VWindowEditing::set_position(double position)
623 {
624         EDL *edl = vwindow->get_edl();
625         if( !edl ) return;
626         if( get_position() != position ) {
627                 position -= edl->session->get_frame_offset() / edl->session->frame_rate;
628                 if( position < 0 ) position = 0;
629                 edl->local_session->set_selectionstart(position);
630                 edl->local_session->set_selectionend(position);
631                 vwindow->update_position(CHANGE_NONE, 0, 1);
632         }
633 }
634
635 void VWindowEditing::set_inpoint()
636 {
637         vwindow->set_inpoint();
638 }
639
640 void VWindowEditing::set_outpoint()
641 {
642         vwindow->set_outpoint();
643 }
644
645 void VWindowEditing::clear_inpoint()
646 {
647         vwindow->clear_inpoint();
648 }
649
650 void VWindowEditing::clear_outpoint()
651 {
652         vwindow->clear_outpoint();
653 }
654
655 void VWindowEditing::to_clip()
656 {
657         EDL *edl = vwindow->get_edl();
658         if( !edl ) return;
659         mwindow->to_clip(edl, _("viewer window: "));
660 }
661
662 VWindowSource::VWindowSource(MWindow *mwindow, VWindowGUI *vwindow, int x, int y)
663  : BC_PopupTextBox(vwindow,
664         &vwindow->sources,
665         "",
666         x,
667         y,
668         200,
669         200)
670 {
671         this->mwindow = mwindow;
672         this->vwindow = vwindow;
673 }
674
675 VWindowSource::~VWindowSource()
676 {
677 }
678
679 int VWindowSource::handle_event()
680 {
681         return 1;
682 }
683
684
685 VWindowTransport::VWindowTransport(MWindow *mwindow,
686         VWindowGUI *gui,
687         int x,
688         int y)
689  : PlayTransport(mwindow,
690         gui,
691         x,
692         y)
693 {
694         this->gui = gui;
695 }
696
697 EDL* VWindowTransport::get_edl()
698 {
699         return gui->vwindow->get_edl();
700 }
701
702
703 void VWindowTransport::goto_start()
704 {
705         gui->unlock_window();
706         handle_transport(REWIND, 1);
707         gui->lock_window("VWindowTransport::goto_start");
708         gui->vwindow->goto_start();
709 }
710
711 void VWindowTransport::goto_end()
712 {
713         gui->unlock_window();
714         handle_transport(GOTO_END, 1);
715         gui->lock_window("VWindowTransport::goto_end");
716         gui->vwindow->goto_end();
717 }
718
719
720
721
722 VWindowCanvas::VWindowCanvas(MWindow *mwindow, VWindowGUI *gui)
723  : Canvas(mwindow,
724         gui,
725         mwindow->theme->vcanvas_x,
726         mwindow->theme->vcanvas_y,
727         mwindow->theme->vcanvas_w,
728         mwindow->theme->vcanvas_h,
729         0, 0, 0)
730 {
731 //printf("VWindowCanvas::VWindowCanvas %d %d\n", __LINE__, mwindow->theme->vcanvas_x);
732         this->mwindow = mwindow;
733         this->gui = gui;
734 }
735
736 void VWindowCanvas::zoom_resize_window(float percentage)
737 {
738         EDL *edl = gui->vwindow->get_edl();
739         if(!edl) edl = mwindow->edl;
740
741         int canvas_w, canvas_h;
742         int new_w, new_h;
743
744 // Get required canvas size
745         calculate_sizes(edl->get_aspect_ratio(),
746                 edl->session->output_w,
747                 edl->session->output_h,
748                 percentage,
749                 canvas_w,
750                 canvas_h);
751
752 // Estimate window size from current borders
753         new_w = canvas_w + (gui->get_w() - mwindow->theme->vcanvas_w);
754         new_h = canvas_h + (gui->get_h() - mwindow->theme->vcanvas_h);
755
756         mwindow->session->vwindow_w = new_w;
757         mwindow->session->vwindow_h = new_h;
758
759         mwindow->theme->get_vwindow_sizes(gui);
760
761 // Estimate again from new borders
762         new_w = canvas_w + (mwindow->session->vwindow_w - mwindow->theme->vcanvas_w);
763         new_h = canvas_h + (mwindow->session->vwindow_h - mwindow->theme->vcanvas_h);
764
765
766         gui->resize_window(new_w, new_h);
767         gui->resize_event(new_w, new_h);
768 }
769
770 void VWindowCanvas::close_source()
771 {
772         gui->unlock_window();
773         gui->vwindow->playback_engine->interrupt_playback(1);
774         gui->lock_window("VWindowCanvas::close_source");
775         gui->vwindow->delete_source(1, 1);
776 }
777
778
779 void VWindowCanvas::draw_refresh(int flush)
780 {
781         EDL *edl = gui->vwindow->get_edl();
782
783         if(!get_canvas()->get_video_on()) get_canvas()->clear_box(0, 0, get_canvas()->get_w(), get_canvas()->get_h());
784         if(!get_canvas()->get_video_on() && refresh_frame && edl)
785         {
786                 float in_x1, in_y1, in_x2, in_y2;
787                 float out_x1, out_y1, out_x2, out_y2;
788                 get_transfers(edl,
789                         in_x1,
790                         in_y1,
791                         in_x2,
792                         in_y2,
793                         out_x1,
794                         out_y1,
795                         out_x2,
796                         out_y2);
797                 get_canvas()->draw_vframe(refresh_frame,
798                                 (int)out_x1,
799                                 (int)out_y1,
800                                 (int)(out_x2 - out_x1),
801                                 (int)(out_y2 - out_y1),
802                                 (int)in_x1,
803                                 (int)in_y1,
804                                 (int)(in_x2 - in_x1),
805                                 (int)(in_y2 - in_y1),
806                                 0);
807         }
808
809         if(!get_canvas()->get_video_on())
810         {
811                 draw_overlays();
812                 get_canvas()->flash(flush);
813         }
814 }
815
816 void VWindowCanvas::draw_overlays()
817 {
818         if( gui->highlighted )
819         {
820                 get_canvas()->set_color(WHITE);
821                 get_canvas()->set_inverse();
822                 get_canvas()->draw_rectangle(0, 0, get_canvas()->get_w(), get_canvas()->get_h());
823                 get_canvas()->draw_rectangle(1, 1, get_canvas()->get_w() - 2, get_canvas()->get_h() - 2);
824                 get_canvas()->set_opaque();
825         }
826 }
827
828 int VWindowCanvas::get_fullscreen()
829 {
830         return mwindow->session->vwindow_fullscreen;
831 }
832
833 void VWindowCanvas::set_fullscreen(int value)
834 {
835         mwindow->session->vwindow_fullscreen = value;
836 }
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874 #if 0
875 void VWindowGUI::update_points()
876 {
877         EDL *edl = vwindow->get_edl();
878
879 //printf("VWindowGUI::update_points 1\n");
880         if(!edl) return;
881
882 //printf("VWindowGUI::update_points 2\n");
883         long pixel = (long)((double)edl->local_session->in_point /
884                 edl->tracks->total_playable_length() *
885                 (mwindow->theme->vtimebar_w -
886                         2 *
887                         mwindow->theme->in_point[0]->get_w())) +
888                 mwindow->theme->in_point[0]->get_w();
889
890 //printf("VWindowGUI::update_points 3 %d\n", edl->local_session->in_point);
891         if(in_point)
892         {
893 //printf("VWindowGUI::update_points 3.1\n");
894                 if(edl->local_session->in_point >= 0)
895                 {
896 //printf("VWindowGUI::update_points 4\n");
897                         if(edl->local_session->in_point != in_point->position ||
898                                 in_point->pixel != pixel)
899                         {
900                                 in_point->pixel = pixel;
901                                 in_point->reposition();
902                         }
903
904 //printf("VWindowGUI::update_points 5\n");
905                         in_point->position = edl->local_session->in_point;
906
907 //printf("VWindowGUI::update_points 6\n");
908                         if(edl->equivalent(in_point->position, edl->local_session->get_selectionstart(1)) ||
909                                 edl->equivalent(in_point->position, edl->local_session->get_selectionend(1)))
910                                 in_point->update(1);
911                         else
912                                 in_point->update(0);
913 //printf("VWindowGUI::update_points 7\n");
914                 }
915                 else
916                 {
917                         delete in_point;
918                         in_point = 0;
919                 }
920         }
921         else
922         if(edl->local_session->in_point >= 0)
923         {
924 //printf("VWindowGUI::update_points 8 %p\n", mwindow->theme->in_point);
925                 add_subwindow(in_point =
926                         new VWindowInPoint(mwindow,
927                                 0,
928                                 this,
929                                 pixel,
930                                 edl->local_session->in_point));
931 //printf("VWindowGUI::update_points 9\n");
932         }
933 //printf("VWindowGUI::update_points 10\n");
934
935         pixel = (long)((double)edl->local_session->out_point /
936                 (edl->tracks->total_playable_length() + 0.5) *
937                 (mwindow->theme->vtimebar_w -
938                         2 *
939                         mwindow->theme->in_point[0]->get_w())) +
940                 mwindow->theme->in_point[0]->get_w() *
941                 2;
942
943         if(out_point)
944         {
945                 if(edl->local_session->out_point >= 0 && pixel >= 0 && pixel <= mwindow->theme->vtimebar_w)
946                 {
947                         if(edl->local_session->out_point != out_point->position ||
948                                 out_point->pixel != pixel)
949                         {
950                                 out_point->pixel = pixel;
951                                 out_point->reposition();
952                         }
953                         out_point->position = edl->local_session->out_point;
954
955                         if(edl->equivalent(out_point->position, edl->local_session->get_selectionstart(1)) ||
956                                 edl->equivalent(out_point->position, edl->local_session->get_selectionend(1)))
957                                 out_point->update(1);
958                         else
959                                 out_point->update(0);
960                 }
961                 else
962                 {
963                         delete out_point;
964                         out_point = 0;
965                 }
966         }
967         else
968         if(edl->local_session->out_point >= 0 && pixel >= 0 && pixel <= mwindow->theme->vtimebar_w)
969         {
970                 add_subwindow(out_point =
971                         new VWindowOutPoint(mwindow,
972                                 0,
973                                 this,
974                                 pixel,
975                                 edl->local_session->out_point));
976         }
977 }
978
979
980 void VWindowGUI::update_labels()
981 {
982         EDL *edl = vwindow->get_edl();
983         int output = 0;
984
985         for(Label *current = edl->labels->first;
986                 current;
987                 current = NEXT)
988         {
989                 long pixel = (long)((current->position - edl->local_session->view_start) / edl->local_session->zoom_sample);
990
991                 if(pixel >= 0 && pixel < mwindow->theme->vtimebar_w)
992                 {
993 // Create new label
994                         if(output >= labels.total)
995                         {
996                                 LabelGUI *new_label;
997                                 add_subwindow(new_label = new LabelGUI(mwindow, this, pixel, 0, current->position));
998                                 labels.append(new_label);
999                         }
1000                         else
1001 // Reposition old label
1002                         if(labels.values[output]->pixel != pixel)
1003                         {
1004                                 labels.values[output]->pixel = pixel;
1005                                 labels.values[output]->position = current->position;
1006                                 labels.values[output]->reposition();
1007                         }
1008
1009                         if(mwindow->edl->local_session->get_selectionstart(1) <= current->position &&
1010                                 mwindow->edl->local_session->get_selectionend(1) >= current->position)
1011                                 labels.values[output]->update(1);
1012                         else
1013                         if(labels.values[output]->get_value())
1014                                 labels.values[output]->update(0);
1015                         output++;
1016                 }
1017         }
1018
1019 // Delete excess labels
1020         while(labels.total > output)
1021         {
1022                 labels.remove_object();
1023         }
1024 }
1025
1026
1027
1028 VWindowInPoint::VWindowInPoint(MWindow *mwindow,
1029                 TimeBar *timebar,
1030                 VWindowGUI *gui,
1031                 long pixel,
1032                 double position)
1033  : InPointGUI(mwindow,
1034                 timebar,
1035                 pixel,
1036                 position)
1037 {
1038         this->gui = gui;
1039 }
1040
1041 int VWindowInPoint::handle_event()
1042 {
1043         EDL *edl = gui->vwindow->get_edl();
1044
1045         if(edl)
1046         {
1047                 double position = edl->align_to_frame(this->position, 0);
1048
1049                 edl->local_session->set_selectionstart(position);
1050                 edl->local_session->set_selectionend(position);
1051                 gui->timebar->update(1);
1052
1053 // Que the VWindow
1054                 mwindow->vwindow->update_position(CHANGE_NONE, 0, 1, 0);
1055         }
1056         return 1;
1057 }
1058
1059
1060
1061 VWindowOutPoint::VWindowOutPoint(MWindow *mwindow,
1062                 TimeBar *timebar,
1063                 VWindowGUI *gui,
1064                 long pixel,
1065                 double position)
1066  : OutPointGUI(mwindow,
1067                 timebar,
1068                 pixel,
1069                 position)
1070 {
1071         this->gui = gui;
1072 }
1073
1074 int VWindowOutPoint::handle_event()
1075 {
1076         EDL *edl = gui->vwindow->get_edl();
1077
1078         if(edl)
1079         {
1080                 double position = edl->align_to_frame(this->position, 0);
1081
1082                 edl->local_session->set_selectionstart(position);
1083                 edl->local_session->set_selectionend(position);
1084                 gui->timebar->update(1);
1085
1086 // Que the VWindow
1087                 mwindow->vwindow->update_position(CHANGE_NONE, 0, 1, 0);
1088         }
1089
1090         return 1;
1091 }
1092
1093
1094
1095 #endif
1096