[gnome-shell] Split off the extension importing stuff into a new library, 'ShellJS'
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] Split off the extension importing stuff into a new library, 'ShellJS'
- Date: Tue, 7 Feb 2012 21:18:37 +0000 (UTC)
commit b2f33e28956b701c55f5fcb67de6cfc51c9ef151
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Wed Jan 18 19:41:07 2012 -0500
Split off the extension importing stuff into a new library, 'ShellJS'
This allows us to create a separate utility to import things from
shell extensions that does not have the entire Shell stack built up
https://bugzilla.gnome.org/show_bug.cgi?id=668429
configure.ac | 1 +
js/ui/extensionSystem.js | 3 +-
src/Makefile.am | 26 ++++++++++++++-
src/shell-global.c | 64 ------------------------------------
src/shell-global.h | 6 ---
src/shell-js.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++
src/shell-js.h | 16 +++++++++
7 files changed, 125 insertions(+), 72 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 1e03042..33e79db 100644
--- a/configure.ac
+++ b/configure.ac
@@ -117,6 +117,7 @@ AC_CHECK_FUNCS(JS_NewGlobalObject XFixesCreatePointerBarrier)
CFLAGS=$saved_CFLAGS
LIBS=$saved_LIBS
+PKG_CHECK_MODULES(GNOME_SHELL_JS, glib-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.2 gnome-desktop-3.0 >= 2.90.0 x11)
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
index 9aadb3a..23470e1 100644
--- a/js/ui/extensionSystem.js
+++ b/js/ui/extensionSystem.js
@@ -8,6 +8,7 @@ const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const St = imports.gi.St;
const Shell = imports.gi.Shell;
+const ShellJS = imports.gi.ShellJS;
const Soup = imports.gi.Soup;
const Config = imports.misc.config;
@@ -388,7 +389,7 @@ function loadExtension(dir, type, enabled) {
let extensionModule;
let extensionState = null;
try {
- global.add_extension_importer('imports.ui.extensionSystem.extensions', meta.uuid, dir.get_path());
+ ShellJS.add_extension_importer('imports.ui.extensionSystem.extensions', meta.uuid, dir.get_path());
extensionModule = extensions[meta.uuid].extension;
} catch (e) {
if (stylesheetPath != null)
diff --git a/src/Makefile.am b/src/Makefile.am
index 6ec1f06..a46d779 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -86,7 +86,7 @@ gnome_shell_cflags = \
-DJSDIR=\"$(pkgdatadir)/js\"
privlibdir = $(pkglibdir)
-privlib_LTLIBRARIES = libgnome-shell.la
+privlib_LTLIBRARIES = libgnome-shell.la libgnome-shell-js.la
shell_built_sources = \
shell-enum-types.h \
@@ -182,6 +182,23 @@ EXTRA_DIST += test-gapplication.js
########################################
+libgnome_shell_js_la_SOURCES = \
+ shell-js.h \
+ shell-js.c \
+ $(NULL)
+
+libgnome_shell_js_la_LIBADD = \
+ $(GNOME_SHELL_JS_LIBS) \
+ $(NULL)
+
+libgnome_shell_js_la_LDFLAGS = \
+ -avoid-version
+
+libgnome_shell_js_la_CPPFLAGS = \
+ $(GNOME_SHELL_JS_CFLAGS)
+
+########################################
+
shell_recorder_sources = \
shell-recorder.c \
shell-recorder.h
@@ -275,6 +292,13 @@ Shell_0_1_gir_SCANNERFLAGS = --include-uninstalled=$(builddir)/St-1.0.gir \
INTROSPECTION_GIRS += Shell-0.1.gir
CLEANFILES += Shell-0.1.gir
+ShellJS-0.1.gir: libgnome-shell-js.la
+ShellJS_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
+ShellJS_0_1_gir_LIBS = libgnome-shell-js.la
+ShellJS_0_1_gir_FILES = $(libgnome_shell_js_la_SOURCES)
+INTROSPECTION_GIRS += ShellJS-0.1.gir
+CLEANFILES += ShellJS-0.1.gir
+
St-1.0.gir: libst-1.0.la
St_1_0_gir_INCLUDES = Clutter-1.0 Gtk-3.0
St_1_0_gir_CFLAGS = $(st_cflags) -DST_COMPILATION
diff --git a/src/shell-global.c b/src/shell-global.c
index e41a883..2e7e200 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -1177,70 +1177,6 @@ shell_global_destroy_pointer_barrier (ShellGlobal *global, guint32 barrier)
#endif
}
-
-/**
- * shell_global_add_extension_importer:
- * @target_object_script: JavaScript code evaluating to a target object
- * @target_property: Name of property to use for importer
- * @directory: Source directory:
- * @error: A #GError
- *
- * This function sets a property named @target_property on the object
- * resulting from the evaluation of @target_object_script code, which
- * acts as a GJS importer for directory @directory.
- *
- * Returns: %TRUE on success
- */
-gboolean
-shell_global_add_extension_importer (ShellGlobal *global,
- const char *target_object_script,
- const char *target_property,
- const char *directory,
- GError **error)
-{
- jsval target_object;
- JSContext *context = gjs_context_get_native_context (global->js_context);
- char *search_path[2] = { 0, 0 };
-
- JS_BeginRequest (context);
-
- // This is a bit of a hack; ideally we'd be able to pass our target
- // object directly into this function, but introspection doesn't
- // support that at the moment. Instead evaluate a string to get it.
- if (!JS_EvaluateScript(context,
- JS_GetGlobalObject(context),
- target_object_script,
- strlen (target_object_script),
- "<target_object_script>",
- 0,
- &target_object))
- {
- char *message;
- gjs_log_exception(context,
- &message);
- g_set_error(error,
- G_IO_ERROR,
- G_IO_ERROR_FAILED,
- "%s", message ? message : "(unknown)");
- g_free(message);
- goto out_error;
- }
-
- if (!JSVAL_IS_OBJECT (target_object))
- {
- g_error ("shell_global_add_extension_importer: invalid target object");
- goto out_error;
- }
-
- search_path[0] = (char*)directory;
- gjs_define_importer (context, JSVAL_TO_OBJECT (target_object), target_property, (const char **)search_path, FALSE);
- JS_EndRequest (context);
- return TRUE;
- out_error:
- JS_EndRequest (context);
- return FALSE;
-}
-
/* Code to close all file descriptors before we exec; copied from gspawn.c in GLib.
*
* Authors: Padraig O'Briain, Matthias Clasen, Lennart Poettering
diff --git a/src/shell-global.h b/src/shell-global.h
index ba87f46..6456c9e 100644
--- a/src/shell-global.h
+++ b/src/shell-global.h
@@ -119,12 +119,6 @@ void shell_global_run_at_leisure (ShellGlobal *global,
/* Misc utilities / Shell API */
-gboolean shell_global_add_extension_importer (ShellGlobal *global,
- const char *target_object_script,
- const char *target_property,
- const char *directory,
- GError **error);
-
void shell_global_sync_pointer (ShellGlobal *global);
GAppLaunchContext *
diff --git a/src/shell-js.c b/src/shell-js.c
new file mode 100644
index 0000000..8267fdc
--- /dev/null
+++ b/src/shell-js.c
@@ -0,0 +1,81 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+#include "config.h"
+
+#include "shell-js.h"
+
+#include <jsapi.h>
+#include <gio/gio.h>
+#include <gjs/gjs.h>
+#include <gjs/gjs-module.h>
+
+/**
+ * shell_js_add_extension_importer:
+ * @target_object_script: JavaScript code evaluating to a target object
+ * @target_property: Name of property to use for importer
+ * @directory: Source directory:
+ * @error: A #GError
+ *
+ * This function sets a property named @target_property on the object
+ * resulting from the evaluation of @target_object_script code, which
+ * acts as a GJS importer for directory @directory.
+ *
+ * Returns: %TRUE on success
+ */
+gboolean
+shell_js_add_extension_importer (const char *target_object_script,
+ const char *target_property,
+ const char *directory,
+ GError **error)
+{
+ jsval target_object;
+ GList *contexts;
+ JSContext *context;
+ char *search_path[2] = { 0, 0 };
+ gboolean ret = FALSE;
+
+ /* Take the first GjsContext from all of them --
+ * we should only ever have one context, so this
+ * should be alright. */
+ contexts = gjs_context_get_all ();
+ context = gjs_context_get_native_context (contexts->data);
+ g_list_free_full (contexts, g_object_unref);
+
+ JS_BeginRequest (context);
+
+ /* This is a bit of a hack; ideally we'd be able to pass our target
+ * object directly into this function, but introspection doesn't
+ * support that at the moment. Instead evaluate a string to get it. */
+ if (!JS_EvaluateScript(context,
+ JS_GetGlobalObject(context),
+ target_object_script,
+ strlen (target_object_script),
+ "<target_object_script>",
+ 0,
+ &target_object))
+ {
+ char *message;
+ gjs_log_exception(context,
+ &message);
+ g_set_error(error,
+ G_IO_ERROR,
+ G_IO_ERROR_FAILED,
+ "%s", message ? message : "(unknown)");
+ g_free(message);
+ goto out;
+ }
+
+ if (!JSVAL_IS_OBJECT (target_object))
+ {
+ g_error ("shell_js_add_extension_importer: invalid target object");
+ goto out;
+ }
+
+ search_path[0] = (char*)directory;
+ gjs_define_importer (context, JSVAL_TO_OBJECT (target_object), target_property, (const char **)search_path, FALSE);
+ ret = TRUE;
+
+ out:
+ JS_EndRequest (context);
+ return ret;
+}
diff --git a/src/shell-js.h b/src/shell-js.h
new file mode 100644
index 0000000..26cbf4d
--- /dev/null
+++ b/src/shell-js.h
@@ -0,0 +1,16 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+#ifndef __SHELL_JS_H__
+#define __SHELL_JS_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+gboolean shell_js_add_extension_importer (const char *target_object_script,
+ const char *target_property,
+ const char *directory,
+ GError **error);
+
+G_BEGIN_DECLS
+
+#endif /* __SHELL_JS_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]