rework svg plugin, fast flash flush, init resize pixmaps, test edl version
[goodguy/history.git] / cinelerra-5.1 / cinelerra / mwindow.C
index 890aaac6b46261ef70b4ced6b4905490c5e7b653..15b29e5c4ce1d06b5b1bfbd89e34bf89f69e0df0 100644 (file)
 #include "transition.h"
 #include "transportque.h"
 #include "vframe.h"
+#include "versioninfo.h"
 #include "videodevice.inc"
 #include "videowindow.h"
 #include "vplayback.h"
@@ -213,6 +214,7 @@ MWindow::MWindow()
        restart_status = 0;
        screens = 1;
        in_destructor = 0;
+       warn_version = 1;
 }
 
 
@@ -235,6 +237,7 @@ MWindow::~MWindow()
        delete create_bd;       create_bd = 0;
        delete create_dvd;      create_dvd = 0;
        delete batch_render;    batch_render = 0;
+       delete render;          render = 0;
        commit_commercial();
        if( commercials && !commercials->remove_user() ) commercials = 0;
 
@@ -292,15 +295,13 @@ MWindow::~MWindow()
        finit_error();
        keyframe_threads->remove_all_objects();
        colormodels.remove_all_objects();
-       delete gui;             gui = 0;
-       delete render;          render = 0;
        delete awindow;         awindow = 0;
        delete lwindow;         lwindow = 0;
        delete twindow;         twindow = 0;
        delete wwindow;         wwindow = 0;
        delete gwindow;         gwindow = 0;
-       // must be last or nouveau chokes
        delete cwindow;         cwindow = 0;
+       delete gui;             gui = 0;
        //delete file_server;  file_server = 0; // reusable
        delete mainindexes;     mainindexes = 0;
        delete mainprogress;    mainprogress = 0;
@@ -340,8 +341,8 @@ MWindow::~MWindow()
 
 void MWindow::quit(int unlock)
 {
-       stop_playback(1);
        if(unlock) gui->unlock_window();
+       stop_playback(1);
 
        brender_lock->lock("MWindow::quit");
        delete brender;         brender = 0;
@@ -369,7 +370,7 @@ void MWindow::create_defaults_path(char *string, const char *config_file)
 // set the .bcast path
        FileSystem fs;
 
-       sprintf(string, "%s", BCASTDIR);
+       sprintf(string, "%s/", File::get_config_path());
        fs.complete_path(string);
        if(!fs.is_dir(string))
                fs.create_dir(string);
@@ -379,43 +380,46 @@ void MWindow::create_defaults_path(char *string, const char *config_file)
 }
 const char *MWindow::default_std()
 {
-       int fd, i, l = 0;
-       char buf[BCTEXTLEN];
-        char *p;
+       char buf[BCTEXTLEN], *p = 0;
 
-       if((fd = open(TIMEZONE_NAME, O_RDONLY)) >= 0)
-       {
-               l = read(fd, buf, BCTEXTLEN);
+       int fd = open(TIMEZONE_NAME, O_RDONLY);
+       if( fd >= 0 ) {
+               int l = read(fd, buf, sizeof(buf)-1);
                close(fd);
-               if(l > 0)
-               {
+               if( l > 0 ) {
+                       if( buf[l-1] == '\n' ) --l;
                        buf[l] = 0;
-                       if(buf[l - 1] == '\n')
-                               buf[--l] = 0;
+                       p = buf;
                }
-               p = buf;
        }
-       if(l < 1)
-       {
-               if((l = readlink(LOCALTIME_LINK, buf, BCTEXTLEN)) > 0)
-               {
+       if( !p ) {
+               int l = readlink(LOCALTIME_LINK, buf, sizeof(buf)-1);
+               if( l > 0 ) {
                        buf[l] = 0;
-                       if( (p=strstr(buf, ZONEINFO_STR)) != 0 )
-                       {
-                               p += strlen(ZONEINFO_STR);
-                               l = strlen(p);
-                       }
-                       else
-                               l = 0;
+                       if( !(p=strstr(buf, ZONEINFO_STR)) != 0 ) return "PAL";
+                       p += strlen(ZONEINFO_STR);
                }
        }
-       if(l)
-       {
-               for(i = 0; ntsc_zones[i]; i++)
-               if(strcmp(ntsc_zones[i], p) == 0)
-                       return "NTSC";
+
+       if( p ) {
+               for( int i=0; ntsc_zones[i]; ++i ) {
+                       if( !strcmp(ntsc_zones[i], p) )
+                               return "NTSC";
+               }
+       }
+
+       p = getenv("TZ");
+       if( p ) {
+               for( int i=0; ntsc_zones[i]; ++i ) {
+                       if( !strcmp(ntsc_zones[i], p) )
+                               return "NTSC";
+               }
        }
-       return "PAL";
+
+//__timezone: Seconds west of UTC.  240sec/deg
+       double tz_deg = -__timezone / 240.;
+// from Honolulu = -10, to New York = -5, 15deg/hr   lat -150..-75
+       return tz_deg >= -10*15 && tz_deg <= -5*15 ? "NTSC" : "PAL";
 }
 
 void MWindow::fill_preset_defaults(const char *preset, EDLSession *session)
@@ -424,7 +428,7 @@ void MWindow::fill_preset_defaults(const char *preset, EDLSession *session)
 
        for(fpr = &format_presets[0]; fpr->name; fpr++)
        {
-               if(strcmp(fpr->name, preset) == 0)
+               if(strcmp(_(fpr->name), preset) == 0)
                {
                        session->audio_channels = fpr->audio_channels;
                        session->audio_tracks = fpr->audio_tracks;
@@ -447,7 +451,7 @@ const char *MWindow::get_preset_name(int index)
 {
        if(index < 0 || index >= (int)MAX_NUM_PRESETS)
                return "Error";
-       return format_presets[index].name;
+       return _(format_presets[index].name);
 }
 
 
@@ -594,8 +598,7 @@ int MWindow::init_ladspa_plugins(MWindow *mwindow, Preferences *preferences)
        char *path = getenv("LADSPA_PATH");
        char ladspa_path[BCTEXTLEN];
        if( !path ) {
-               get_exe_path(ladspa_path);
-               strcat(ladspa_path, "/ladspa");
+               strncpy(ladspa_path, File::get_ladspa_path(), sizeof(ladspa_path));
                path = ladspa_path;
        }
        for( int len=0; *path; path+=len ) {
@@ -900,6 +903,11 @@ void MWindow::show_warning(int *do_warning, const char *text)
        wwindow->show_warning(do_warning, text);
 }
 
+int MWindow::wait_warning()
+{
+       return wwindow->wait_result();
+}
+
 void MWindow::init_theme()
 {
        Timer timer;
@@ -1493,7 +1501,29 @@ SET_TRACE
 if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
                                xml_file.read_from_file(filenames->get(i));
 if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
-
+                               const char *cin_version = 0;
+                               while( !xml_file.read_tag() ) {
+                                       if( xml_file.tag.title_is("EDL") ) {
+                                               cin_version = xml_file.tag.get_property("VERSION");
+                                               break;
+                                       }
+                               }
+                               xml_file.rewind();
+                               if( !cin_version ) {
+                                       eprintf(_("XML file %s\n not from cinelerra."),filenames->get(i));
+                                       char string[BCTEXTLEN];
+                                       sprintf(string,_("Unknown %s"), filenames->get(i));
+                                       gui->show_message(string);
+                                       result = 1;
+                                       break;
+                               }
+                               if( strcmp(cin_version, CINELERRA_VERSION) ) {
+                                       char string[BCTEXTLEN];
+                                       snprintf(string, sizeof(string),
+                                                _("Warning: XML from cinelerra version %s\n"
+                                               "Session data may be incompatible."), cin_version);
+                                       show_warning(&preferences->warn_version, string);
+                               }
                                if(load_mode == LOADMODE_NESTED)
                                {
 // Load temporary EDL for nesting.
@@ -2431,7 +2461,7 @@ void MWindow::hide_plugin(Plugin *plugin, int lock)
                        ptr->hide_gui();
                        delete_plugin(ptr);
 //sleep(1);
-//                     return;
+                       return;
                }
        }
        if(lock) plugin_gui_lock->unlock();
@@ -2873,17 +2903,18 @@ void MWindow::save_backup()
        FileXML file;
        edl->optimize();
        edl->set_path(session->filename);
-       edl->save_xml(&file, BACKUP_PATH, 0, 0);
+       char backup_path[BCTEXTLEN];
+       snprintf(backup_path, sizeof(backup_path), "%s/%s",
+               File::get_config_path(), BACKUP_FILE);
+       edl->save_xml(&file, backup_path, 0, 0);
        file.terminate_string();
-       char path[BCTEXTLEN];
        FileSystem fs;
-       strcpy(path, BACKUP_PATH);
-       fs.complete_path(path);
+       fs.complete_path(backup_path);
 
-       if(file.write_to_file(path))
+       if(file.write_to_file(backup_path))
        {
                char string2[256];
-               sprintf(string2, _("Couldn't open %s for writing."), BACKUP_PATH);
+               sprintf(string2, _("Couldn't open %s for writing."), backup_path);
                gui->show_message(string2);
        }
 }
@@ -2893,13 +2924,14 @@ void MWindow::load_backup()
        ArrayList<char*> path_list;
        path_list.set_array_delete();
        char *out_path;
-       char string[BCTEXTLEN];
-       strcpy(string, BACKUP_PATH);
+       char backup_path[BCTEXTLEN];
+       snprintf(backup_path, sizeof(backup_path), "%s/%s",
+               File::get_config_path(), BACKUP_FILE);
        FileSystem fs;
-       fs.complete_path(string);
+       fs.complete_path(backup_path);
 
-       path_list.append(out_path = new char[strlen(string) + 1]);
-       strcpy(out_path, string);
+       path_list.append(out_path = new char[strlen(backup_path) + 1]);
+       strcpy(out_path, backup_path);
 
        load_filenames(&path_list, LOADMODE_REPLACE, 0);
        edl->local_session->clip_title[0] = 0;
@@ -2922,6 +2954,9 @@ int MWindow::create_aspect_ratio(float &w, float &h, int width, int height)
 {
        w = 1;  h = 1;
        if(!width || !height) return 1;
+       if( width == 720 && (height == 480 || height == 576) ) {
+               w = 4;  h = 3;  return 0; // for NTSC and PAL
+       }
        double ar = (double)width / height;
 // square-ish pixels
        if( EQUIV(ar, 1.0000) ) return 0;