[gnome-builder/wip/libide: 205/237] wip
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/libide: 205/237] wip
- Date: Tue, 17 Feb 2015 21:46:38 +0000 (UTC)
commit 8aee3da0c98a7fa875528869edf1c8814cff1766
Author: Christian Hergert <christian hergert me>
Date: Sun Feb 15 13:44:06 2015 -0800
wip
build/autotools/autoconf.d/50_dependencies.post-am | 5 +-
configure.ac | 2 +
libide/Makefile.am | 8 +
libide/gjs/ide-gjs-script.cpp | 225 ++++++++++++++++++++
libide/gjs/ide-gjs-script.h | 34 +++
libide/ide-script.c | 2 +-
6 files changed, 274 insertions(+), 2 deletions(-)
---
diff --git a/build/autotools/autoconf.d/50_dependencies.post-am
b/build/autotools/autoconf.d/50_dependencies.post-am
index 7e8a729..ff6a092 100644
--- a/build/autotools/autoconf.d/50_dependencies.post-am
+++ b/build/autotools/autoconf.d/50_dependencies.post-am
@@ -2,6 +2,7 @@ m4_define([gtk_required_version], [3.15.6])
m4_define([glib_required_version], [2.43.4])
m4_define([gtksourceview_required_version], [3.15.4])
m4_define([ggit_required_version], [0.0.24])
+m4_define([gjs_required_version], [1.42.0])
PKG_CHECK_MODULES(BUILDER, [gtk+-3.0 >= gtk_required_version
gtksourceview-3.0 >= gtksourceview_required_version
@@ -11,7 +12,9 @@ PKG_CHECK_MODULES(BUILDER, [gtk+-3.0 >= gtk_required_version
PKG_CHECK_MODULES(LIBIDE, [gio-2.0 >= glib_required_version
gio-unix-2.0 >= glib_required_version
gtksourceview-3.0 >= gtksourceview_required_version
- libgit2-glib-1.0 >= ggit_required_version])
+ libgit2-glib-1.0 >= ggit_required_version
+ gjs-1.0 >= gjs_required_version
+ gjs-internals-1.0 >= gjs_required_version])
AC_PATH_PROG([LLVM_CONFIG], [llvm-config])
diff --git a/configure.ac b/configure.ac
index bc00594..258f345 100644
--- a/configure.ac
+++ b/configure.ac
@@ -25,6 +25,8 @@ AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"],
[GETTEXT package name])
AM_GLIB_GNU_GETTEXT
+AC_PROG_CXX
+
# Initlize libtool and things that go with it.
m4_include([build/autotools/autoconf.d/pre-lt.m4])
m4_include([build/autotools/autoconf.d/setup_libtool.m4])
diff --git a/libide/Makefile.am b/libide/Makefile.am
index 9a088ae..158c80d 100644
--- a/libide/Makefile.am
+++ b/libide/Makefile.am
@@ -32,6 +32,8 @@ libide_la_public_sources = \
libide/editorconfig/ide-editorconfig-file-settings.h \
libide/git/ide-git-vcs.c \
libide/git/ide-git-vcs.h \
+ libide/gjs/ide-gjs-script.cpp \
+ libide/gjs/ide-gjs-script.h \
libide/gsettings/ide-gsettings-file-settings.c \
libide/gsettings/ide-gsettings-file-settings.h \
libide/ide-back-forward-item.c \
@@ -167,16 +169,22 @@ libide_la_CFLAGS = \
-I$(top_srcdir)/libide/editorconfig \
-I$(top_srcdir)/libide/editorconfig/libeditorconfig \
-I$(top_srcdir)/libide/git \
+ -I$(top_srcdir)/libide/gjs \
-I$(top_srcdir)/libide/gsettings \
-I$(top_srcdir)/libide/local \
-I$(top_srcdir)/libide/tasks \
$(LIBIDE_CFLAGS)
+libide_la_CXXFLAGS = \
+ $(libide_la_CFLAGS) \
+ $(NULL)
+
libide_la_LIBADD = \
$(CLANG_LDFLAGS) \
$(LIBIDE_LIBS) \
-lclang \
libeditorconfig.la \
+ -lstdc++ \
$(NULL)
diff --git a/libide/gjs/ide-gjs-script.cpp b/libide/gjs/ide-gjs-script.cpp
new file mode 100644
index 0000000..03848fc
--- /dev/null
+++ b/libide/gjs/ide-gjs-script.cpp
@@ -0,0 +1,225 @@
+/* ide-gjs-script.c
+ *
+ * Copyright (C) 2015 Christian Hergert <christian hergert me>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+#include <gjs/gjs.h>
+#include <gjs/gjs-module.h>
+#include <gi/object.h>
+#include <glib/gi18n.h>
+#undef GLIB_DISABLE_DEPRECATION_WARNINGS
+
+#include <jsapi.h>
+
+#include "ide-gjs-script.h"
+
+struct _IdeGjsScript
+{
+ IdeScript parent_instance;
+
+ GFile *file;
+ GjsContext *gjs;
+};
+
+G_DEFINE_TYPE (IdeGjsScript, ide_gjs_script, IDE_TYPE_SCRIPT)
+
+enum {
+ PROP_0,
+ PROP_FILE,
+ LAST_PROP
+};
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+
+/**
+ * ide_gjs_script_get_file:
+ *
+ * Retrieves the #GFile containing the script to be loaded in the context.
+ *
+ * Returns: (transfer none): A #GFile.
+ */
+GFile *
+ide_gjs_script_get_file (IdeGjsScript *self)
+{
+ g_return_val_if_fail (IDE_IS_GJS_SCRIPT (self), NULL);
+
+ return self->file;
+}
+
+static void
+ide_gjs_script_set_file (IdeGjsScript *self,
+ GFile *file)
+{
+ g_return_if_fail (IDE_IS_GJS_SCRIPT (self));
+ g_return_if_fail (G_IS_FILE (file));
+ g_return_if_fail (!self->file);
+
+ self->file = (GFile *)g_object_ref (file);
+}
+
+static void
+set_global (GjsContext *context,
+ const gchar *name,
+ GObject *value)
+{
+ JSContext *jscontext;
+ JSObject *jsglobal;
+ jsval jsvalue;
+
+ jscontext = (JSContext *)gjs_context_get_native_context (context);
+ jsglobal = (JSObject *)gjs_get_global_object (jscontext);
+ jsvalue.setObject (*gjs_object_from_g_object (jscontext, value));
+
+ if (!JS_SetProperty (jscontext, jsglobal, "Context", &jsvalue))
+ {
+ g_warning (_("Failed to set IdeContext in JavaScript runtime."));
+ return;
+ }
+}
+
+static void
+ide_gjs_script_load (IdeScript *script)
+{
+ IdeGjsScript *self = (IdeGjsScript *)script;
+ IdeContext *context;
+ g_autoptr(GError) error = NULL;
+ g_autoptr(gchar) contents = NULL;
+ g_autoptr(gchar) path;
+ gsize len;
+ int exit_status = 0;
+
+ g_return_if_fail (IDE_IS_GJS_SCRIPT (self));
+ g_return_if_fail (!self->gjs);
+ g_return_if_fail (G_IS_FILE (self->file));
+
+ if (!self->file)
+ {
+ g_warning (_("Attempt to load a GJS script with no filename."));
+ return;
+ }
+
+ path = g_file_get_basename (self->file);
+
+ if (!g_file_load_contents (self->file, NULL, &contents, &len, NULL, &error))
+ {
+ g_warning ("%s", error->message);
+ return;
+ }
+
+ self->gjs = gjs_context_new ();
+
+ if (!self->gjs)
+ {
+ g_warning (_("Failed to create JavaScript context."));
+ return;
+ }
+
+ context = ide_object_get_context (IDE_OBJECT (self));
+ set_global (self->gjs, "Context", G_OBJECT (context));
+
+ if (!gjs_context_eval (self->gjs, contents, len, path, &exit_status, &error))
+ {
+ g_warning ("%s", error->message);
+ return;
+ }
+
+ g_info ("GJS script \"%s\" loaded.", path);
+}
+
+static void
+ide_gjs_script_unload (IdeScript *self)
+{
+ g_return_if_fail (IDE_IS_GJS_SCRIPT (self));
+}
+
+static void
+ide_gjs_script_finalize (GObject *object)
+{
+ IdeGjsScript *self = (IdeGjsScript *)object;
+
+ g_clear_object (&self->file);
+
+ G_OBJECT_CLASS (ide_gjs_script_parent_class)->finalize (object);
+}
+
+static void
+ide_gjs_script_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ IdeGjsScript *self = IDE_GJS_SCRIPT (object);
+
+ switch (prop_id)
+ {
+ case PROP_FILE:
+ g_value_set_object (value, ide_gjs_script_get_file (self));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+ide_gjs_script_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ IdeGjsScript *self = IDE_GJS_SCRIPT (object);
+
+ switch (prop_id)
+ {
+ case PROP_FILE:
+ ide_gjs_script_set_file (self, (GFile *)g_value_get_object (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+ide_gjs_script_class_init (IdeGjsScriptClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ IdeScriptClass *script_class = IDE_SCRIPT_CLASS (klass);
+
+ object_class->finalize = ide_gjs_script_finalize;
+ object_class->get_property = ide_gjs_script_get_property;
+ object_class->set_property = ide_gjs_script_set_property;
+
+ script_class->load = ide_gjs_script_load;
+ script_class->unload = ide_gjs_script_unload;
+
+ gParamSpecs [PROP_FILE] =
+ g_param_spec_object ("file",
+ _("File"),
+ _("The file containing the script contents."),
+ G_TYPE_FILE,
+ (GParamFlags)(G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class, PROP_FILE,
+ gParamSpecs [PROP_FILE]);
+}
+
+static void
+ide_gjs_script_init (IdeGjsScript *self)
+{
+}
diff --git a/libide/gjs/ide-gjs-script.h b/libide/gjs/ide-gjs-script.h
new file mode 100644
index 0000000..14b540d
--- /dev/null
+++ b/libide/gjs/ide-gjs-script.h
@@ -0,0 +1,34 @@
+/* ide-gjs-script.h
+ *
+ * Copyright (C) 2015 Christian Hergert <christian hergert me>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef IDE_GJS_SCRIPT_H
+#define IDE_GJS_SCRIPT_H
+
+#include "ide-script.h"
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_GJS_SCRIPT (ide_gjs_script_get_type())
+
+G_DECLARE_FINAL_TYPE (IdeGjsScript, ide_gjs_script, IDE, GJS_SCRIPT, IdeScript)
+
+GFile *ide_gjs_script_get_file (IdeGjsScript *self);
+
+G_END_DECLS
+
+#endif /* IDE_GJS_SCRIPT_H */
diff --git a/libide/ide-script.c b/libide/ide-script.c
index 0fb85bf..657ad31 100644
--- a/libide/ide-script.c
+++ b/libide/ide-script.c
@@ -20,7 +20,7 @@
#include "ide-script.h"
-G_DEFINE_TYPE (IdeScript, ide_script, IDE_TYPE_OBJECT)
+G_DEFINE_ABSTRACT_TYPE (IdeScript, ide_script, IDE_TYPE_OBJECT)
enum {
LOAD,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]