switch move/swap tracks, add mv trk shortcut, update msg
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / mainsession.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 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 "auto.h"
23 #include "bcdisplayinfo.h"
24 #include "clip.h"
25 #include "bchash.h"
26 #include "edit.h"
27 #include "edits.h"
28 #include "edl.h"
29 #include "edlsession.h"
30 #include "guicast.h"
31 #include "indexable.h"
32 #include "language.h"
33 #include "localsession.h"
34 #include "mainsession.h"
35 #include "meterpanel.h"
36 #include "mwindow.h"
37 #include "mwindowgui.h"
38 #include "plugin.h"
39 #include "transition.h"
40
41 MainSession::MainSession(MWindow *mwindow)
42 {
43         this->mwindow = mwindow;
44         changes_made = 0;
45         filename[0] = 0;
46 //      playback_cursor_visible = 0;
47 //      is_playing_back = 0;
48         track_highlighted = 0;
49         plugin_highlighted = 0;
50         pluginset_highlighted = 0;
51         edit_highlighted = 0;
52         current_operation = NO_OPERATION;
53         drag_pluginservers = new ArrayList<PluginServer*>;
54         drag_plugin = 0;
55         drag_transition = 0;
56         drag_assets = new ArrayList<Indexable*>;
57         drag_auto_gang = new ArrayList<Auto*>;
58         drag_clips = new ArrayList<EDL*>;
59         drag_edits = new ArrayList<Edit*>;
60         drag_edit = 0;
61         drag_group = 0;
62         drag_group_edit = 0;
63         drag_group_position = 0;
64         drag_group_first_track = 0;
65         group_number = 1;
66         clip_number = 1;
67         brender_end = 0;
68         cwindow_controls = 1;
69         trim_edits = 0;
70         current_tip = -1;
71         selected_zwindow = -1;
72         actual_frame_rate = 0;
73         title_bar_alpha = 0;
74         window_config = 0;
75         a_x11_host[0] = 0;
76         b_x11_host[0] = 0;
77         record_scope = 0;
78
79         drag_auto = 0;
80         drag_button = 0;
81         drag_handle = 0;
82         drag_position = 0;
83         drag_start = 0;
84         drag_origin_x = drag_origin_y = 0;
85         drag_start_percentage = 0;
86         drag_start_position = 0;
87         cwindow_output_x = cwindow_output_y = 0;
88         batchrender_x = batchrender_y = batchrender_w = batchrender_h = 0;
89         lwindow_x = lwindow_y = lwindow_w = lwindow_h = 0;
90         mwindow_x = mwindow_y = mwindow_w = mwindow_h = 0;
91         vwindow_x = vwindow_y = vwindow_w = vwindow_h = 0;
92         cwindow_x = cwindow_y = cwindow_w = cwindow_h = 0;
93         ctool_x = ctool_y = 0;
94         awindow_x = awindow_y = awindow_w = awindow_h = 0;
95         bwindow_w = bwindow_h = 0;
96         rmonitor_x = rmonitor_y = rmonitor_w = rmonitor_h = 0;
97         rwindow_x = rwindow_y = rwindow_w = rwindow_h = 0;
98         gwindow_x = gwindow_y = 0;
99         cswindow_x = cswindow_y = cswindow_w = cswindow_h = 0;
100         swindow_x = swindow_y = swindow_w = swindow_h = 0;
101         ewindow_w = ewindow_h = 0;
102         channels_x = channels_y = 0;
103         picture_x = picture_y = 0;
104         scope_x = scope_y = scope_w = scope_h = 0;
105         histogram_x = histogram_y = histogram_w = histogram_h = 0;
106         use_hist = 0;
107         use_wave = 0;
108         use_vector = 0;
109         use_hist_parade = 0;
110         use_wave_parade = 0;
111         use_wave_gain = 5;
112         use_vect_gain = 5;
113         use_smooth = 0;
114         use_refresh = 0;
115         use_release = 0;
116         use_graticule = 0;
117         afolders_w = 0;
118         show_vwindow = show_awindow = show_cwindow = show_gwindow = show_lwindow = 0;
119         plugindialog_w = plugindialog_h = 0;
120 //      presetdialog_w = presetdialog_h = 0;
121         keyframedialog_w = keyframedialog_h = 0;
122         keyframedialog_column1 = 0;
123         keyframedialog_column2 = 0;
124         keyframedialog_all = 0;
125         menueffect_w = menueffect_h = 0;
126         transitiondialog_w = transitiondialog_h = 0;
127 }
128
129 MainSession::~MainSession()
130 {
131         delete drag_pluginservers;
132         delete drag_assets;
133         delete drag_auto_gang;
134         delete drag_clips;
135         delete drag_edits;
136         if( drag_group )
137                 drag_group->remove_user();
138 }
139
140 void MainSession::boundaries()
141 {
142         lwindow_x = MAX(0, lwindow_x);
143         lwindow_y = MAX(0, lwindow_y);
144         mwindow_x = MAX(0, mwindow_x);
145         mwindow_y = MAX(0, mwindow_y);
146         cwindow_x = MAX(0, cwindow_x);
147         cwindow_y = MAX(0, cwindow_y);
148         vwindow_x = MAX(0, vwindow_x);
149         vwindow_y = MAX(0, vwindow_y);
150         awindow_x = MAX(0, awindow_x);
151         awindow_y = MAX(0, awindow_y);
152         gwindow_x = MAX(0, gwindow_x);
153         gwindow_y = MAX(0, gwindow_y);
154         rwindow_x = MAX(0, rwindow_x);
155         rwindow_y = MAX(0, rwindow_y);
156         rmonitor_x = MAX(0, rmonitor_x);
157         rmonitor_y = MAX(0, rmonitor_y);
158         CLAMP(cwindow_controls, 0, 1);
159 }
160
161 void MainSession::save_x11_host(int play_config, const char *x11_host)
162 {
163         strcpy(!play_config ? a_x11_host : b_x11_host, x11_host);
164 }
165
166 // set default x11 host, window_config, return screens
167 int MainSession::set_default_x11_host(int win_config)
168 {
169         if( win_config < 0 ) win_config = window_config;
170         const char *x11_host = win_config!=1 ? a_x11_host : b_x11_host;
171         BC_DisplayInfo display_info(x11_host,0);
172         int screen = display_info.get_screen();
173         if( screen < 0 && strcmp(a_x11_host, b_x11_host) ) {
174                 win_config = win_config==1 ? 0 : 1;
175                 x11_host = win_config!=1 ? a_x11_host : b_x11_host;
176                 display_info.init_window(x11_host,0);
177                 screen = display_info.get_screen();
178         }
179         if( screen < 0 ) {
180                 x11_host = "";
181                 display_info.init_window(x11_host,1);
182         }
183         int screens = 1;
184         if( display_info.get_screen_count() > 1 )
185                 screens = strcmp(a_x11_host, b_x11_host) != 0 ? 2 : 1;
186         window_config = win_config;
187         BC_Window::set_default_x11_host(x11_host);
188         return screens;
189 }
190
191 void MainSession::default_window_positions(int window_config)
192 {
193 // 0 - all windows on a, playback_config a
194 // 1 - all windows on b, playback_config b
195 // 2 - all windows on a, except composer on b, playback_config b
196         int screens = set_default_x11_host(window_config);
197         mwindow->set_screens(screens);
198
199         BC_DisplayInfo display_info(BC_Window::get_default_x11_host());
200 // Get defaults based on root window size
201         int root_x = 0;
202         int root_y = 0;
203         int root_w = display_info.get_root_w();
204         int root_h = display_info.get_root_h();
205
206         int border_left = display_info.get_left_border();
207         int border_right = display_info.get_right_border();
208         int border_top = display_info.get_top_border();
209         int border_bottom = display_info.get_bottom_border();
210
211         int dual_head = screens > 1 ? 1 : 0;
212         int left_w = 0, left_h = 0, right_w = 0;
213         int xin_screens = display_info.get_xinerama_screens();
214         if( xin_screens > 1 ) {
215                 dual_head = 1;
216                 int x, y, w, h;
217                 for( int s=0; s<xin_screens; ++s ) {
218                         if( display_info.xinerama_geometry(s, x, y, w, h) )
219                                 continue;
220                         if( !y && !x ) {
221                                 left_w = w;  left_h = h;
222                                 break;
223                         }
224                 }
225                 if( left_w > 0 ) {
226                         int min_x = INT_MAX;
227                         for( int s=0; s<xin_screens; ++s ) {
228                                 if( display_info.xinerama_geometry(s, x, y, w, h) )
229                                         continue;
230                                 if( !y && x >= left_w && x < min_x ) {
231                                         min_x = x;
232                                         right_w = w;
233                                         screens = 2;
234                                 }
235                         }
236                         if( window_config == 1 ) {
237                                 root_x = min_x;
238                                 root_w = right_w;
239                         }
240                         else {
241                                 root_w = left_w;
242                                 root_h = left_h;
243                         }
244                 }
245         }
246 // Wider than 16:9, narrower than dual head
247         else if( screens < 2 && (float)root_w / root_h > 1.8 ) {
248                 dual_head = 1;
249                 switch( root_h ) {
250                 case 600:  right_w = 800;   break;
251                 case 720:  right_w = 1280;  break;
252                 case 1024: right_w = 1280;  break;
253                 case 1200: right_w = 1600;  break;
254                 case 1080: right_w = 1920;  break;
255                 default:
256                         dual_head = 0;
257                         break;
258                 }
259                 if( dual_head ) {
260                         if( window_config == 1 ) {
261                                 root_x = root_w - right_w;
262                                 root_w = right_w;
263                         }
264                         else {
265                                 // use same aspect ratio to compute left height
266                                 root_w -= right_w;
267                                 root_h = (root_w*root_h) / right_w;
268                         }
269                 }
270         }
271
272         vwindow_x = root_x;
273         vwindow_y = root_y;
274         vwindow_w = root_w / 2 - border_left - border_right;
275         vwindow_h = root_h * 6 / 10 - border_top - border_bottom;
276
277         int b_root_w = root_w;
278         int b_root_h = root_h;
279         if( !dual_head || window_config != 2 ) {
280                 cwindow_x = root_x + root_w / 2;
281                 cwindow_y = root_y;
282                 cwindow_w = vwindow_w;
283                 cwindow_h = vwindow_h;
284         }
285         else {
286 // Get defaults based on root window size
287                 BC_DisplayInfo b_display_info(b_x11_host);
288                 b_root_w = b_display_info.get_root_w();
289                 b_root_h = b_display_info.get_root_h();
290                 cwindow_x = xS(50);
291                 cwindow_y = yS(50);
292                 cwindow_w = b_root_w-xS(100);
293                 cwindow_h = b_root_h-yS(100);
294         }
295
296         ctool_x = cwindow_x + cwindow_w / 2;
297         ctool_y = cwindow_y + cwindow_h / 2;
298
299         mwindow_x = root_x;
300         mwindow_y = vwindow_y + vwindow_h + border_top + border_bottom;
301         mwindow_w = root_w * 2 / 3 - border_left - border_right;
302         mwindow_h = root_h - mwindow_y - border_top - border_bottom;
303
304         awindow_x = mwindow_x + border_left + border_right + mwindow_w;
305         awindow_y = mwindow_y;
306         awindow_w = root_x + root_w - awindow_x - border_left - border_right;
307         awindow_h = mwindow_h;
308
309         bwindow_w = xS(600);
310         bwindow_h = yS(360);
311
312         ewindow_w = xS(640);
313         ewindow_h = yS(240);
314
315         channels_x = 0;
316         channels_y = 0;
317         picture_x = 0;
318         picture_y = 0;
319         scope_x = 0;
320         scope_y = 0;
321         scope_w = xS(640);
322         scope_h = yS(320);
323         histogram_x = 0;
324         histogram_y = 0;
325         histogram_w = xS(320);
326         histogram_h = yS(480);
327         record_scope = 0;
328         use_hist = 1;
329         use_wave = 1;
330         use_vector = 1;
331         use_hist_parade = 1;
332         use_wave_parade = 1;
333         use_wave_gain = 5;
334         use_vect_gain = 5;
335         use_smooth = 1;
336         use_refresh = 0;
337         use_release = 0;
338         use_graticule = 0;
339
340         if(mwindow->edl)
341                 lwindow_w = MeterPanel::get_meters_width(mwindow->theme,
342                         mwindow->edl->session->audio_channels,
343                         1);
344         else
345                 lwindow_w = xS(100);
346
347         lwindow_y = 0;
348         lwindow_x = root_w - lwindow_w;
349         lwindow_h = mwindow_y;
350
351         rwindow_x = root_x;
352         rwindow_y = root_y;
353         rwindow_h = yS(500);
354         rwindow_w = xS(650);
355
356         cswindow_x = root_x;
357         cswindow_y = root_y;
358         cswindow_w = xS(1280);
359         cswindow_h = yS(600);
360
361         if( !dual_head || window_config != 2 ) {
362                 rmonitor_x = rwindow_x + rwindow_w + xS(10);
363                 rmonitor_y = rwindow_y;
364                 rmonitor_w = root_x + root_w - rmonitor_x;
365                 rmonitor_h = rwindow_h;
366         }
367         else {
368                 rmonitor_x = cswindow_x = xS(50);
369                 rmonitor_y = cswindow_y = yS(50);
370                 rmonitor_w = b_root_w-xS(100);
371                 rmonitor_h = b_root_h-yS(100);
372                 if( cswindow_w < rmonitor_w ) cswindow_w = rmonitor_w;
373                 if( cswindow_h < rmonitor_h ) cswindow_h = rmonitor_h;
374         }
375
376         swindow_x = root_x;
377         swindow_y = root_y;
378         swindow_w = xS(600);
379         swindow_h = yS(400);
380
381         batchrender_w = xS(750);
382         batchrender_h = yS(400);
383         batchrender_x = root_w / 2 - batchrender_w / 2;
384         batchrender_y = root_h / 2 - batchrender_h / 2;
385 }
386
387 int MainSession::load_defaults(BC_Hash *defaults)
388 {
389 // Setup main windows
390         char *a_host = defaults->get("A_X11_HOST", a_x11_host);
391         if( a_host != a_x11_host )
392                 strcpy(a_x11_host, defaults->get("A_X11_HOST", a_x11_host));
393         char *b_host = defaults->get("B_X11_HOST", b_x11_host);
394         if( b_host != b_x11_host )
395                 strcpy(b_x11_host, defaults->get("B_X11_HOST", b_x11_host));
396         window_config = defaults->get("WINDOW_CONFIG", window_config);
397         default_window_positions(window_config);
398
399         vwindow_x = defaults->get("VWINDOW_X", vwindow_x);
400         vwindow_y = defaults->get("VWINDOW_Y", vwindow_y);
401         vwindow_w = defaults->get("VWINDOW_W", vwindow_w);
402         vwindow_h = defaults->get("VWINDOW_H", vwindow_h);
403
404
405         cwindow_x = defaults->get("CWINDOW_X", cwindow_x);
406         cwindow_y = defaults->get("CWINDOW_Y", cwindow_y);
407         cwindow_w = defaults->get("CWINDOW_W", cwindow_w);
408         cwindow_h = defaults->get("CWINDOW_H", cwindow_h);
409
410         ctool_x = defaults->get("CTOOL_X", ctool_x);
411         ctool_y = defaults->get("CTOOL_Y", ctool_y);
412
413         gwindow_x = defaults->get("GWINDOW_X", gwindow_x);
414         gwindow_y = defaults->get("GWINDOW_Y", gwindow_y);
415
416         mwindow_x = defaults->get("MWINDOW_X", mwindow_x);
417         mwindow_y = defaults->get("MWINDOW_Y", mwindow_y);
418         mwindow_w = defaults->get("MWINDOW_W", mwindow_w);
419         mwindow_h = defaults->get("MWINDOW_H", mwindow_h);
420
421         lwindow_x = defaults->get("LWINDOW_X", lwindow_x);
422         lwindow_y = defaults->get("LWINDOW_Y", lwindow_y);
423         lwindow_w = defaults->get("LWINDOW_W", lwindow_w);
424         lwindow_h = defaults->get("LWINDOW_H", lwindow_h);
425
426
427         awindow_x = defaults->get("AWINDOW_X", awindow_x);
428         awindow_y = defaults->get("AWINDOW_Y", awindow_y);
429         awindow_w = defaults->get("AWINDOW_W", awindow_w);
430         awindow_h = defaults->get("AWINDOW_H", awindow_h);
431
432         ewindow_w = defaults->get("EWINDOW_W", ewindow_w);
433         ewindow_h = defaults->get("EWINDOW_H", ewindow_h);
434
435         channels_x = defaults->get("CHANNELS_X", channels_x);
436         channels_y = defaults->get("CHANNELS_Y", channels_y);
437         picture_x = defaults->get("PICTURE_X", picture_x);
438         picture_y = defaults->get("PICTURE_Y", picture_y);
439         scope_x = defaults->get("SCOPE_X", scope_x);
440         scope_y = defaults->get("SCOPE_Y", scope_y);
441         scope_w = defaults->get("SCOPE_W", scope_w);
442         scope_h = defaults->get("SCOPE_H", scope_h);
443         histogram_x = defaults->get("HISTOGRAM_X", histogram_x);
444         histogram_y = defaults->get("HISTOGRAM_Y", histogram_y);
445         histogram_w = defaults->get("HISTOGRAM_W", histogram_w);
446         histogram_h = defaults->get("HISTOGRAM_H", histogram_h);
447         record_scope = defaults->get("RECORD_SCOPE", record_scope);
448         use_hist = defaults->get("USE_HIST", use_hist);
449         use_wave = defaults->get("USE_WAVE", use_wave);
450         use_vector = defaults->get("USE_VECTOR", use_vector);
451         use_hist_parade = defaults->get("USE_HIST_PARADE", use_hist_parade);
452         use_wave_parade = defaults->get("USE_WAVE_PARADE", use_wave_parade);
453         use_wave_gain = defaults->get("USE_WAVE_GAIN", use_wave_gain);
454         use_vect_gain = defaults->get("USE_VECT_GAIN", use_vect_gain);
455         use_smooth = defaults->get("USE_SMOOTH", use_smooth);
456         use_refresh = defaults->get("USE_REFRESH", use_refresh);
457         use_release = defaults->get("USE_RELEASE", use_release);
458         use_graticule = defaults->get("USE_GRATICULE", use_graticule);
459
460 //printf("MainSession::load_defaults 1\n");
461
462 // Other windows
463         afolders_w = defaults->get("ABINS_W", xS(200));
464
465         bwindow_w = defaults->get("BWINDOW_W", bwindow_w);
466         bwindow_h = defaults->get("BWINDOW_H", bwindow_h);
467
468         rwindow_x = defaults->get("RWINDOW_X", rwindow_x);
469         rwindow_y = defaults->get("RWINDOW_Y", rwindow_y);
470         rwindow_w = defaults->get("RWINDOW_W", rwindow_w);
471         rwindow_h = defaults->get("RWINDOW_H", rwindow_h);
472
473         cswindow_x = defaults->get("CSWINDOW_X", cswindow_x);
474         cswindow_y = defaults->get("CSWINDOW_Y", cswindow_y);
475         cswindow_w = defaults->get("CSWINDOW_W", cswindow_w);
476         cswindow_h = defaults->get("CSWINDOW_H", cswindow_h);
477
478         swindow_x = defaults->get("SWINDOW_X", swindow_x);
479         swindow_y = defaults->get("SWINDOW_Y", swindow_y);
480         swindow_w = defaults->get("SWINDOW_W", swindow_w);
481         swindow_h = defaults->get("SWINDOW_H", swindow_h);
482
483         rmonitor_x = defaults->get("RMONITOR_X", rmonitor_x);
484         rmonitor_y = defaults->get("RMONITOR_Y", rmonitor_y);
485         rmonitor_w = defaults->get("RMONITOR_W", rmonitor_w);
486         rmonitor_h = defaults->get("RMONITOR_H", rmonitor_h);
487
488         batchrender_x = defaults->get("BATCHRENDER_X", batchrender_x);
489         batchrender_y = defaults->get("BATCHRENDER_Y", batchrender_y);
490         batchrender_w = defaults->get("BATCHRENDER_W", batchrender_w);
491         batchrender_h = defaults->get("BATCHRENDER_H", batchrender_h);
492
493         show_vwindow = defaults->get("SHOW_VWINDOW", 1);
494         show_awindow = defaults->get("SHOW_AWINDOW", 1);
495         show_cwindow = defaults->get("SHOW_CWINDOW", 1);
496         show_lwindow = defaults->get("SHOW_LWINDOW", 0);
497         show_gwindow = defaults->get("SHOW_GWINDOW", 0);
498
499         cwindow_controls = defaults->get("CWINDOW_CONTROLS", cwindow_controls);
500
501         plugindialog_w = defaults->get("PLUGINDIALOG_W", xS(510));
502         plugindialog_h = defaults->get("PLUGINDIALOG_H", yS(415));
503 //      presetdialog_w = defaults->get("PRESETDIALOG_W", xS(510));
504 //      presetdialog_h = defaults->get("PRESETDIALOG_H", yS(415));
505         keyframedialog_w = defaults->get("KEYFRAMEDIALOG_W", xS(320));
506         keyframedialog_h = defaults->get("KEYFRAMEDIALOG_H", yS(415));
507         keyframedialog_column1 = defaults->get("KEYFRAMEDIALOG_COLUMN1", xS(150));
508         keyframedialog_column2 = defaults->get("KEYFRAMEDIALOG_COLUMN2", xS(100));
509         keyframedialog_all = defaults->get("KEYFRAMEDIALOG_ALL", 0);
510         menueffect_w = defaults->get("MENUEFFECT_W", xS(580));
511         menueffect_h = defaults->get("MENUEFFECT_H", yS(350));
512         transitiondialog_w = defaults->get("TRANSITIONDIALOG_W", xS(320));
513         transitiondialog_h = defaults->get("TRANSITIONDIALOG_H", yS(512));
514
515         current_tip = defaults->get("CURRENT_TIP", current_tip);
516         actual_frame_rate = defaults->get("ACTUAL_FRAME_RATE", (float)-1);
517         title_bar_alpha = defaults->get("TITLE_BAR_ALPHA", (float)1);
518
519         boundaries();
520         return 0;
521 }
522
523 int MainSession::save_defaults(BC_Hash *defaults)
524 {
525         defaults->update("A_X11_HOST", a_x11_host);
526         defaults->update("B_X11_HOST", b_x11_host);
527         defaults->update("WINDOW_CONFIG", window_config);
528 // Window positions
529         defaults->update("MWINDOW_X", mwindow_x);
530         defaults->update("MWINDOW_Y", mwindow_y);
531         defaults->update("MWINDOW_W", mwindow_w);
532         defaults->update("MWINDOW_H", mwindow_h);
533
534         defaults->update("LWINDOW_X", lwindow_x);
535         defaults->update("LWINDOW_Y", lwindow_y);
536         defaults->update("LWINDOW_W", lwindow_w);
537         defaults->update("LWINDOW_H", lwindow_h);
538
539         defaults->update("VWINDOW_X", vwindow_x);
540         defaults->update("VWINDOW_Y", vwindow_y);
541         defaults->update("VWINDOW_W", vwindow_w);
542         defaults->update("VWINDOW_H", vwindow_h);
543
544         defaults->update("CWINDOW_X", cwindow_x);
545         defaults->update("CWINDOW_Y", cwindow_y);
546         defaults->update("CWINDOW_W", cwindow_w);
547         defaults->update("CWINDOW_H", cwindow_h);
548
549         defaults->update("CTOOL_X", ctool_x);
550         defaults->update("CTOOL_Y", ctool_y);
551
552         defaults->update("GWINDOW_X", gwindow_x);
553         defaults->update("GWINDOW_Y", gwindow_y);
554
555         defaults->update("AWINDOW_X", awindow_x);
556         defaults->update("AWINDOW_Y", awindow_y);
557         defaults->update("AWINDOW_W", awindow_w);
558         defaults->update("AWINDOW_H", awindow_h);
559
560         defaults->update("BWINDOW_W", bwindow_w);
561         defaults->update("BWINDOW_H", bwindow_h);
562
563         defaults->update("EWINDOW_W", ewindow_w);
564         defaults->update("EWINDOW_H", ewindow_h);
565
566         defaults->update("CHANNELS_X", channels_x);
567         defaults->update("CHANNELS_Y", channels_y);
568         defaults->update("PICTURE_X", picture_x);
569         defaults->update("PICTURE_Y", picture_y);
570         defaults->update("SCOPE_X", scope_x);
571         defaults->update("SCOPE_Y", scope_y);
572         defaults->update("SCOPE_W", scope_w);
573         defaults->update("SCOPE_H", scope_h);
574         defaults->update("HISTOGRAM_X", histogram_x);
575         defaults->update("HISTOGRAM_Y", histogram_y);
576         defaults->update("HISTOGRAM_W", histogram_w);
577         defaults->update("HISTOGRAM_H", histogram_h);
578         defaults->update("RECORD_SCOPE", record_scope);
579         defaults->update("USE_HIST", use_hist);
580         defaults->update("USE_WAVE", use_wave);
581         defaults->update("USE_VECTOR", use_vector);
582         defaults->update("USE_HIST_PARADE", use_hist_parade);
583         defaults->update("USE_WAVE_PARADE", use_wave_parade);
584         defaults->update("USE_WAVE_GAIN", use_wave_gain);
585         defaults->update("USE_VECT_GAIN", use_vect_gain);
586         defaults->update("USE_SMOOTH", use_smooth);
587         defaults->update("USE_REFRESH", use_refresh);
588         defaults->update("USE_RELEASE", use_release);
589         defaults->update("USE_GRATICULE", use_graticule);
590
591         defaults->update("ABINS_W", afolders_w);
592
593         defaults->update("RMONITOR_X", rmonitor_x);
594         defaults->update("RMONITOR_Y", rmonitor_y);
595         defaults->update("RMONITOR_W", rmonitor_w);
596         defaults->update("RMONITOR_H", rmonitor_h);
597
598         defaults->update("RWINDOW_X", rwindow_x);
599         defaults->update("RWINDOW_Y", rwindow_y);
600         defaults->update("RWINDOW_W", rwindow_w);
601         defaults->update("RWINDOW_H", rwindow_h);
602
603         defaults->update("CSWINDOW_X", cswindow_x);
604         defaults->update("CSWINDOW_Y", cswindow_y);
605         defaults->update("CSWINDOW_W", cswindow_w);
606         defaults->update("CSWINDOW_H", cswindow_h);
607
608         defaults->update("SWINDOW_X", swindow_x);
609         defaults->update("SWINDOW_Y", swindow_y);
610         defaults->update("SWINDOW_W", swindow_w);
611         defaults->update("SWINDOW_H", swindow_h);
612
613         defaults->update("BATCHRENDER_X", batchrender_x);
614         defaults->update("BATCHRENDER_Y", batchrender_y);
615         defaults->update("BATCHRENDER_W", batchrender_w);
616         defaults->update("BATCHRENDER_H", batchrender_h);
617
618         defaults->update("SHOW_VWINDOW", show_vwindow);
619         defaults->update("SHOW_AWINDOW", show_awindow);
620         defaults->update("SHOW_CWINDOW", show_cwindow);
621         defaults->update("SHOW_LWINDOW", show_lwindow);
622         defaults->update("SHOW_GWINDOW", show_gwindow);
623
624         defaults->update("CWINDOW_CONTROLS", cwindow_controls);
625
626         defaults->update("PLUGINDIALOG_W", plugindialog_w);
627         defaults->update("PLUGINDIALOG_H", plugindialog_h);
628 //      defaults->update("PRESETDIALOG_W", presetdialog_w);
629 //      defaults->update("PRESETDIALOG_H", presetdialog_h);
630         defaults->update("KEYFRAMEDIALOG_W", keyframedialog_w);
631         defaults->update("KEYFRAMEDIALOG_H", keyframedialog_h);
632         defaults->update("KEYFRAMEDIALOG_COLUMN1", keyframedialog_column1);
633         defaults->update("KEYFRAMEDIALOG_COLUMN2", keyframedialog_column2);
634         defaults->update("KEYFRAMEDIALOG_ALL", keyframedialog_all);
635
636         defaults->update("MENUEFFECT_W", menueffect_w);
637         defaults->update("MENUEFFECT_H", menueffect_h);
638
639         defaults->update("TRANSITIONDIALOG_W", transitiondialog_w);
640         defaults->update("TRANSITIONDIALOG_H", transitiondialog_h);
641
642         defaults->update("ACTUAL_FRAME_RATE", actual_frame_rate);
643         defaults->update("TITLE_BAR_ALPHA", title_bar_alpha);
644         defaults->update("CURRENT_TIP", current_tip);
645
646
647         return 0;
648 }
649
650 Track *MainSession::drag_handle_track()
651 {
652         Track *track = 0;
653         switch( current_operation ) {
654         case DRAG_EDITHANDLE1:
655         case DRAG_EDITHANDLE2:
656                 track = drag_edit->edits->track;
657                 break;
658         case DRAG_PLUGINHANDLE1:
659         case DRAG_PLUGINHANDLE2:
660                 track = drag_plugin->edits->track;
661                 break;
662         case DRAG_TRANSNHANDLE1:
663         case DRAG_TRANSNHANDLE2:
664                 track = drag_transition->edits->track;
665                 break;
666         }
667         return track;
668 }
669
670 void MainSession::update_clip_number()
671 {
672         int clip_no = 0;
673         for( int i=mwindow->edl->clips.size(); --i>=0; ) {
674                 EDL *clip_edl = mwindow->edl->clips[i];
675                 int no = 0;
676                 if( sscanf(clip_edl->local_session->clip_title,_("Clip %d"),&no) == 1 )
677                         if( no > clip_no ) clip_no = no;
678         }
679         clip_number = clip_no+1;
680 }
681
682 int MainSession::load_file(const char *path)
683 {
684         int ret = 1;
685         FILE *fp = fopen(path,"r");
686         if( fp ) {
687                 BC_Hash defaults;
688                 defaults.load_file(fp);
689                 load_defaults(&defaults);
690                 fclose(fp);
691                 ret = 0;
692         }
693         return ret;
694 }
695
696 int MainSession::save_file(const char *path)
697 {
698         int ret = 1;
699         FILE *fp = fopen(path,"w");
700         if( fp ) {
701                 BC_Hash defaults;
702                 save_defaults(&defaults);
703                 defaults.save_file(fp);
704                 fclose(fp);
705                 ret = 0;
706         }
707         return ret;
708 }
709