diff --git a/zathura/plugin-api.h b/zathura/plugin-api.h index 7a8ce5fdc8f35531fe6427940ca3ff1a28175d4e..c372756294e561a132ef4bedad503c163988590b 100644 --- a/zathura/plugin-api.h +++ b/zathura/plugin-api.h @@ -9,56 +9,6 @@ #include "version.h" typedef struct zathura_plugin_functions_s zathura_plugin_functions_t; -/** - * Functions register function - * - * @param functions The functions struct - */ -typedef void (*zathura_plugin_register_function_t)(zathura_plugin_functions_t* functions); - -typedef struct zathura_plugin_version_s { - unsigned int major; /**< Major */ - unsigned int minor; /**< Minor */ - unsigned int rev; /**< Revision */ -} zathura_plugin_version_t; - -typedef struct zathura_plugin_definition_s -{ - const char* name; - const zathura_plugin_version_t version; - zathura_plugin_register_function_t register_function; - const size_t mime_types_size; - const char** mime_types; -} zathura_plugin_definition_t; - -#define JOIN(x, y) JOIN2(x, y) -#define JOIN2(x, y) x ## _ ## y - -#define ZATHURA_PLUGIN_DEFINITION_SYMBOL \ - JOIN(zathura_plugin, JOIN(ZATHURA_API_VERSION, ZATHURA_ABI_VERSION)) - -/** - * Register a plugin. - * - * @param plugin_name the name of the plugin - * @param major the plugin's major version - * @param minor the plugin's minor version - * @param rev the plugin's revision - * @param register_functions function to register the plugin's document functions - * @param mimetypes a char array of mime types supported by the plugin - */ -#define ZATHURA_PLUGIN_REGISTER(plugin_name, major, minor, rev, register_functions, mimetypes) \ - static const char* zathura_plugin_mime_types[] = mimetypes; \ - \ - const zathura_plugin_definition_t ZATHURA_PLUGIN_DEFINITION_SYMBOL = { \ - .name = plugin_name, \ - .version = { major, minor, rev }, \ - .register_function = register_functions, \ - .mime_types_size = sizeof(zathura_plugin_mime_types) / sizeof(zathura_plugin_mime_types[0]), \ - .mime_types = zathura_plugin_mime_types \ - }; \ - -#define ZATHURA_PLUGIN_MIMETYPES(...) __VA_ARGS__ /** * Opens a document @@ -234,5 +184,79 @@ struct zathura_plugin_functions_s zathura_plugin_page_render_cairo_t page_render_cairo; }; +/** + * Functions register function + * + * @param functions The functions struct + */ +typedef void (*zathura_plugin_register_function_t)(zathura_plugin_functions_t* functions); + +typedef struct zathura_plugin_version_s { + unsigned int major; /**< Major */ + unsigned int minor; /**< Minor */ + unsigned int rev; /**< Revision */ +} zathura_plugin_version_t; + +typedef struct zathura_plugin_definition_s { + const char* name; + const zathura_plugin_version_t version; + const zathura_plugin_register_function_t register_function; + zathura_plugin_functions_t functions; + const size_t mime_types_size; + const char** mime_types; +} zathura_plugin_definition_t; + +#define JOIN(x, y) JOIN2(x, y) +#define JOIN2(x, y) x ## _ ## y + +#define ZATHURA_PLUGIN_DEFINITION_SYMBOL \ + JOIN(zathura_plugin, JOIN(ZATHURA_API_VERSION, ZATHURA_ABI_VERSION)) + +/** + * Register a plugin. + * + * @param plugin_name the name of the plugin + * @param major the plugin's major version + * @param minor the plugin's minor version + * @param rev the plugin's revision + * @param register_functions function to register the plugin's document functions + * @param mimetypes a char array of mime types supported by the plugin + */ +#define ZATHURA_PLUGIN_REGISTER(plugin_name, major, minor, rev, register_functions, mimetypes) \ + static const char* zathura_plugin_mime_types[] = mimetypes; \ + \ + const zathura_plugin_definition_t ZATHURA_PLUGIN_DEFINITION_SYMBOL = { \ + .name = plugin_name, \ + .version = { major, minor, rev }, \ + .register_function = register_functions, \ + .mime_types_size = sizeof(zathura_plugin_mime_types) / sizeof(zathura_plugin_mime_types[0]), \ + .mime_types = zathura_plugin_mime_types \ + }; \ + +/** + * Register a plugin. + * + * @param plugin_name the name of the plugin + * @param major the plugin's major version + * @param minor the plugin's minor version + * @param rev the plugin's revision + * @param plugin_functions function to register the plugin's document functions + * @param mimetypes a char array of mime types supported by the plugin + */ +#define ZATHURA_PLUGIN_REGISTER_WITH_FUNCTIONS(plugin_name, major, minor, rev, plugin_functions, mimetypes) \ + static const char* zathura_plugin_mime_types[] = mimetypes; \ + \ + const zathura_plugin_definition_t ZATHURA_PLUGIN_DEFINITION_SYMBOL = { \ + .name = plugin_name, \ + .version = { major, minor, rev }, \ + .register_function = NULL, \ + .functions = plugin_functions, \ + .mime_types_size = sizeof(zathura_plugin_mime_types) / sizeof(zathura_plugin_mime_types[0]), \ + .mime_types = zathura_plugin_mime_types \ + }; \ + + +#define ZATHURA_PLUGIN_MIMETYPES(...) __VA_ARGS__ +#define ZATHURA_PLUGIN_FUNCTIONS(...) __VA_ARGS__ #endif // PLUGIN_API_H diff --git a/zathura/plugin.c b/zathura/plugin.c index 7b6ad6e6cf1d52f67ae6862372e30f8f70550b6a..076f30cb49cb6133f864b79e18a8f9e0744c5540 100644 --- a/zathura/plugin.c +++ b/zathura/plugin.c @@ -162,15 +162,6 @@ zathura_plugin_manager_load(zathura_plugin_manager_t* plugin_manager) continue; } - /* check register functions */ - if (plugin_definition->register_function == NULL) { - girara_error("plugin has no document functions register function"); - g_free(path); - g_free(plugin); - g_module_close(handle); - continue; - } - plugin = g_try_malloc0(sizeof(zathura_plugin_t)); if (plugin == NULL) { girara_error("Failed to allocate memory for plugin."); @@ -180,6 +171,7 @@ zathura_plugin_manager_load(zathura_plugin_manager_t* plugin_manager) } plugin->definition = plugin_definition; + plugin->functions = plugin_definition->functions; plugin->content_types = girara_list_new2(g_free); plugin->handle = handle; plugin->path = path; @@ -189,7 +181,9 @@ zathura_plugin_manager_load(zathura_plugin_manager_t* plugin_manager) zathura_plugin_add_mimetype(plugin, plugin_definition->mime_types[s]); } // register functions - plugin->definition->register_function(&(plugin->functions)); + if (plugin->definition->register_function != NULL) { + plugin->definition->register_function(&(plugin->functions)); + } bool ret = register_plugin(plugin_manager, plugin); if (ret == false) {