4 * Copyright (C) 2008 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 "bcdisplayinfo.h"
26 #include "edlsession.h"
28 #include "indexable.h"
29 #include "mainsession.h"
30 #include "meterpanel.h"
32 #include "mwindowgui.h"
35 MainSession::MainSession(MWindow *mwindow)
37 this->mwindow = mwindow;
40 // playback_cursor_visible = 0;
41 // is_playing_back = 0;
42 track_highlighted = 0;
43 plugin_highlighted = 0;
44 pluginset_highlighted = 0;
46 current_operation = NO_OPERATION;
47 drag_pluginservers = new ArrayList<PluginServer*>;
49 drag_assets = new ArrayList<Indexable*>;
50 drag_auto_gang = new ArrayList<Auto*>;
51 drag_clips = new ArrayList<EDL*>;
52 drag_proxy = new ArrayList<EDL*>;
53 drag_edits = new ArrayList<Edit*>;
61 cwindow_fullscreen = 0;
62 rwindow_fullscreen = 0;
63 vwindow_fullscreen = 0;
64 zwindow_fullscreen = 0;
65 selected_zwindow = -1;
66 actual_frame_rate = 0;
77 drag_origin_x = drag_origin_y = 0;
78 drag_start_percentage = 0;
79 drag_start_position = 0;
80 cwindow_output_x = cwindow_output_y = 0;
81 batchrender_x = batchrender_y = batchrender_w = batchrender_h = 0;
82 lwindow_x = lwindow_y = lwindow_w = lwindow_h = 0;
83 mwindow_x = mwindow_y = mwindow_w = mwindow_h = 0;
84 vwindow_x = vwindow_y = vwindow_w = vwindow_h = 0;
85 cwindow_x = cwindow_y = cwindow_w = cwindow_h = 0;
86 ctool_x = ctool_y = 0;
87 awindow_x = awindow_y = awindow_w = awindow_h = 0;
88 rmonitor_x = rmonitor_y = rmonitor_w = rmonitor_h = 0;
89 rwindow_x = rwindow_y = rwindow_w = rwindow_h = 0;
90 gwindow_x = gwindow_y = 0;
91 cswindow_x = cswindow_y = cswindow_w = cswindow_h = 0;
92 swindow_x = swindow_y = swindow_w = swindow_h = 0;
93 ewindow_w = ewindow_h = 0;
94 channels_x = channels_y = 0;
95 picture_x = picture_y = 0;
96 scope_x = scope_y = scope_w = scope_h = 0;
97 histogram_x = histogram_y = histogram_w = histogram_h = 0;
104 show_vwindow = show_awindow = show_cwindow = show_gwindow = show_lwindow = 0;
105 plugindialog_w = plugindialog_h = 0;
106 // presetdialog_w = presetdialog_h = 0;
107 keyframedialog_w = keyframedialog_h = 0;
108 keyframedialog_column1 = 0;
109 keyframedialog_column2 = 0;
110 keyframedialog_all = 0;
111 menueffect_w = menueffect_h = 0;
112 transitiondialog_w = transitiondialog_h = 0;
115 MainSession::~MainSession()
118 delete drag_pluginservers;
120 delete drag_auto_gang;
126 void MainSession::boundaries()
128 lwindow_x = MAX(0, lwindow_x);
129 lwindow_y = MAX(0, lwindow_y);
130 mwindow_x = MAX(0, mwindow_x);
131 mwindow_y = MAX(0, mwindow_y);
132 cwindow_x = MAX(0, cwindow_x);
133 cwindow_y = MAX(0, cwindow_y);
134 vwindow_x = MAX(0, vwindow_x);
135 vwindow_y = MAX(0, vwindow_y);
136 awindow_x = MAX(0, awindow_x);
137 awindow_y = MAX(0, awindow_y);
138 gwindow_x = MAX(0, gwindow_x);
139 gwindow_y = MAX(0, gwindow_y);
140 rwindow_x = MAX(0, rwindow_x);
141 rwindow_y = MAX(0, rwindow_y);
142 rmonitor_x = MAX(0, rmonitor_x);
143 rmonitor_y = MAX(0, rmonitor_y);
144 CLAMP(cwindow_controls, 0, 1);
147 void MainSession::clear_drag_proxy()
149 for( int i=drag_proxy->size(); --i>=0; )
150 drag_proxy->get(i)->remove_user();
151 drag_proxy->remove_all();
154 void MainSession::save_x11_host(int play_config, const char *x11_host)
156 strcpy(!play_config ? a_x11_host : b_x11_host, x11_host);
159 // set default x11 host, window_config, return screens
160 int MainSession::set_default_x11_host(int win_config)
162 if( win_config < 0 ) win_config = window_config;
163 const char *x11_host = win_config!=1 ? a_x11_host : b_x11_host;
164 BC_DisplayInfo display_info(x11_host,0);
165 int screen = display_info.get_screen();
166 if( screen < 0 && strcmp(a_x11_host, b_x11_host) ) {
167 win_config = win_config==1 ? 0 : 1;
168 x11_host = win_config!=1 ? a_x11_host : b_x11_host;
169 display_info.init_window(x11_host,0);
170 screen = display_info.get_screen();
174 display_info.init_window(x11_host,1);
177 if( display_info.get_screen_count() > 1 )
178 screens = strcmp(a_x11_host, b_x11_host) != 0 ? 2 : 1;
179 window_config = win_config;
180 BC_Window::set_default_x11_host(x11_host);
184 void MainSession::default_window_positions(int window_config)
186 // 0 - all windows on a, playback_config a
187 // 1 - all windows on b, playback_config b
188 // 2 - all windows on a, except composer on b, playback_config b
189 int screens = set_default_x11_host(window_config);
190 mwindow->set_screens(screens);
192 BC_DisplayInfo display_info(BC_Window::get_default_x11_host());
193 // Get defaults based on root window size
196 int root_w = display_info.get_root_w();
197 int root_h = display_info.get_root_h();
199 int border_left = display_info.get_left_border();
200 int border_right = display_info.get_right_border();
201 int border_top = display_info.get_top_border();
202 int border_bottom = display_info.get_bottom_border();
204 int dual_head = screens > 1 ? 1 : 0;
205 int right_w = root_w;
206 // Wider than 16:9, narrower than dual head
207 if( screens < 2 && (float)root_w / root_h > 1.8) {
210 case 600: right_w = 800; break;
211 case 720: right_w = 1280; break;
212 case 1024: right_w = 1280; break;
213 case 1200: right_w = 1600; break;
214 case 1080: right_w = 1920; break;
215 default: right_w = root_w/2; break;
217 if( window_config == 1 ) {
218 root_x = root_w - right_w;
222 // use same aspect ratio to compute left height
224 root_h = (root_w*root_h) / right_w;
230 vwindow_w = root_w / 2 - border_left - border_right;
231 vwindow_h = root_h * 6 / 10 - border_top - border_bottom;
233 int b_root_w = root_w;
234 int b_root_h = root_h;
235 if( !dual_head || window_config != 2 ) {
236 cwindow_x = root_x + root_w / 2;
238 cwindow_w = vwindow_w;
239 cwindow_h = vwindow_h;
242 // Get defaults based on root window size
243 BC_DisplayInfo b_display_info(b_x11_host);
244 b_root_w = b_display_info.get_root_w();
245 b_root_h = b_display_info.get_root_h();
248 cwindow_w = b_root_w-100;
249 cwindow_h = b_root_h-100;
252 ctool_x = cwindow_x + cwindow_w / 2;
253 ctool_y = cwindow_y + cwindow_h / 2;
256 mwindow_y = vwindow_y + vwindow_h + border_top + border_bottom;
257 mwindow_w = root_w * 2 / 3 - border_left - border_right;
258 mwindow_h = root_h - mwindow_y - border_top - border_bottom;
260 awindow_x = mwindow_x + border_left + border_right + mwindow_w;
261 awindow_y = mwindow_y;
262 awindow_w = root_x + root_w - awindow_x - border_left - border_right;
263 awindow_h = mwindow_h;
288 lwindow_w = MeterPanel::get_meters_width(mwindow->theme,
289 mwindow->edl->session->audio_channels,
295 lwindow_x = root_w - lwindow_w;
296 lwindow_h = mwindow_y;
308 if( !dual_head || window_config != 2 ) {
309 rmonitor_x = rwindow_x + rwindow_w + 10;
310 rmonitor_y = rwindow_y;
311 rmonitor_w = root_x + root_w - rmonitor_x;
312 rmonitor_h = rwindow_h;
315 rmonitor_x = cswindow_x = 50;
316 rmonitor_y = cswindow_y = 50;
317 rmonitor_w = b_root_w-100;
318 rmonitor_h = b_root_h-100;
319 if( cswindow_w < rmonitor_w ) cswindow_w = rmonitor_w;
320 if( cswindow_h < rmonitor_h ) cswindow_h = rmonitor_h;
330 batchrender_x = root_w / 2 - batchrender_w / 2;
331 batchrender_y = root_h / 2 - batchrender_h / 2;
334 int MainSession::load_defaults(BC_Hash *defaults)
336 // Setup main windows
337 strcpy(a_x11_host, defaults->get("A_X11_HOST", a_x11_host));
338 strcpy(b_x11_host, defaults->get("B_X11_HOST", b_x11_host));
339 window_config = defaults->get("WINDOW_CONFIG", window_config);
340 default_window_positions(window_config);
342 vwindow_x = defaults->get("VWINDOW_X", vwindow_x);
343 vwindow_y = defaults->get("VWINDOW_Y", vwindow_y);
344 vwindow_w = defaults->get("VWINDOW_W", vwindow_w);
345 vwindow_h = defaults->get("VWINDOW_H", vwindow_h);
348 cwindow_x = defaults->get("CWINDOW_X", cwindow_x);
349 cwindow_y = defaults->get("CWINDOW_Y", cwindow_y);
350 cwindow_w = defaults->get("CWINDOW_W", cwindow_w);
351 cwindow_h = defaults->get("CWINDOW_H", cwindow_h);
353 ctool_x = defaults->get("CTOOL_X", ctool_x);
354 ctool_y = defaults->get("CTOOL_Y", ctool_y);
356 gwindow_x = defaults->get("GWINDOW_X", gwindow_x);
357 gwindow_y = defaults->get("GWINDOW_Y", gwindow_y);
359 mwindow_x = defaults->get("MWINDOW_X", mwindow_x);
360 mwindow_y = defaults->get("MWINDOW_Y", mwindow_y);
361 mwindow_w = defaults->get("MWINDOW_W", mwindow_w);
362 mwindow_h = defaults->get("MWINDOW_H", mwindow_h);
364 lwindow_x = defaults->get("LWINDOW_X", lwindow_x);
365 lwindow_y = defaults->get("LWINDOW_Y", lwindow_y);
366 lwindow_w = defaults->get("LWINDOW_W", lwindow_w);
367 lwindow_h = defaults->get("LWINDOW_H", lwindow_h);
370 awindow_x = defaults->get("AWINDOW_X", awindow_x);
371 awindow_y = defaults->get("AWINDOW_Y", awindow_y);
372 awindow_w = defaults->get("AWINDOW_W", awindow_w);
373 awindow_h = defaults->get("AWINDOW_H", awindow_h);
375 ewindow_w = defaults->get("EWINDOW_W", ewindow_w);
376 ewindow_h = defaults->get("EWINDOW_H", ewindow_h);
378 channels_x = defaults->get("CHANNELS_X", channels_x);
379 channels_y = defaults->get("CHANNELS_Y", channels_y);
380 picture_x = defaults->get("PICTURE_X", picture_x);
381 picture_y = defaults->get("PICTURE_Y", picture_y);
382 scope_x = defaults->get("SCOPE_X", scope_x);
383 scope_y = defaults->get("SCOPE_Y", scope_y);
384 scope_w = defaults->get("SCOPE_W", scope_w);
385 scope_h = defaults->get("SCOPE_H", scope_h);
386 histogram_x = defaults->get("HISTOGRAM_X", histogram_x);
387 histogram_y = defaults->get("HISTOGRAM_Y", histogram_y);
388 histogram_w = defaults->get("HISTOGRAM_W", histogram_w);
389 histogram_h = defaults->get("HISTOGRAM_H", histogram_h);
390 record_scope = defaults->get("RECORD_SCOPE", record_scope);
391 use_hist = defaults->get("USE_HIST", use_hist);
392 use_wave = defaults->get("USE_WAVE", use_wave);
393 use_vector = defaults->get("USE_VECTOR", use_vector);
394 use_hist_parade = defaults->get("USE_HIST_PARADE", use_hist_parade);
395 use_wave_parade = defaults->get("USE_WAVE_PARADE", use_wave_parade);
397 //printf("MainSession::load_defaults 1\n");
400 afolders_w = defaults->get("ABINS_W", 200);
401 rwindow_x = defaults->get("RWINDOW_X", rwindow_x);
402 rwindow_y = defaults->get("RWINDOW_Y", rwindow_y);
403 rwindow_w = defaults->get("RWINDOW_W", rwindow_w);
404 rwindow_h = defaults->get("RWINDOW_H", rwindow_h);
406 cswindow_x = defaults->get("CSWINDOW_X", cswindow_x);
407 cswindow_y = defaults->get("CSWINDOW_Y", cswindow_y);
408 cswindow_w = defaults->get("CSWINDOW_W", cswindow_w);
409 cswindow_h = defaults->get("CSWINDOW_H", cswindow_h);
411 swindow_x = defaults->get("SWINDOW_X", swindow_x);
412 swindow_y = defaults->get("SWINDOW_Y", swindow_y);
413 swindow_w = defaults->get("SWINDOW_W", swindow_w);
414 swindow_h = defaults->get("SWINDOW_H", swindow_h);
416 rmonitor_x = defaults->get("RMONITOR_X", rmonitor_x);
417 rmonitor_y = defaults->get("RMONITOR_Y", rmonitor_y);
418 rmonitor_w = defaults->get("RMONITOR_W", rmonitor_w);
419 rmonitor_h = defaults->get("RMONITOR_H", rmonitor_h);
421 batchrender_x = defaults->get("BATCHRENDER_X", batchrender_x);
422 batchrender_y = defaults->get("BATCHRENDER_Y", batchrender_y);
423 batchrender_w = defaults->get("BATCHRENDER_W", batchrender_w);
424 batchrender_h = defaults->get("BATCHRENDER_H", batchrender_h);
426 show_vwindow = defaults->get("SHOW_VWINDOW", 1);
427 show_awindow = defaults->get("SHOW_AWINDOW", 1);
428 show_cwindow = defaults->get("SHOW_CWINDOW", 1);
429 show_lwindow = defaults->get("SHOW_LWINDOW", 0);
430 show_gwindow = defaults->get("SHOW_GWINDOW", 0);
432 cwindow_controls = defaults->get("CWINDOW_CONTROLS", cwindow_controls);
434 plugindialog_w = defaults->get("PLUGINDIALOG_W", 510);
435 plugindialog_h = defaults->get("PLUGINDIALOG_H", 415);
436 // presetdialog_w = defaults->get("PRESETDIALOG_W", 510);
437 // presetdialog_h = defaults->get("PRESETDIALOG_H", 415);
438 keyframedialog_w = defaults->get("KEYFRAMEDIALOG_W", 320);
439 keyframedialog_h = defaults->get("KEYFRAMEDIALOG_H", 415);
440 keyframedialog_column1 = defaults->get("KEYFRAMEDIALOG_COLUMN1", 150);
441 keyframedialog_column2 = defaults->get("KEYFRAMEDIALOG_COLUMN2", 100);
442 keyframedialog_all = defaults->get("KEYFRAMEDIALOG_ALL", 0);
443 menueffect_w = defaults->get("MENUEFFECT_W", 580);
444 menueffect_h = defaults->get("MENUEFFECT_H", 350);
445 transitiondialog_w = defaults->get("TRANSITIONDIALOG_W", 320);
446 transitiondialog_h = defaults->get("TRANSITIONDIALOG_H", 512);
448 current_tip = defaults->get("CURRENT_TIP", current_tip);
449 actual_frame_rate = defaults->get("ACTUAL_FRAME_RATE", (float)-1);
455 int MainSession::save_defaults(BC_Hash *defaults)
457 defaults->update("A_X11_HOST", a_x11_host);
458 defaults->update("B_X11_HOST", b_x11_host);
459 defaults->update("WINDOW_CONFIG", window_config);
461 defaults->update("MWINDOW_X", mwindow_x);
462 defaults->update("MWINDOW_Y", mwindow_y);
463 defaults->update("MWINDOW_W", mwindow_w);
464 defaults->update("MWINDOW_H", mwindow_h);
466 defaults->update("LWINDOW_X", lwindow_x);
467 defaults->update("LWINDOW_Y", lwindow_y);
468 defaults->update("LWINDOW_W", lwindow_w);
469 defaults->update("LWINDOW_H", lwindow_h);
471 defaults->update("VWINDOW_X", vwindow_x);
472 defaults->update("VWINDOW_Y", vwindow_y);
473 defaults->update("VWINDOW_W", vwindow_w);
474 defaults->update("VWINDOW_H", vwindow_h);
476 defaults->update("CWINDOW_X", cwindow_x);
477 defaults->update("CWINDOW_Y", cwindow_y);
478 defaults->update("CWINDOW_W", cwindow_w);
479 defaults->update("CWINDOW_H", cwindow_h);
481 defaults->update("CTOOL_X", ctool_x);
482 defaults->update("CTOOL_Y", ctool_y);
484 defaults->update("GWINDOW_X", gwindow_x);
485 defaults->update("GWINDOW_Y", gwindow_y);
487 defaults->update("AWINDOW_X", awindow_x);
488 defaults->update("AWINDOW_Y", awindow_y);
489 defaults->update("AWINDOW_W", awindow_w);
490 defaults->update("AWINDOW_H", awindow_h);
492 defaults->update("EWINDOW_W", ewindow_w);
493 defaults->update("EWINDOW_H", ewindow_h);
495 defaults->update("CHANNELS_X", channels_x);
496 defaults->update("CHANNELS_Y", channels_y);
497 defaults->update("PICTURE_X", picture_x);
498 defaults->update("PICTURE_Y", picture_y);
499 defaults->update("SCOPE_X", scope_x);
500 defaults->update("SCOPE_Y", scope_y);
501 defaults->update("SCOPE_W", scope_w);
502 defaults->update("SCOPE_H", scope_h);
503 defaults->update("HISTOGRAM_X", histogram_x);
504 defaults->update("HISTOGRAM_Y", histogram_y);
505 defaults->update("HISTOGRAM_W", histogram_w);
506 defaults->update("HISTOGRAM_H", histogram_h);
507 defaults->update("RECORD_SCOPE", record_scope);
508 defaults->update("USE_HIST", use_hist);
509 defaults->update("USE_WAVE", use_wave);
510 defaults->update("USE_VECTOR", use_vector);
511 defaults->update("USE_HIST_PARADE", use_hist_parade);
512 defaults->update("USE_WAVE_PARADE", use_wave_parade);
514 defaults->update("ABINS_W", afolders_w);
516 defaults->update("RMONITOR_X", rmonitor_x);
517 defaults->update("RMONITOR_Y", rmonitor_y);
518 defaults->update("RMONITOR_W", rmonitor_w);
519 defaults->update("RMONITOR_H", rmonitor_h);
521 defaults->update("RWINDOW_X", rwindow_x);
522 defaults->update("RWINDOW_Y", rwindow_y);
523 defaults->update("RWINDOW_W", rwindow_w);
524 defaults->update("RWINDOW_H", rwindow_h);
526 defaults->update("CSWINDOW_X", cswindow_x);
527 defaults->update("CSWINDOW_Y", cswindow_y);
528 defaults->update("CSWINDOW_W", cswindow_w);
529 defaults->update("CSWINDOW_H", cswindow_h);
531 defaults->update("SWINDOW_X", swindow_x);
532 defaults->update("SWINDOW_Y", swindow_y);
533 defaults->update("SWINDOW_W", swindow_w);
534 defaults->update("SWINDOW_H", swindow_h);
536 defaults->update("BATCHRENDER_X", batchrender_x);
537 defaults->update("BATCHRENDER_Y", batchrender_y);
538 defaults->update("BATCHRENDER_W", batchrender_w);
539 defaults->update("BATCHRENDER_H", batchrender_h);
541 defaults->update("SHOW_VWINDOW", show_vwindow);
542 defaults->update("SHOW_AWINDOW", show_awindow);
543 defaults->update("SHOW_CWINDOW", show_cwindow);
544 defaults->update("SHOW_LWINDOW", show_lwindow);
545 defaults->update("SHOW_GWINDOW", show_gwindow);
547 defaults->update("CWINDOW_CONTROLS", cwindow_controls);
549 defaults->update("PLUGINDIALOG_W", plugindialog_w);
550 defaults->update("PLUGINDIALOG_H", plugindialog_h);
551 // defaults->update("PRESETDIALOG_W", presetdialog_w);
552 // defaults->update("PRESETDIALOG_H", presetdialog_h);
553 defaults->update("KEYFRAMEDIALOG_W", keyframedialog_w);
554 defaults->update("KEYFRAMEDIALOG_H", keyframedialog_h);
555 defaults->update("KEYFRAMEDIALOG_COLUMN1", keyframedialog_column1);
556 defaults->update("KEYFRAMEDIALOG_COLUMN2", keyframedialog_column2);
557 defaults->update("KEYFRAMEDIALOG_ALL", keyframedialog_all);
559 defaults->update("MENUEFFECT_W", menueffect_w);
560 defaults->update("MENUEFFECT_H", menueffect_h);
562 defaults->update("TRANSITIONDIALOG_W", transitiondialog_w);
563 defaults->update("TRANSITIONDIALOG_H", transitiondialog_h);
565 defaults->update("ACTUAL_FRAME_RATE", actual_frame_rate);
566 defaults->update("CURRENT_TIP", current_tip);