grim/gplugin

Parents 1fcdde239c0b
Children
rebase and restub the gjs plugin, gjs/spidermonkey is still a pain for what we're trying to do
--- a/gjs/gplugin-gjs-core.cc Mon Feb 17 00:51:58 2020 -0600
+++ b/gjs/gplugin-gjs-core.cc Wed Aug 11 03:59:38 2021 -0500
@@ -22,46 +22,57 @@
#include "gplugin-gjs-plugin.h"
extern "C" G_MODULE_EXPORT GPluginPluginInfo *
-gplugin_query(G_GNUC_UNUSED GError **error) {
- const gchar * const authors[] = {
+gplugin_query(G_GNUC_UNUSED GError **error)
+{
+ const gchar *const authors[] = {
"Gary Kramlich <grim@reaperworld.com>",
- NULL
- };
+ NULL};
return gplugin_plugin_info_new(
"gplugin/gjs-loader",
GPLUGIN_NATIVE_PLUGIN_ABI_VERSION,
- "internal", TRUE,
- "load-on-query", TRUE,
- "name", "Gjs JavaScript Plugin Loader",
- "version", GPLUGIN_VERSION,
- "license-id", "GPL3",
- "summary", "A plugin that can load Gjs JavaScript plugins",
- "description", "This plugin allows the loading of plugins written in "
- "Gjs JavaScript.",
- "authors", authors,
- "website", GPLUGIN_WEBSITE,
- "category", "loaders",
- NULL
- );
+ "internal",
+ TRUE,
+ "load-on-query",
+ TRUE,
+ "name",
+ "Gjs JavaScript Plugin Loader",
+ "version",
+ GPLUGIN_VERSION,
+ "license-id",
+ "GPL3",
+ "summary",
+ "A plugin that can load Gjs JavaScript plugins",
+ "description",
+ "This plugin allows the loading of plugins written in "
+ "Gjs JavaScript.",
+ "authors",
+ authors,
+ "website",
+ GPLUGIN_WEBSITE,
+ "category",
+ "loaders",
+ NULL);
}
extern "C" G_MODULE_EXPORT gboolean
-gplugin_load(GPluginNativePlugin *plugin,
- G_GNUC_UNUSED GError **error)
+gplugin_load(GPluginNativePlugin *plugin, G_GNUC_UNUSED GError **error)
{
+ GPluginManager *manager = gplugin_manager_get_default();
+
gplugin_gjs_loader_register(plugin);
gplugin_gjs_plugin_register(plugin);
- gplugin_manager_register_loader(gplugin_gjs_loader_get_type());
-
- return TRUE;
+ return gplugin_manager_register_loader(
+ manager,
+ gplugin_gjs_loader_get_type(),
+ error);
}
extern "C" G_MODULE_EXPORT gboolean
-gplugin_unload(G_GNUC_UNUSED GPluginNativePlugin *plugin,
- G_GNUC_UNUSED GError **error)
+gplugin_unload(
+ G_GNUC_UNUSED GPluginNativePlugin *plugin,
+ G_GNUC_UNUSED GError **error)
{
return FALSE;
}
-
--- a/gjs/gplugin-gjs-loader.cc Mon Feb 17 00:51:58 2020 -0600
+++ b/gjs/gplugin-gjs-loader.cc Wed Aug 11 03:59:38 2021 -0500
@@ -20,123 +20,35 @@
#include <glib/gi18n.h>
-#include <gjs/gjs.h>
-
-#include <jsapi.h>
-
struct _GPluginGjsLoader {
GPluginLoader parent;
-
- GjsContext *global_ctx;
};
/******************************************************************************
- * Helpers
- *****************************************************************************/
-static gboolean
-_gplugin_gjs_loader_eval_file(GjsContext *ctx,
- const gchar *filename,
- GError **error)
-{
- gint exit_code = 0;
-
- if(!gjs_context_eval_file(ctx, filename, &exit_code, error)) {
- return FALSE;
- }
-
- return exit_code == 0;
-}
-
-/******************************************************************************
* GPluginLoaderInterface API
*****************************************************************************/
static GSList *
-gplugin_gjs_loader_class_supported_extensions(G_GNUC_UNUSED GPluginLoaderClass *klass) {
- return g_slist_append(NULL, (gpointer)"js");
+gplugin_gjs_loader_supported_extensions(G_GNUC_UNUSED GPluginLoader *loader)
+{
+ return g_slist_append(NULL, (gpointer) "js");
}
static GPluginPlugin *
-gplugin_gjs_loader_query(GPluginLoader *loader,
- const gchar *filename,
- GError **error)
+gplugin_gjs_loader_query(
+ GPluginLoader *loader,
+ const gchar *filename,
+ GError **error)
{
- GObject *gobj = NULL;
- GPluginPluginInfo *info = NULL;
- GjsContext *ctx = NULL;
- JSContext *jsctx = NULL;
- JSObject *jsobj = NULL;
-
- ctx = gjs_context_new();
-
- g_message("ctx: %p", ctx);
-
- if(!_gplugin_gjs_loader_eval_file(ctx, filename, error)) {
- g_object_unref(G_OBJECT(ctx));
-
- return NULL;
- }
-
- jsctx = (JSContext*)gjs_context_get_native_context(ctx);
-
-#if 0
- /* now call the query function */
- JS::RootedValue rval(cx);
- JS::AutoValueArray<0> argv(cx);
- if(!JS_CallFunctionName(cx, NULL, "gplugin_query", argv, &rval)) {
- if(error) {
- *error = g_error_new(GPLUGIN_DOMAIN, 0,
- "Failed to call the query function");
- }
-
- g_object_unref(G_OBJECT(context));
-
- return NULL;
- }
-
- /* now grab the plugin info */
- if(!JS_ValueToObject(cx, rval, &jsobj)) {
- if(error) {
- *error = g_error_new(GPLUGIN_DOMAIN, 0,
- "Query function did not return a GObject");
- }
-
- g_object_unref(G_OBJECT(context));
-
- return NULL;
- }
-
- gobj = gjs_g_object_from_object(cx, jsobj);
- if(!GPLUGIN_IS_PLUGIN_INFO(gobj)) {
- if(error) {
- *error = g_error_new(GPLUGIN_DOMAIN, 0,
- "Query function did not return a "
- "GPluginPluginInfo object");
- }
-
- g_object_unref(G_OBJECT(context));
-
- return NULL;
- }
-
- info = GPLUGIN_PLUGIN_INFO(gobj);
-
- return (GPluginPlugin *)g_object_new(GPLUGIN_TYPE_GJS_PLUGIN,
- "filename", filename,
- "loader", loader,
- "info", info,
- "context", context,
- "global", scope,
- NULL);
-#endif
+ g_set_error(error, GPLUGIN_DOMAIN, 0, "not implemented");
return NULL;
}
static gboolean
-gplugin_gjs_loader_load_unload(G_GNUC_UNUSED GPluginLoader *loader,
- GPluginPlugin *plugin,
- gboolean load,
- G_GNUC_UNUSED GError **error)
+gplugin_gjs_loader_load(
+ GPluginLoader *loader,
+ GPluginPlugin *plugin,
+ GError **error)
{
g_set_error_literal(error, GPLUGIN_DOMAIN, 0, "unimplemented");
@@ -144,71 +56,51 @@
}
static gboolean
-gplugin_gjs_loader_load(GPluginLoader *loader, GPluginPlugin *plugin,
- GError **error)
+gplugin_gjs_loader_unload(
+ GPluginLoader *loader,
+ GPluginPlugin *plugin,
+ GError **error)
{
- return gplugin_gjs_loader_load_unload(loader, plugin, TRUE, error);
-}
+ g_set_error_literal(error, GPLUGIN_DOMAIN, 0, "unimplemented");
-static gboolean
-gplugin_gjs_loader_unload(GPluginLoader *loader, GPluginPlugin *plugin,
- GError **error)
-{
- return gplugin_gjs_loader_load_unload(loader, plugin, FALSE, error);
+ return FALSE;
}
/******************************************************************************
* GObject Implementation
*****************************************************************************/
-G_DEFINE_DYNAMIC_TYPE(GPluginGjsLoader, gplugin_gjs_loader, GPLUGIN_TYPE_LOADER);
+G_DEFINE_DYNAMIC_TYPE(
+ GPluginGjsLoader,
+ gplugin_gjs_loader,
+ GPLUGIN_TYPE_LOADER);
static void
-gplugin_gjs_loader_init(GPluginGjsLoader *loader) {
- const gchar *appname = g_get_prgname();
-
- if(appname == NULL) {
- appname = "gplugin";
- }
-
- loader->global_ctx = (GjsContext *)g_object_new(GJS_TYPE_CONTEXT,
- "program-name", appname,
- NULL);
-
- gjs_context_make_current(loader->global_ctx);
+gplugin_gjs_loader_init(GPluginGjsLoader *loader)
+{
}
static void
-gplugin_gjs_loader_finalize(GObject *obj) {
- GPluginGjsLoader *loader = GPLUGIN_GJS_LOADER(obj);
-
- g_clear_object(&loader->global_ctx);
-
- G_OBJECT_CLASS(gplugin_gjs_loader_parent_class)->finalize(obj);
-}
-
-static void
-gplugin_gjs_loader_class_init(G_GNUC_UNUSED GPluginGjsLoaderClass *klass) {
- GObjectClass *obj_class = G_OBJECT_CLASS(klass);
+gplugin_gjs_loader_class_init(G_GNUC_UNUSED GPluginGjsLoaderClass *klass)
+{
GPluginLoaderClass *loader_class = GPLUGIN_LOADER_CLASS(klass);
- obj_class->finalize = gplugin_gjs_loader_finalize;
-
loader_class->supported_extensions =
- gplugin_gjs_loader_class_supported_extensions;
+ gplugin_gjs_loader_supported_extensions;
loader_class->query = gplugin_gjs_loader_query;
loader_class->load = gplugin_gjs_loader_load;
loader_class->unload = gplugin_gjs_loader_unload;
}
static void
-gplugin_gjs_loader_class_finalize(G_GNUC_UNUSED GPluginGjsLoaderClass *klass) {
+gplugin_gjs_loader_class_finalize(G_GNUC_UNUSED GPluginGjsLoaderClass *klass)
+{
}
/******************************************************************************
* API
*****************************************************************************/
void
-gplugin_gjs_loader_register(GPluginNativePlugin *plugin) {
+gplugin_gjs_loader_register(GPluginNativePlugin *plugin)
+{
gplugin_gjs_loader_register_type(G_TYPE_MODULE(plugin));
}
-
--- a/gjs/gplugin-gjs-loader.h Mon Feb 17 00:51:58 2020 -0600
+++ b/gjs/gplugin-gjs-loader.h Wed Aug 11 03:59:38 2021 -0500
@@ -22,7 +22,12 @@
#include <gplugin-native.h>
#define GPLUGIN_TYPE_GJS_LOADER (gplugin_gjs_loader_get_type())
-G_DECLARE_FINAL_TYPE(GPluginGjsLoader, gplugin_gjs_loader, GPLUGIN_GJS, LOADER, GPluginLoader)
+G_DECLARE_FINAL_TYPE(
+ GPluginGjsLoader,
+ gplugin_gjs_loader,
+ GPLUGIN_GJS,
+ LOADER,
+ GPluginLoader)
G_BEGIN_DECLS
@@ -31,4 +36,3 @@
G_END_DECLS
#endif /* GPLUGIN_GJS_LOADER_H */
-
--- a/gjs/gplugin-gjs-plugin.cc Mon Feb 17 00:51:58 2020 -0600
+++ b/gjs/gplugin-gjs-plugin.cc Wed Aug 11 03:59:38 2021 -0500
@@ -17,143 +17,48 @@
#include "gplugin-gjs-plugin.h"
-#define GPLUGIN_GJS_PLUGIN_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE((obj), GPLUGIN_TYPE_GJS_PLUGIN, GPluginGjsPluginPrivate))
-
-/******************************************************************************
- * Typedefs
- *****************************************************************************/
-typedef struct {
- GjsContext *context;
-} GPluginGjsPluginPrivate;
-
-/******************************************************************************
- * Enums
- *****************************************************************************/
-enum {
- PROP_ZERO,
- PROP_CONTEXT,
- N_PROPERTIES,
+struct _GPluginGjsPlugin {
+ GObject parent;
};
-static GParamSpec *properties[N_PROPERTIES] = {NULL, };
-
-static void gplugin_gjs_plugin_iface_init(GPluginPluginInterface *iface);
-
-G_DEFINE_DYNAMIC_TYPE_EXTENDED(
- GPluginGjsPlugin,
- gplugin_gjs_plugin,
- G_TYPE_OBJECT,
- 0,
- G_ADD_PRIVATE_DYNAMIC(GPluginGjsPlugin)
- G_IMPLEMENT_INTERFACE(GPLUGIN_TYPE_PLUGIN, gplugin_gjs_plugin_iface_init)
-);
/******************************************************************************
* GPluginPlugin Implementation
*****************************************************************************/
static void
-gplugin_gjs_plugin_iface_init(G_GNUC_UNUSED GPluginPluginInterface *iface) {
+gplugin_gjs_plugin_iface_init(G_GNUC_UNUSED GPluginPluginInterface *iface)
+{
}
/******************************************************************************
* GObject Implementation
*****************************************************************************/
-static void
-gplugin_gjs_plugin_set_context(GPluginGjsPlugin *plugin, GjsContext *context) {
- GPluginGjsPluginPrivate *priv = GPLUGIN_GJS_PLUGIN_GET_PRIVATE(plugin);
-
- if(priv->context)
- g_object_unref(G_OBJECT(priv->context));
-
- if(GJS_IS_CONTEXT(context)) {
- priv->context = (GjsContext*)g_object_ref(G_OBJECT(context));
- } else {
- priv->context = NULL;
- }
-}
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+ GPluginGjsPlugin,
+ gplugin_gjs_plugin,
+ G_TYPE_OBJECT,
+ 0,
+ G_IMPLEMENT_INTERFACE(GPLUGIN_TYPE_PLUGIN, gplugin_gjs_plugin_iface_init));
static void
-gplugin_gjs_plugin_get_property(GObject *obj, guint param_id, GValue *value,
- GParamSpec *pspec)
+gplugin_gjs_plugin_init(G_GNUC_UNUSED GPluginGjsPlugin *plugin)
{
- GPluginGjsPlugin *plugin = GPLUGIN_GJS_PLUGIN(obj);
-
- switch(param_id) {
- case PROP_CONTEXT:
- g_value_set_object(value, gplugin_gjs_plugin_get_context(plugin));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
- break;
- }
}
static void
-gplugin_gjs_plugin_set_property(GObject *obj, guint param_id,
- const GValue *value, GParamSpec *pspec)
+gplugin_gjs_plugin_class_init(GPluginGjsPluginClass *klass)
{
- GPluginGjsPlugin *plugin = GPLUGIN_GJS_PLUGIN(obj);
-
- switch(param_id) {
- case PROP_CONTEXT:
- gplugin_gjs_plugin_set_context(plugin, (GjsContext*)g_value_get_object(value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
- break;
- }
-}
-
-static void
-gplugin_gjs_plugin_init(G_GNUC_UNUSED GPluginGjsPlugin *plugin) {
}
static void
-gplugin_gjs_plugin_finalize(GObject *obj) {
- GPluginGjsPluginPrivate *priv = GPLUGIN_GJS_PLUGIN_GET_PRIVATE(obj);
-
- g_clear_object(&priv->context);
-
- G_OBJECT_CLASS(gplugin_gjs_plugin_parent_class)->finalize(obj);
-}
-
-static void
-gplugin_gjs_plugin_class_init(GPluginGjsPluginClass *klass) {
- GObjectClass *obj_class = G_OBJECT_CLASS(klass);
-
- obj_class->get_property = gplugin_gjs_plugin_get_property;
- obj_class->set_property = gplugin_gjs_plugin_set_property;
- obj_class->finalize = gplugin_gjs_plugin_finalize;
-
- properties[PROP_CONTEXT] = g_param_spec_object(
- "context", "context",
- "The Gjs Context for this plugin",
- GJS_TYPE_CONTEXT,
- (GParamFlags)(G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)
- );
-
- g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
-}
-
-static void
-gplugin_gjs_plugin_class_finalize(G_GNUC_UNUSED GPluginGjsPluginClass *klass) {
+gplugin_gjs_plugin_class_finalize(G_GNUC_UNUSED GPluginGjsPluginClass *klass)
+{
}
/******************************************************************************
* API
*****************************************************************************/
void
-gplugin_gjs_plugin_register(GPluginNativePlugin *plugin) {
+gplugin_gjs_plugin_register(GPluginNativePlugin *plugin)
+{
gplugin_gjs_plugin_register_type(G_TYPE_MODULE(plugin));
}
-
-GjsContext *
-gplugin_gjs_plugin_get_context(const GPluginGjsPlugin *plugin) {
- GPluginGjsPluginPrivate *priv = NULL;
-
- g_return_val_if_fail(GPLUGIN_IS_GJS_PLUGIN(plugin), NULL);
-
- priv = GPLUGIN_GJS_PLUGIN_GET_PRIVATE(plugin);
-
- return priv->context;
-}
--- a/gjs/gplugin-gjs-plugin.h Mon Feb 17 00:51:58 2020 -0600
+++ b/gjs/gplugin-gjs-plugin.h Wed Aug 11 03:59:38 2021 -0500
@@ -18,37 +18,21 @@
#ifndef GPLUGIN_GJS_PLUGIN_H
#define GPLUGIN_GJS_PLUGIN_H
-#define GPLUGIN_TYPE_GJS_PLUGIN (gplugin_gjs_plugin_get_type())
-#define GPLUGIN_GJS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GPLUGIN_TYPE_GJS_PLUGIN, GPluginGjsPlugin))
-#define GPLUGIN_GJS_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((obj), GPLUGIN_TYPE_GJS_PLUGIN, GPluginGjsPluginClass))
-#define GPLUGIN_IS_GJS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GPLUGIN_TYPE_GJS_PLUGIN))
-#define GPLUGIN_IS_GJS_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((obj), GPLUGIN_TYPE_GJS_PLUGIN))
-#define GPLUGIN_GJS_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GPLUGIN_TYPE_GJS_PLUGIN, GPluginGjsPluginClass))
-
-typedef struct _GPluginGjsPlugin GPluginGjsPlugin;
-typedef struct _GPluginGjsPluginClass GPluginGjsPluginClass;
-
#include <gplugin.h>
#include <gplugin-native.h>
-#include <gjs/gjs.h>
-
-struct _GPluginGjsPlugin {
- GObject parent;
-};
-
-struct _GPluginGjsPluginClass {
- GObjectClass parent;
-};
+#define GPLUGIN_TYPE_GJS_PLUGIN (gplugin_gjs_plugin_get_type())
+G_DECLARE_FINAL_TYPE(
+ GPluginGjsPlugin,
+ glugin_gjs_plugin,
+ GPLUGIN_GJS,
+ PLUGIN,
+ GObject)
G_BEGIN_DECLS
void gplugin_gjs_plugin_register(GPluginNativePlugin *plugin);
-GType gplugin_gjs_plugin_get_type(void);
-
-GjsContext *gplugin_gjs_plugin_get_context(const GPluginGjsPlugin *plugin);
G_END_DECLS
#endif /* GPLUGIN_GJS_PLUGIN_H */
-
--- a/gjs/meson.build Mon Feb 17 00:51:58 2020 -0600
+++ b/gjs/meson.build Wed Aug 11 03:59:38 2021 -0500
@@ -1,5 +1,7 @@
+summary('gjs', get_option('gjs'), section : 'Loader Support', bool_yn : true)
+
if get_option('gjs')
- if not get_option('gobject-introspection')
+ if not get_option('introspection')
error('gnome-javascript plugin requires GObject Introspection.')
endif
@@ -17,13 +19,7 @@
GJS = dependency('gjs-1.0', version: '>=1.32.0')
# tell meson we need cpp since we have gjs
- add_languages('cpp')
-
- gjs_args = [
-# '-DPREFIX="@0@"'.format(get_option('prefix')),
-# '-DLIBDIR="@0@"'.format(get_option('libdir')),
- '-DGPLUGIN_WEBSITE="http://bitbucket.org/gplugin/main"',
- ]
+ add_languages('cpp', native : false)
shared_library('gplugin-gjs',
GPLUGIN_GJS_SOURCES,
@@ -31,8 +27,7 @@
name_prefix : '',
dependencies : [GIO, GJS, gplugin_dep],
install : true,
- install_dir : join_paths(get_option('libdir'), 'gplugin'),
- cpp_args: gjs_args,
+ install_dir : get_option('libdir') / 'gplugin',
)
endif # gjs
--- a/gjs/tests/meson.build Mon Feb 17 00:51:58 2020 -0600
+++ b/gjs/tests/meson.build Wed Aug 11 03:59:38 2021 -0500
@@ -3,7 +3,7 @@
e = executable('test-gjs-loader', 'test-gjs-loader.c',
include_directories : include_directories('.'),
c_args : [
- '-DGJS_LOADER_DIR="@0@/gjs"'.format(meson.build_root()),
+ '-DGJS_LOADER_DIR="@0@/gjs"'.format(meson.project_build_root()),
'-DGJS_PLUGIN_DIR="@0@/plugins"'.format(meson.current_source_dir()),
],
link_with : gplugin_loader_tests,
--- a/gjs/tests/test-gjs-loader.c Mon Feb 17 00:51:58 2020 -0600
+++ b/gjs/tests/test-gjs-loader.c Wed Aug 11 03:59:38 2021 -0500
@@ -21,11 +21,11 @@
#include <gplugin/gplugin-loader-tests.h>
gint
-main(gint argc, gchar **argv) {
+main(gint argc, gchar **argv)
+{
g_test_init(&argc, &argv, NULL);
gplugin_loader_tests_main(GJS_LOADER_DIR, GJS_PLUGIN_DIR, "gjs");
return g_test_run();
}
-
--- a/meson.build Mon Feb 17 00:51:58 2020 -0600
+++ b/meson.build Wed Aug 11 03:59:38 2021 -0500
@@ -1,7 +1,7 @@
###############################################################################
# Project Info
###############################################################################
-project('gplugin', 'c',
+project('gplugin', 'c', 'cpp',
license : 'LGPL-2.0-or-later',
version : '0.33.1-dev',
meson_version : '>=0.56.0',
@@ -67,6 +67,13 @@
language : 'c'
)
+add_project_arguments(
+ '-DPREFIX="@0@"'.format(get_option('prefix')),
+ '-DLIBDIR="@0@"'.format(get_option('libdir')),
+ '-DGPLUGIN_WEBSITE="https://keep.imfreedom.org/gplugin/gplugin"',
+ language : 'cpp'
+)
+
if compiler.has_argument('-Wformat')
add_project_arguments('-Wformat', language : 'c')
if compiler.has_multi_arguments(['-Wformat', '-Werror=format-security'])