file probe prefs, updated dcraw, bugs - garbage, accel, ffmpeg/giphy.gif
[goodguy/history.git] / cinelerra-5.1 / cinelerra / mwindow.C
index 520d64f4aa058c264a71ef5ed581343a5385e560..ec1376878f4a2ee62926ebfcb417df4c33dc2fa9 100644 (file)
@@ -29,6 +29,7 @@
 #include "bcdisplayinfo.h"
 #include "bcsignals.h"
 #include "bctimer.h"
+#include "bctrace.h"
 #include "bdcreate.h"
 #include "brender.h"
 #include "cache.h"
@@ -175,6 +176,7 @@ Commercials* MWindow::commercials = 0;
 MWindow::MWindow()
  : Thread(1, 0, 0)
 {
+       run_lock = new Mutex("MWindow::run_lock");
        plugin_gui_lock = new Mutex("MWindow::plugin_gui_lock");
        dead_plugin_lock = new Mutex("MWindow::dead_plugin_lock");
        vwindows_lock = new Mutex("MWindow::vwindows_lock");
@@ -198,6 +200,7 @@ MWindow::MWindow()
        mainindexes = 0;
        mainprogress = 0;
        brender = 0;
+       brender_active = 0;
        channeldb_buz =  new ChannelDB;
        channeldb_v4l2jpeg =  new ChannelDB;
        //file_server = 0;
@@ -226,9 +229,8 @@ MWindow::MWindow()
 // Need to delete brender temporary here.
 MWindow::~MWindow()
 {
+       run_lock->lock("MWindow::~MWindow");
        in_destructor = 1;
-       stop_playback(1);
-       stop_brender();
 //printf("MWindow::~MWindow %d\n", __LINE__);
        gui->stop_drawing();
        gui->remote_control->deactivate();
@@ -236,9 +238,6 @@ MWindow::~MWindow()
 #ifdef HAVE_DVB
        gui->channel_info->stop();
 #endif
-       brender_lock->lock("MWindow::quit");
-       delete brender;         brender = 0;
-       brender_lock->unlock();
        delete create_bd;       create_bd = 0;
        delete create_dvd;      create_dvd = 0;
        delete batch_render;    batch_render = 0;
@@ -341,23 +340,13 @@ MWindow::~MWindow()
        interlace_asset_fixmethods.remove_all_objects();
        sighandler->terminate();
        delete sighandler;
+       delete run_lock;
 }
 
 
-void MWindow::quit(int unlock)
+void MWindow::quit()
 {
-       if(unlock) gui->unlock_window();
-       stop_playback(1);
-
-       brender_lock->lock("MWindow::quit");
-       delete brender;         brender = 0;
-       brender_lock->unlock();
-
-       interrupt_indexes();
-       clean_indexes();
-       save_defaults();
        gui->set_done(0);
-       if(unlock) gui->lock_window("MWindow::quit");
 }
 
 void MWindow::init_error()
@@ -473,6 +462,33 @@ void MWindow::init_defaults(BC_Hash* &defaults, char *config_path)
        defaults->load();
 }
 
+
+void MWindow::check_language()
+{
+       char curr_lang[BCTEXTLEN]; curr_lang[0] = 0;
+       const char *env_lang = getenv("LANGUAGE");
+       if( !env_lang ) env_lang = getenv("LC_ALL");
+       if( !env_lang ) env_lang = getenv("LANG");
+       if( !env_lang ) {
+               snprintf(curr_lang, sizeof(curr_lang), "%s-%s.%s",
+                       BC_Resources::language, BC_Resources::region, BC_Resources::encoding);
+               env_lang = curr_lang;
+       }
+       char last_lang[BCTEXTLEN]; last_lang[0] = 0;
+       defaults->get("LAST_LANG",last_lang);
+       if( strcmp(env_lang,last_lang)) {
+               printf("lang changed from '%s' to '%s'\n", last_lang, env_lang);
+               defaults->update("LAST_LANG",env_lang);
+               char plugin_path[BCTEXTLEN];
+               create_defaults_path(plugin_path, PLUGIN_FILE);
+               ::remove(plugin_path);
+               char ladspa_path[BCTEXTLEN];
+               create_defaults_path(ladspa_path, LADSPA_FILE);
+               ::remove(ladspa_path);
+               defaults->save();
+       }
+}
+
 void MWindow::get_plugin_path(char *path, const char *plug_dir, const char *fs_path)
 {
        char *base_path = FileSystem::basepath(fs_path), *bp = base_path;
@@ -611,6 +627,7 @@ int MWindow::init_ladspa_plugins(MWindow *mwindow, Preferences *preferences)
                len = !cp ? strlen(path) : cp-path;
                char index_path[BCTEXTLEN], plugin_path[BCTEXTLEN];
                memcpy(plugin_path, path, len);  plugin_path[len] = 0;
+               if( cp ) ++len;
                char *plugin_dir = FileSystem::basepath(plugin_path);
                strcpy(plugin_path, plugin_dir);  delete [] plugin_dir;
                create_defaults_path(index_path, LADSPA_FILE);
@@ -797,11 +814,17 @@ void MWindow::init_preferences()
        session->load_defaults(defaults);
        // set x11_host, screens, window_config
        screens = session->set_default_x11_host();
-       BC_Signals::set_trap_path("/tmp/cinelerra_%d.dmp");
        BC_Signals::set_trap_hook(trap_hook, this);
        BC_Signals::set_catch_segv(preferences->trap_sigsegv);
        BC_Signals::set_catch_intr(preferences->trap_sigintr);
+       if( preferences->trap_sigsegv || preferences->trap_sigintr ) {
+               BC_Trace::enable_locks();
+       }
+       else {
+               BC_Trace::disable_locks();
+       }
        BC_WindowBase::get_resources()->popupmenu_btnup = preferences->popupmenu_btnup;
+       BC_WindowBase::get_resources()->textbox_focus_policy = preferences->textbox_focus_policy;
 }
 
 void MWindow::clean_indexes()
@@ -982,6 +1005,7 @@ void MWindow::init_edl()
        edl->create_objects();
        fill_preset_defaults(default_standard, edl->session);
        edl->load_defaults(defaults);
+       edl->session->brender_start = edl->session->brender_end = 0;
        edl->create_default_tracks();
        edl->tracks->update_y_pixels(theme);
 }
@@ -1104,7 +1128,7 @@ void MWindow::init_gui()
 void MWindow::init_signals()
 {
        sighandler = new SigHandler;
-       sighandler->initialize();
+       sighandler->initialize("/tmp/cinelerra_%d.dmp");
 ENABLE_BUFFER
 }
 
@@ -1140,12 +1164,14 @@ void MWindow::init_brender()
                session->brender_end = 0;
                brender_lock->unlock();
        }
-       if(brender) brender->restart(edl);
+       brender_active = 0;
+       stop_brender();
 }
 
 void MWindow::restart_brender()
 {
 //printf("MWindow::restart_brender 1\n");
+       if(!brender_active || !preferences->use_brender) return;
        if(brender) brender->restart(edl);
 }
 
@@ -1177,13 +1203,27 @@ int MWindow::brender_available(int position)
        return result;
 }
 
-void MWindow::set_brender_start()
+void MWindow::set_brender_active(int v, int update)
 {
-       edl->session->brender_start = edl->local_session->get_selectionstart(1);
-       restart_brender();
-       gui->draw_overlays(1);
-}
+       if( !preferences->use_brender ) v = 0;
+       brender_active = v;
+       gui->mainmenu->brender_active->set_checked(v);
+       if( v != 0 ) {
+               edl->session->brender_start = edl->local_session->get_selectionstart(1);
+               edl->session->brender_end = edl->local_session->get_selectionend(1);
 
+               if(EQUIV(edl->session->brender_end, edl->session->brender_start)) {
+                       edl->session->brender_end = edl->tracks->total_video_length();
+               }
+               restart_brender();
+       }
+       else
+               stop_brender();
+       if( update ) {
+               gui->update_timebar(0);
+               gui->draw_overlays(1);
+       }
+}
 
 int MWindow::has_commercials()
 {
@@ -1421,11 +1461,9 @@ SET_TRACE
                        case FILE_UNRECOGNIZED_CODEC:
                        {
 // Test index file
-                               IndexFile indexfile(this, new_asset);
-                               result = indexfile.open_index();
-                               if(!result)
-                               {
-                                       indexfile.close_index();
+                               {       IndexFile indexfile(this, new_asset);
+                                       if( !(result = indexfile.open_index()) )
+                                               indexfile.close_index();
                                }
 
 // Test existing EDLs
@@ -1434,7 +1472,7 @@ SET_TRACE
                                                new_edls[j]->assets->get_asset(new_asset->path) :
                                                edl->assets->get_asset(new_asset->path);
                                        if( old_asset ) {
-                                               *new_asset = *old_asset;
+                                               new_asset->copy_from(old_asset,1);
                                                result = 0;
                                        }
                                }
@@ -1712,6 +1750,7 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
                edl->local_session->loop_playback = 0;
                edl->local_session->set_selectionstart(0);
                edl->local_session->set_selectionend(0);
+               set_brender_active(0, 0);
                fit_selection();
                goto_start();
        }
@@ -1890,6 +1929,7 @@ void MWindow::create_objects(int want_gui,
        if(debug) PRINT_TRACE
        default_standard = default_std();
        init_defaults(defaults, config_path);
+       check_language();
        init_preferences();
        if(splash_window)
                splash_window->operation->update(_("Initializing Plugins"));
@@ -2097,7 +2137,18 @@ ENABLE_BUFFER
 
 void MWindow::run()
 {
+       run_lock->lock("MWindow::run");
        gui->run_window();
+       stop_playback(1);
+
+       brender_lock->lock("MWindow::run 1");
+       delete brender;         brender = 0;
+       brender_lock->unlock();
+
+       interrupt_indexes();
+       clean_indexes();
+       save_defaults();
+       run_lock->unlock();
 }
 
 void MWindow::show_vwindow()
@@ -2459,8 +2510,8 @@ SET_TRACE
 // Needs mwindow to do GUI
                        gui->set_mwindow(this);
                        gui->open_plugin(0, preferences, edl, plugin);
-                       gui->show_gui();
                        plugin->show = 1;
+                       gui->show_gui();
                }
        }
        plugin_gui_lock->unlock();
@@ -3533,7 +3584,7 @@ int MWindow::select_asset(Asset *asset, int vstream, int astream, int delete_tra
                                        next_edit = edit->next;
                                        if( edit->channel != vstream ||
                                            !edit->asset || !edit->asset->is_asset ||
-                                           *asset != *edit->asset )
+                                           !asset->equivalent(*edit->asset,1,1,edl) )
                                                delete edit;
                                }
                        }
@@ -3544,6 +3595,7 @@ int MWindow::select_asset(Asset *asset, int vstream, int astream, int delete_tra
                        else if( delete_tracks )
                                edl->tracks->delete_track(track);
                }
+               edl->retrack();
                edl->resample(old_framerate, session->frame_rate, TRACK_VIDEO);
        }
        if( !result && asset->audio_data && asset->channels > 0 ) {
@@ -3593,7 +3645,7 @@ int MWindow::select_asset(Asset *asset, int vstream, int astream, int delete_tra
                                        next_edit = edit->next;
                                        if( !((1<<edit->channel) & channel_mask) ||
                                            !edit->asset || !edit->asset->is_asset ||
-                                           *asset != *edit->asset )
+                                           !asset->equivalent(*edit->asset,1,1,edl) )
                                                delete edit;
                                }
                                if( !track->edits->first )