olaf neophyte and de.po updates, valgrind tweaks, delete green lady, inkscape dpi=96
[goodguy/history.git] / cinelerra-5.1 / cinelerra / main.C
index f54edcec0b904d6bb38b65187af9e0fea35d8684..472578718657664d7b230ca445cd08622e8c7931 100644 (file)
@@ -18,6 +18,7 @@
  *
  */
 
+#include "aboutprefs.h"
 #include "arraylist.h"
 #include "batchrender.h"
 #include "bcsignals.h"
 #include "pluginserver.h"
 #include "preferences.h"
 #include "renderfarmclient.h"
+#include "units.h"
 #include "versioninfo.h"
 
 #include <locale.h>
 #include <stdlib.h>
 #include <string.h>
 
+#ifdef LEAKER
+#define STRC(v) printf("==new %p from %p sz %jd\n", v, __builtin_return_address(0), n)
+#define STRD(v) printf("==del %p from %p\n", v, __builtin_return_address(0))
+void *operator new(size_t n) { void *vp = malloc(n); STRC(vp); bzero(vp,n); return vp; }
+void operator delete(void *t) { STRD(t); free(t); }
+void operator delete(void *t,size_t n) { STRD(t); free(t); }
+void *operator new[](size_t n) { void *vp = malloc(n); STRC(vp); bzero(vp,n); return vp; }
+void operator delete[](void *t) { STRD(t); free(t); }
+void operator delete[](void *t,size_t n) { STRD(t); free(t); }
+#endif
+
 enum
 {
        DO_GUI,
@@ -76,7 +89,7 @@ public:
 //PRINT_TRACE
                mwindow->load_filenames(filenames, LOADMODE_REPLACE);
 //PRINT_TRACE
-               if(filenames->size() == 1)
+               if( filenames->size() == 1 )
                        mwindow->gui->mainmenu->add_load(filenames->get(0));
 //PRINT_TRACE
                mwindow->gui->unlock_window();
@@ -87,6 +100,7 @@ public:
        ArrayList<char*> *filenames;
 };
 
+long cin_timezone;
 
 int main(int argc, char *argv[])
 {
@@ -95,6 +109,12 @@ int main(int argc, char *argv[])
        ArrayList<char*> filenames;
        FileSystem fs;
 
+       time_t st; time(&st);
+       struct tm ltm, gtm;
+       localtime_r(&st, &ltm);
+       gmtime_r(&st, &gtm);
+       int tzofs = ltm.tm_hour - gtm.tm_hour;
+       cin_timezone = tzofs * 60*60;
 
        int operation = DO_GUI;
        int deamon_port = DEAMON_PORT;
@@ -102,10 +122,11 @@ int main(int argc, char *argv[])
        char config_path[BCTEXTLEN];
        char batch_path[BCTEXTLEN];
        int nice_value = 20;
+       int load_perpetual = 1;
        config_path[0] = 0;
        batch_path[0] = 0;
        deamon_path[0] = 0;
-       EDL::id_lock = new Mutex("EDL::id_lock");
+       Units::init();
 
        File::init_cin_path();
        const char *locale_path = File::get_locale_path();
@@ -124,24 +145,24 @@ int main(int argc, char *argv[])
                // Extract from locale language & region
                char locbuf[32], *p;
                locbuf[0] = 0;
-               if((p = strchr(loc, '.')) != 0 && (p - loc) < (int)sizeof(locbuf)-1) {
+               if( (p = strchr(loc, '.')) != 0 && (p - loc) < (int)sizeof(locbuf)-1 ) {
                        strncpy(locbuf, loc, p - loc);
                        locbuf[p - loc] = 0;
                }
-               else if(strlen(loc) < sizeof(locbuf)-1)
+               else if( strlen(loc) < sizeof(locbuf)-1 )
                        strcpy(locbuf, loc);
 
                 // Locale 'C' does not give useful language info - assume en
-               if(!locbuf[0] || locbuf[0] == 'C')
+               if( !locbuf[0] || locbuf[0] == 'C' )
                        strcpy(locbuf, "en");
 
-               if((p = strchr(locbuf, '_')) && p - locbuf < LEN_LANG) {
+               if( (p = strchr(locbuf, '_')) && p - locbuf < LEN_LANG ) {
                        *p++ = 0;
                        strcpy(BC_Resources::language, locbuf);
-                       if(strlen(p) < LEN_LANG)
+                       if( strlen(p) < LEN_LANG )
                                strcpy(BC_Resources::region, p);
                }
-               else if(strlen(locbuf) < LEN_LANG)
+               else if( strlen(locbuf) < LEN_LANG )
                        strcpy(BC_Resources::language, locbuf);
        }
        else
@@ -154,88 +175,62 @@ int main(int argc, char *argv[])
        int load_backup = 0;
        int start_remote_control = 0;
 
-       for(int i = 1; i < argc; i++)
-       {
-               if(!strcmp(argv[i], "-h"))
-               {
+       for( int i = 1; i < argc; i++ ) {
+               if( !strcmp(argv[i], "-h") ) {
                        operation = DO_USAGE;
                }
-               else
-               if(!strcmp(argv[i], "-z"))
-               {
+               else if( !strcmp(argv[i], "-z") ) {
                        start_remote_control = 1;
                }
-               else
-               if(!strcmp(argv[i], "-r"))
-               {
+               else if( !strcmp(argv[i], "-r") ) {
                        operation = DO_BATCHRENDER;
-                       if(argc > i + 1)
-                       {
-                               if(argv[i + 1][0] != '-')
-                               {
+                       if( argc > i + 1 ) {
+                               if( argv[i + 1][0] != '-' ) {
                                        strcpy(batch_path, argv[i + 1]);
                                        i++;
                                }
                        }
                }
-               else
-               if(!strcmp(argv[i], "-c"))
-               {
-                       if(argc > i + 1)
-                       {
+               else if( !strcmp(argv[i], "-c") ) {
+                       if( argc > i + 1 ) {
                                strcpy(config_path, argv[i + 1]);
                                i++;
                        }
-                       else
-                       {
+                       else {
                                fprintf(stderr, _("%s: -c needs a filename.\n"), argv[0]);
                        }
                }
-               else
-               if(!strcmp(argv[i], "-d") || !strcmp(argv[i], "-f"))
-               {
-                       if(!strcmp(argv[i], "-d"))
-                               operation = DO_DEAMON;
-                       else
-                               operation = DO_DEAMON_FG;
-
-                       if(argc > i + 1)
-                       {
-                               if(atol(argv[i + 1]) > 0)
-                               {
+               else if( !strcmp(argv[i], "-d") || !strcmp(argv[i], "-f") ) {
+                       operation = !strcmp(argv[i], "-d") ? DO_DEAMON : DO_DEAMON_FG;
+                       if( argc > i + 1 ) {
+                               if( atol(argv[i + 1]) > 0 ) {
                                        deamon_port = atol(argv[i + 1]);
                                        i++;
                                }
                        }
                }
-               else
-               if(!strcmp(argv[i], "-b"))
-               {
+               else if( !strcmp(argv[i], "-b") ) {
                        operation = DO_BRENDER;
-                       if(i > argc - 2)
-                       {
+                       if( i > argc - 2 ) {
                                fprintf(stderr, _("-b may not be used by the user.\n"));
                                exit(1);
                        }
                        else
                                strcpy(deamon_path, argv[i + 1]);
                }
-               else
-               if(!strcmp(argv[i], "-n"))
-               {
-                       if(argc > i + 1)
-                       {
+               else if( !strcmp(argv[i], "-n") ) {
+                       if( argc > i + 1 ) {
                                nice_value = atol(argv[i + 1]);
                                i++;
                        }
                }
-               else
-               if(!strcmp(argv[i], "-x"))
-               {
+               else if( !strcmp(argv[i], "-x") ) {
                        load_backup = 1;
                }
-               else
-               {
+               else if( !strcmp(argv[i], "-S") ) {
+                       load_perpetual = 0;
+               }
+               else {
                        char *new_filename;
                        new_filename = new char[BCTEXTLEN];
                        strcpy(new_filename, argv[i]);
@@ -246,13 +241,10 @@ int main(int argc, char *argv[])
 
 
 
-       if(operation == DO_GUI ||
-               operation == DO_DEAMON ||
-               operation == DO_DEAMON_FG ||
-               operation == DO_USAGE ||
-               operation == DO_BATCHRENDER) {
+       if( operation == DO_GUI ||
+           operation == DO_DEAMON || operation == DO_DEAMON_FG ||
+           operation == DO_USAGE  || operation == DO_BATCHRENDER) {
 
-               fprintf(stderr, PROGRAM_NAME " " CINELERRA_VERSION);
 #ifndef REPOMAINTXT
 #define REPOMAINTXT ""
 #endif
@@ -262,40 +254,38 @@ int main(int argc, char *argv[])
 #ifndef COPYRIGHTTEXT2
 #define COPYRIGHTTEXT2 ""
 #endif
-#ifndef COMPILEDATE
-#define COMPILEDATE ""
-#endif
-               fprintf(stderr, REPOMAINTXT COPYRIGHTTEXT1 COPYRIGHTTEXT2 COMPILEDATE
-                       PROGRAM_NAME " is free software, covered by the GNU General Public License,\n"
+               fprintf(stderr, "%s %s - %s\n%s",
+                       PROGRAM_NAME,CINELERRA_VERSION, AboutPrefs::build_timestamp,
+                       REPOMAINTXT COPYRIGHTTEXT1 COPYRIGHTTEXT2);
+               fprintf(stderr, "%s is free software, covered by the GNU General Public License,\n"
                        "and you are welcome to change it and/or distribute copies of it under\n"
-                       "certain conditions. There is absolutely no warranty for " PROGRAM_NAME ".\n\n");
+                       "certain conditions. There is absolutely no warranty for %s.\n\n",
+                       PROGRAM_NAME, PROGRAM_NAME);
        }
 
-       switch(operation)
-       {
+       switch( operation ) {
                case DO_USAGE:
                        printf(_("\nUsage:\n"));
                        printf(_("%s [-f] [-c configuration] [-d port] [-n nice] [-r batch file] [filenames]\n\n"), argv[0]);
                        printf(_("-d = Run in the background as renderfarm client.  The port (400) is optional.\n"));
                        printf(_("-f = Run in the foreground as renderfarm client.  Substitute for -d.\n"));
-                       printf(_("-n = Nice value if running as renderfarm client. (20)\n"));
+                       printf(_("-n = Nice value if running as renderfarm client. (19)\n"));
                        printf(_("-c = Configuration file to use instead of %s/%s.\n"),
                                File::get_config_path(), CONFIG_FILE);
                        printf(_("-r = batch render the contents of the batch file (%s/%s) with no GUI.  batch file is optional.\n"),
                                File::get_config_path(), BATCH_PATH);
+                       printf(_("-S = do not reload perpetual session\n"));
+                       printf(_("-x = reload from backup\n"));
                        printf(_("filenames = files to load\n\n\n"));
                        exit(0);
                        break;
 
                case DO_DEAMON:
-               case DO_DEAMON_FG:
-               {
-                       if(operation == DO_DEAMON)
-                       {
+               case DO_DEAMON_FG: {
+                       if( operation == DO_DEAMON ) {
                                int pid = fork();
 
-                               if(pid)
-                               {
+                               if( pid ) {
 // Redhat 9 requires _exit instead of exit here.
                                        _exit(0);
                                }
@@ -306,36 +296,32 @@ int main(int argc, char *argv[])
                                nice_value,
                                config_path);
                        client.main_loop();
-                       break;
-               }
+                       break; }
 
 // Same thing without detachment
-               case DO_BRENDER:
-               {
+               case DO_BRENDER: {
                        RenderFarmClient client(0,
                                deamon_path,
                                20,
                                config_path);
                        client.main_loop();
-                       break;
-               }
+                       break; }
 
-               case DO_BATCHRENDER:
-               {
+               case DO_BATCHRENDER: {
                        BatchRenderThread *thread = new BatchRenderThread;
                        thread->start_rendering(config_path,
                                batch_path);
-                       break;
-               }
+                       break; }
 
-               case DO_GUI:
-               {
+               case DO_GUI: {
                        int restart = 0, done = 0;
                        while( !done ) {
                                BC_WindowBase::get_resources()->vframe_shm = 0;
                                MWindow mwindow;
                                mwindow.create_objects(1, !filenames.total, config_path);
                                CommandLineThread *thread  = 0;
+                               if( mwindow.preferences->perpetual_session && load_perpetual )
+                                       mwindow.load_undo_data();
 //SET_TRACE
 // load the initial files on seperate tracks
 // use a new thread so it doesn't block the GUI
@@ -370,6 +356,8 @@ int main(int argc, char *argv[])
                                        done = 1;
 
                                mwindow.save_defaults();
+                               if( mwindow.preferences->perpetual_session )
+                                       mwindow.save_undo_data();
 //PRINT_TRACE
                                filenames.remove_all_objects();
                                delete thread;
@@ -387,15 +375,17 @@ int main(int argc, char *argv[])
                                av[ac++] = 0;
                                execv(exe_path, av);
                        }
-               }
 //SET_TRACE
 DISABLE_BUFFER
-               break;
+               break; }
        }
 
        filenames.remove_all_objects();
-       delete EDL::id_lock;  EDL::id_lock = 0;
+       Units::finit();
 
+       time_t et; time(&et);
+       long dt = et - st;
+       printf("Session time: %ld:%02ld:%02ld\n", dt/3600, dt%3600/60, dt%60);
        return 0;
 }