app: allow plugin inside first-level directories of plug-ins folders.
We don't search recursively but only at the first level. If a plugin is in its own subdirectory, the entry point has to be named the same (minus extension) as the directory. For instance my-plugin/my-plugin for a binary, or my-plugin/my-plugin.(py|exe|…). This way, a plugin can load shared objects (libraries, other script files, etc.) without polluting the main plug-ins directories, and in particular without interfering with other plug-ins. This is a first step to fix bug 757057 (DLL files which were used in various plugins).
This commit is contained in:
@ -278,6 +278,60 @@ gimp_plug_in_manager_search_directory (GimpPlugInManager *manager,
|
|||||||
|
|
||||||
gimp_plug_in_manager_add_from_file (manager, child, mtime);
|
gimp_plug_in_manager_add_from_file (manager, child, mtime);
|
||||||
}
|
}
|
||||||
|
else if (g_file_query_file_type (child,
|
||||||
|
G_FILE_CREATE_NONE,
|
||||||
|
NULL) == G_FILE_TYPE_DIRECTORY)
|
||||||
|
{
|
||||||
|
/* Search in subdirectory the first executable file with the
|
||||||
|
* same name as the directory (except extension).
|
||||||
|
* We don't search recursively, but only at a single level
|
||||||
|
* and assume that there can be only 1 plugin inside a
|
||||||
|
* directory.
|
||||||
|
*/
|
||||||
|
GFileEnumerator *enumerator2;
|
||||||
|
|
||||||
|
enumerator2 = g_file_enumerate_children (child,
|
||||||
|
G_FILE_ATTRIBUTE_STANDARD_NAME ","
|
||||||
|
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN ","
|
||||||
|
G_FILE_ATTRIBUTE_TIME_MODIFIED,
|
||||||
|
G_FILE_QUERY_INFO_NONE,
|
||||||
|
NULL, NULL);
|
||||||
|
if (enumerator2)
|
||||||
|
{
|
||||||
|
GFileInfo *info2;
|
||||||
|
|
||||||
|
while ((info2 = g_file_enumerator_next_file (enumerator2, NULL, NULL)))
|
||||||
|
{
|
||||||
|
if (! g_file_info_get_is_hidden (info2))
|
||||||
|
{
|
||||||
|
GFile *child2;
|
||||||
|
gchar *file_name;
|
||||||
|
char *ext;
|
||||||
|
|
||||||
|
child2 = g_file_enumerator_get_child (enumerator2, info2);
|
||||||
|
file_name = g_strdup (g_file_info_get_name (info2));
|
||||||
|
ext = strrchr (file_name, '.');
|
||||||
|
if (ext)
|
||||||
|
*ext = '\0';
|
||||||
|
if (g_strcmp0 (file_name, g_file_info_get_name (info)) == 0 &&
|
||||||
|
gimp_file_is_executable (child2))
|
||||||
|
{
|
||||||
|
guint64 mtime;
|
||||||
|
|
||||||
|
mtime = g_file_info_get_attribute_uint64 (info2,
|
||||||
|
G_FILE_ATTRIBUTE_TIME_MODIFIED);
|
||||||
|
|
||||||
|
gimp_plug_in_manager_add_from_file (manager, child2, mtime);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
g_object_unref (child2);
|
||||||
|
g_free (file_name);
|
||||||
|
}
|
||||||
|
g_object_unref (info2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_object_unref (enumerator2);
|
||||||
|
}
|
||||||
|
|
||||||
g_object_unref (child);
|
g_object_unref (child);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user