Skip to content
Permalink
Browse files

rpi plugins fix + paths enhancements #94

Store the full relative path to found `.rpi` plugins, relative to the
standard Plugins directory, as specified by wxWidgets.

This fixes the problem of plugins being in a subdirectory while only the
basename was stored, making the plugins unusable.

This is done by using `wxFileName::GetFullPath()` instead of
`wxFileName::GetFullName()` with a relative filename instance.

Make a `GetPluginsDir()` method on the app class to simplify getting
this directory, and for possible future overrides.

Also make some minor, functionally equivalent changes to
`get_config_path()` in `wxvbam.cpp`:

- use the new `GetPluginsDir()` method for the plugins directory when
  building the config file search path

- print the XdgConfigDir on all platforms, since the function works on
  all platforms

- make a `add_nonstandard_path` macro which duplicates the `add_path`
  macro for wxWidgets standard paths but for any arbitrary string path

- use `wxFileName` methods to make the XDG config directory path instead
  of string concatenation

Signed-off-by: Rafael Kitover <rkitover@gmail.com>
  • Loading branch information...
rkitover committed Mar 7, 2019
1 parent 6a98f3c commit 530af1403027dde5b316689a5fb3d23de3b4a3f7
Showing with 26 additions and 10 deletions.
  1. +3 −3 src/wx/guiinit.cpp
  2. +1 −1 src/wx/panel.cpp
  3. +21 −6 src/wx/wxvbam.cpp
  4. +1 −0 src/wx/wxvbam.h
@@ -1775,8 +1775,8 @@ class PluginListFiller : public PluginEnabler {
ch->Clear();
ch->Append(_("None"));
plugins.clear();
const wxString& plpath = wxStandardPaths::Get().GetPluginsDir();
wxDir::GetAllFiles(plpath, &plugins, wxT("*.rpi"));
const wxString plpath = wxGetApp().GetPluginsDir();
wxDir::GetAllFiles(plpath, &plugins, wxT("*.rpi"), wxDIR_FILES | wxDIR_DIRS);

for (int i = 0; i < plugins.size(); i++) {
wxDynamicLibrary dl(plugins[i], wxDL_VERBATIM | wxDL_NOW);
@@ -1798,7 +1798,7 @@ class PluginListFiller : public PluginEnabler {
s += wxT(": ");
s += wxString(rpi->Name, wxConvUTF8, sizeof(rpi->Name));
fn.MakeRelativeTo(plpath);
plugins[i] = fn.GetFullName();
plugins[i] = fn.GetFullPath();
ch->Append(s);

if (plugins[i] == gopts.filter_plugin)
@@ -1336,7 +1336,7 @@ DrawingPanelBase::DrawingPanelBase(int _width, int _height)
break;

wxFileName fpn(gopts.filter_plugin);
fpn.MakeAbsolute(wxStandardPaths::Get().GetPluginsDir());
fpn.MakeAbsolute(wxGetApp().GetPluginsDir());

if (!filt_plugin.Load(fpn.GetFullPath(), wxDL_VERBATIM | wxDL_NOW))
break;
@@ -48,6 +48,14 @@ static void get_config_path(wxPathList& path, bool exists = true)
if ((wxDirExists(s) && wxIsWritable(s)) || ((!exists || !wxDirExists(s)) && parent.IsDirWritable())) \
path.Add(s); \
} while (0)
#define add_nonstandard_path(p) \
do { \
const wxString& s = p; \
wxFileName parent = wxFileName::DirName(s + wxT("//..")); \
parent.MakeAbsolute(); \
if ((wxDirExists(s) && wxIsWritable(s)) || ((!exists || !wxDirExists(s)) && parent.IsDirWritable())) \
path.Add(s); \
} while (0)

static bool debug_dumped = false;

@@ -58,10 +66,8 @@ static void get_config_path(wxPathList& path, bool exists = true)
wxLogDebug(wxT("GetResourcesDir(): %s"), stdp.GetResourcesDir().mb_str());
wxLogDebug(wxT("GetDataDir(): %s"), stdp.GetDataDir().mb_str());
wxLogDebug(wxT("GetLocalDataDir(): %s"), stdp.GetLocalDataDir().mb_str());
wxLogDebug(wxT("GetPluginsDir(): %s"), stdp.GetPluginsDir().mb_str());
#if defined(__WXGTK__)
wxLogDebug(wxT("plugins_dir: %s"), wxGetApp().GetPluginsDir().mb_str());
wxLogDebug(wxT("XdgConfigDir: %s"), get_xdg_user_config_home() + current_app_name);
#endif
debug_dumped = true;
}

@@ -74,12 +80,16 @@ static void get_config_path(wxPathList& path, bool exists = true)
wxString new_config(get_xdg_user_config_home());
if (!wxDirExists(old_config) && wxIsWritable(new_config))
{
path.Add(new_config + current_app_name);
wxFileName new_path(new_config, wxEmptyString);
new_path.AppendDir(current_app_name);
new_path.MakeAbsolute();

add_nonstandard_path(new_path.GetFullPath());
}
else
{
// config is in $HOME/.vbam/vbam.conf
path.Add(old_config);
add_nonstandard_path(old_config);
}
#endif

@@ -90,7 +100,7 @@ static void get_config_path(wxPathList& path, bool exists = true)
add_path(GetResourcesDir());
add_path(GetDataDir());
add_path(GetLocalDataDir());
add_path(GetPluginsDir());
add_nonstandard_path(wxGetApp().GetPluginsDir());
}

static void tack_full_path(wxString& s, const wxString& app = wxEmptyString)
@@ -103,6 +113,11 @@ static void tack_full_path(wxString& s, const wxString& app = wxEmptyString)
s += wxT("\n\t") + full_config_path[i] + app;
}

const wxString wxvbamApp::GetPluginsDir()
{
return wxStandardPaths::Get().GetPluginsDir();
}

wxString wxvbamApp::GetConfigurationPath()
{
#if defined(__WXMSW__) || defined(__APPLE__)
@@ -87,6 +87,7 @@ class wxvbamApp : public wxApp {
virtual void OnInitCmdLine(wxCmdLineParser&);
virtual bool OnCmdLineParsed(wxCmdLineParser&);
wxString GetConfigurationPath();
const wxString GetPluginsDir();
wxString GetAbsolutePath(wxString path);
// name of a file to load at earliest opportunity
wxString pending_load;

0 comments on commit 530af14

Please sign in to comment.
You can’t perform that action at this time.