fix plugin probe when LANG != en
[goodguy/history.git] / cinelerra-5.0 / cinelerra / pluginserver.C
index 609710276599b8cb0de1439e9db02ab810f670ff..25573cf4b95986e61e61ae4ec3af2af501f73567 100644 (file)
@@ -30,6 +30,7 @@
 #include "edl.h"
 #include "edlsession.h"
 #include "floatautos.h"
+#include "format.inc"
 #include "keyframes.h"
 #include "localsession.h"
 #include "mainerror.h"
@@ -50,6 +51,7 @@
 #include "samples.h"
 #include "sema.h"
 #include "mainsession.h"
+#include "theme.h"
 #include "trackcanvas.h"
 #include "transportque.h"
 #include "vdevicex11.h"
@@ -312,16 +314,11 @@ int PluginServer::open_plugin(int master,
        this->plugin = plugin;
        this->edl = edl;
        if( plugin_type != PLUGIN_TYPE_FFMPEG && plugin_type != PLUGIN_TYPE_EXECUTABLE && !load_obj() ) {
-// If the load failed it may still be an executable tool for a specific
-// file format, in which case we just store the path.
-               set_title(path);
-               char string[BCTEXTLEN];
-               strcpy(string, load_error());
-               if( !strstr(string, "executable") ) {
-                       eprintf("PluginServer::open_plugin: load_obj %s = %s\n", path, string);
-                       return PLUGINSERVER_NOT_RECOGNIZED;
-               }
-               plugin_type = PLUGIN_TYPE_EXECUTABLE;
+// If the load failed, can't use error to detect executable
+//  because locale and language selection change the load_error()
+//     if( !strstr(string, "executable") ) { set_title(path); plugin_type = PLUGIN_TYPE_EXECUTABLE; }
+               eprintf("PluginServer::open_plugin: load_obj %s = %s\n", path, load_error());
+               return PLUGINSERVER_NOT_RECOGNIZED;
        }
        if( plugin_type == PLUGIN_TYPE_UNKNOWN || plugin_type == PLUGIN_TYPE_BUILTIN ) {
                new_plugin =
@@ -346,6 +343,8 @@ int PluginServer::open_plugin(int master,
                return PLUGINSERVER_NOT_RECOGNIZED;
        }
        switch( plugin_type ) {
+       case PLUGIN_TYPE_EXECUTABLE:
+               return PLUGINSERVER_OK;
        case PLUGIN_TYPE_BUILTIN:
                client = new_plugin(this);
                break;
@@ -423,28 +422,28 @@ void PluginServer::render_stop()
                client->render_stop();
 }
 
-void PluginServer::write_table(FILE *fp, int idx)
+void PluginServer::write_table(FILE *fp, const char *path, int idx, int64_t mtime)
 {
        if(!fp) return;
-       fprintf(fp, "%d \"%s\" \"%s\" %d %d %d %d %d %d %d %d %d %d %d\n",
-               plugin_type, path, title, idx, audio, video, theme, realtime,
+       fprintf(fp, "%d \"%s\" \"%s\" " _LD " %d %d %d %d %d %d %d %d %d %d %d\n",
+               plugin_type, path, title, mtime, idx, audio, video, theme, realtime,
                fileio, uses_gui, multichannel, synthesis, transition, lad_index);
 }
 
-int PluginServer::scan_table(char *text, int &type, char *path, char *title)
+int PluginServer::scan_table(char *text, int &type, char *path, char *title, int64_t &mtime)
 {
-       int n = sscanf(text, "%d \"%[^\"]\" \"%[^\"]\"", &type, path, title);
-       return n < 3 ? 1 : 0;
+       int n = sscanf(text, "%d \"%[^\"]\" \"%[^\"]\" " _LD "", &type, path, title, &mtime);
+       return n < 4 ? 1 : 0;
 }
 
 int PluginServer::read_table(char *text)
 {
        char path[BCTEXTLEN], title[BCTEXTLEN];
-       int n = sscanf(text, "%d \"%[^\"]\" \"%[^\"]\" %d %d %d %d %d %d %d %d %d %d %d",
-               &plugin_type, path, title, &dir_idx, &audio, &video, &theme, &realtime,
+       int64_t mtime;
+       int n = sscanf(text, "%d \"%[^\"]\" \"%[^\"]\" " _LD " %d %d %d %d %d %d %d %d %d %d %d",
+               &plugin_type, path, title, &mtime, &dir_idx, &audio, &video, &theme, &realtime,
                &fileio, &uses_gui, &multichannel, &synthesis, &transition, &lad_index);
-       if( n != 14 ) return 1;
-       set_path(path);
+       if( n != 15 ) return 1;
        set_title(title);
        return 0;
 }
@@ -1208,27 +1207,48 @@ Theme* PluginServer::get_theme()
 }
 
 
-char *PluginServer::get_plugin_png_path(char *png_path)
+int PluginServer::get_theme_png_path(char *png_path, const char *theme_dir)
 {
-       char *bp = strrchr(path, '/'), *cp = png_path;
+       char *bp = strrchr(path, '/');
        if( !bp ) bp = path; else ++bp;
        char *sp = strrchr(bp,'.');
        if( !sp || ( strcmp(sp, ".plugin") && strcmp(sp,".so") ) ) return 0;
-       cp += sprintf(cp,"%s/picons/", mwindow->preferences->plugin_dir);
-       while( bp < sp ) *cp++ = *bp++;
+       char *cp = png_path, *dp = bp;
+       cp += sprintf(cp,"%s/%s/", mwindow->preferences->plugin_dir, theme_dir);
+       while( dp < sp ) *cp++ = *dp++;
        strcpy(cp, ".png");
-       return png_path;
+       struct stat st;
+       if( stat(png_path, &st) ) return 0;
+       if( !S_ISREG(st.st_mode) ) return 0;
+       if( st.st_size == 0 ) return 0;
+       return st.st_size;
+}
+
+int PluginServer::get_theme_png_path(char *png_path, Theme *theme)
+{
+       char *bp = strrchr(theme->path, '/');
+       if( !bp ) bp = theme->path; else ++bp;
+       char *sp = strrchr(bp,'.');
+       if( !sp || ( strcmp(sp, ".plugin") && strcmp(sp,".so") ) ) return 0;
+       char theme_dir[BCTEXTLEN], *cp = theme_dir;
+       while( bp < sp ) *cp++ = *bp++;
+       *cp = 0;
+       return get_theme_png_path(png_path, theme_dir);
+}
+
+int PluginServer::get_plugin_png_path(char *png_path)
+{
+       int len = get_theme_png_path(png_path, mwindow->theme);
+       if( !len )
+               len = get_theme_png_path(png_path, "picon");
+       return len;
 }
 
 VFrame *PluginServer::get_plugin_images()
 {
        char png_path[BCTEXTLEN];
-       if( !get_plugin_png_path(png_path) ) return 0;
-       struct stat st;
-       if( stat(png_path, &st) ) return 0;
-       if( !S_ISREG(st.st_mode) ) return 0;
-       if( st.st_size == 0 ) return 0;
-       unsigned len = st.st_size;
+       int len = get_plugin_png_path(png_path);
+       if( !len ) return 0;
        int ret = 0, w = 0, h = 0;
        unsigned char *bfr = 0;
        int fd = ::open(png_path, O_RDONLY);
@@ -1240,7 +1260,7 @@ VFrame *PluginServer::get_plugin_images()
        VFrame *vframe = 0;
        if( !ret ) {
                double scale = BC_WindowBase::get_resources()->icon_scale;
-               vframe = new VFramePng(bfr, st.st_size, scale, scale);
+               vframe = new VFramePng(bfr, len, scale, scale);
                if( (w=vframe->get_w()) <= 0 || (h=vframe->get_h()) <= 0 ||
                    vframe->get_data() == 0 ) ret = 1;
        }