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