olaf neophyte and de.po updates, valgrind tweaks, delete green lady, inkscape dpi=96
[goodguy/history.git] / cinelerra-5.1 / cinelerra / pluginclient.C
index 4cab34b513f80b208a14d1a95d848fb430a9ab3a..7f1fdd04323959926339ba8bc5ad108803b207ea 100644 (file)
@@ -30,6 +30,7 @@
 #include "edlsession.h"
 #include "file.h"
 #include "filesystem.h"
+#include "filexml.h"
 #include "indexable.h"
 #include "language.h"
 #include "localsession.h"
@@ -201,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;
@@ -245,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__);
        }
 }
 
@@ -547,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);
@@ -825,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