olaf neophyte and de.po updates, valgrind tweaks, delete green lady, inkscape dpi=96
[goodguy/history.git] / cinelerra-5.1 / cinelerra / pluginclient.C
index 2f5d0e377f93b3873c7657161a2070ef47942906..7f1fdd04323959926339ba8bc5ad108803b207ea 100644 (file)
 #include "bcsignals.h"
 #include "clip.h"
 #include "condition.h"
+#include "edits.h"
+#include "edit.h"
 #include "edl.h"
 #include "edlsession.h"
 #include "file.h"
 #include "filesystem.h"
+#include "filexml.h"
+#include "indexable.h"
 #include "language.h"
 #include "localsession.h"
 #include "mainundo.h"
 #include "mwindow.h"
+#include "plugin.h"
 #include "pluginclient.h"
 #include "pluginserver.h"
 #include "preferences.h"
+#include "track.h"
 #include "transportque.inc"
 
 
@@ -70,7 +76,7 @@ void PluginClientThread::run()
        if(client->window_x < 0) client->window_x = info.get_abs_cursor_x();
        if(client->window_y < 0) client->window_y = info.get_abs_cursor_y();
        if(!window)
-               window = client->new_window();
+               window = (PluginClientWindow*)client->new_window();
 
        if(window) {
                window->lock_window("PluginClientThread::run");
@@ -86,6 +92,7 @@ void PluginClientThread::run()
 //printf("PluginClientThread::run %p %d\n", this, __LINE__);
                window->hide_window(1);
                window->unlock_window();
+               window->done_event(result);
 // Can't save defaults in the destructor because it's not called immediately
 // after closing.
                /* if(client->defaults) */ client->save_defaults_xml();
@@ -135,22 +142,23 @@ PluginClientFrame::~PluginClientFrame()
 
 
 PluginClientWindow::PluginClientWindow(PluginClient *client,
-       int w,
-       int h,
-       int min_w,
-       int min_h,
-       int allow_resize)
+       int w, int h, int min_w, int min_h, int allow_resize)
  : BC_Window(client->gui_string,
        client->window_x /* - w / 2 */,
        client->window_y /* - h / 2 */,
-       w, h, min_w, min_h, allow_resize, 0, 1)
+       (int)(w*get_resources()->font_scale+0.5), (int)(h*get_resources()->font_scale+0.5),
+       (int)(min_w*get_resources()->font_scale+0.5), (int)(min_h*get_resources()->font_scale+0.5),
+       allow_resize, 0, 1)
 {
        this->client = client;
 }
 
 PluginClientWindow::PluginClientWindow(const char *title,
        int x, int y, int w, int h, int min_w, int min_h, int allow_resize)
- : BC_Window(title, x, y, w, h, min_w, min_h, allow_resize, 0, 1)
+ : BC_Window(title, x, y,
+        (int)(w*get_resources()->font_scale+0.5), (int)(h*get_resources()->font_scale+0.5),
+        (int)(min_w*get_resources()->font_scale+0.5), (int)(min_h*get_resources()->font_scale+0.5),
+       allow_resize, 0, 1)
 {
        this->client = 0;
 }
@@ -194,8 +202,11 @@ PluginClient::PluginClient(PluginServer *server)
 
 PluginClient::~PluginClient()
 {
-// Delete the GUI thread.  The GUI must be hidden with hide_gui first.
-       delete thread;
+       if( thread ) {
+               hide_gui();
+               thread->join();
+               delete thread;
+       }
 
 // Virtual functions don't work here.
        if(defaults) delete defaults;
@@ -238,7 +249,6 @@ void PluginClient::hide_gui()
                thread->window->set_done(0);
 //printf("PluginClient::hide_gui %d thread->window=%p\n", __LINE__, thread->window);
                thread->window->unlock_window();
-//printf("PluginClient::delete_thread %d\n", __LINE__);
        }
 }
 
@@ -331,14 +341,8 @@ int PluginClient::show_gui()
        thread->start();
        thread->init_complete->lock("PluginClient::show_gui");
 // Must wait before sending any hide_gui
-       if(thread->window)
-       {
-               thread->window->init_wait();
-       }
-       else
-       {
-               return 1;
-       }
+       if( !thread->window ) return 1;
+       thread->window->init_wait();
        return 0;
 }
 
@@ -546,39 +550,36 @@ void PluginClient::load_defaults_xml()
 //printf("PluginClient::load_defaults_xml %d %s\n", __LINE__, path);
 
        KeyFrame temp_keyframe;
-       FILE *fd = fopen(path, "r");
-       if(fd)
-       {
-               char *data = temp_keyframe.get_data();
-               int data_size = fread(data, 1, MESSAGESIZE-1, fd);
+       FILE *fp = fopen(path, "r");
+       if( fp ) {
+               struct stat st;  int fd = fileno(fp);
+               int64_t sz = !fstat(fd, &st) ? st.st_size : BCTEXTLEN;
+               char *data = temp_keyframe.get_data(sz+1);
+               int data_size = fread(data, 1, sz, fp);
                if( data_size < 0 ) data_size = 0;
-               if( data_size > 0 )
-               {
+               if( data_size > 0 ) {
+                       data[data_size] = 0;
+                       temp_keyframe.xbuf->oseek(data_size);
 // Get window extents
-                       int state = 0;
-                       for(int i = 0; i < data_size - 8; i++)
-                       {
-                               if(data[i] == '<') break;
-                               if(isdigit(data[i]))
-                               {
-                                       if(state == 0)
-                                       {
-                                               window_x = atoi(data + i);
-                                               state++;
-                                       }
-                                       else
-                                       {
-                                               window_y = atoi(data + i);
-                                               break;
-                                       }
-                                       while(i < data_size && isdigit(data[i])) i++;
+                       int i = 0;
+                       for( int state=0; i<(data_size-8) && state>=0; ++i ) {
+                               if( !data[i] || data[i] == '<' ) break;
+                               if( !isdigit(data[i]) ) continue;
+                               if( !state ) {
+                                       window_x = atoi(data + i);
+                                       state = 1;
                                }
+                               else {
+                                       window_y = atoi(data + i);
+                                       state = -1;
+                               }
+                               while( i<data_size && isdigit(data[i]) ) ++i;
                        }
-                       data[data_size] = 0;
+                       temp_keyframe.xbuf->iseek(i);
                        read_data(&temp_keyframe);
                }
 
-               fclose(fd);
+               fclose(fp);
        }
        using_defaults = 0;
 //printf("PluginClient::load_defaults_xml %d %s\n", __LINE__, path);
@@ -683,6 +684,14 @@ double PluginClient::get_project_framerate()
        return server->get_project_framerate();
 }
 
+const char *PluginClient::get_source_path()
+{
+       int64_t source_position = server->plugin->startproject;
+       Edit *edit = server->plugin->track->edits->editof(source_position,PLAY_FORWARD,0);
+       Indexable *indexable = edit ? edit->get_source() : 0;
+       return indexable ? indexable->path : 0;
+}
+
 
 void PluginClient::update_display_title()
 {
@@ -722,39 +731,29 @@ int PluginClient::get_interpolation_type()
 
 float PluginClient::get_red()
 {
-       if(server->mwindow)
-               return server->mwindow->edl->local_session->red;
-       else
-       if(server->edl)
-               return server->edl->local_session->red;
-       else
-               return 0;
+       EDL *edl = server->mwindow ? server->mwindow->edl : server->edl;
+       return !edl ? 0 : edl->local_session->use_max ?
+               edl->local_session->red_max :
+               edl->local_session->red;
 }
 
 float PluginClient::get_green()
 {
-       if(server->mwindow)
-               return server->mwindow->edl->local_session->green;
-       else
-       if(server->edl)
-               return server->edl->local_session->green;
-       else
-               return 0;
+       EDL *edl = server->mwindow ? server->mwindow->edl : server->edl;
+       return !edl ? 0 : edl->local_session->use_max ?
+               edl->local_session->green_max :
+               edl->local_session->green;
 }
 
 float PluginClient::get_blue()
 {
-       if(server->mwindow)
-               return server->mwindow->edl->local_session->blue;
-       else
-       if(server->edl)
-               return server->edl->local_session->blue;
-       else
-               return 0;
+       EDL *edl = server->mwindow ? server->mwindow->edl : server->edl;
+       return !edl ? 0 : edl->local_session->use_max ?
+               edl->local_session->blue_max :
+               edl->local_session->blue;
 }
 
 
-
 int64_t PluginClient::get_source_position()
 {
        return source_position;
@@ -826,7 +825,6 @@ int PluginClient::send_configure_change()
                server->mwindow->undo->update_undo_before(_("tweek"), this);
 #ifdef USE_KEYFRAME_SPANNING
        KeyFrame keyframe;
-       keyframe.copy_from(server->get_keyframe());
        save_data(&keyframe);
        server->apply_keyframe(&keyframe);
 #else