[seed] modules: Add GtkBuilder module for handling gtkbuilder signal connection



commit 0aab273bdb295febb68e76d07433ddd4283f9ef6
Author: Robert Carr <racarr svn gnome org>
Date:   Wed May 20 22:11:34 2009 -0400

    modules: Add GtkBuilder module for handling gtkbuilder signal connection
---
 configure.ac                    |   38 ++++++++++++++++++
 libseed/seed.h                  |    7 ++-
 modules/Makefile.am             |    2 +-
 modules/gtkbuilder/Makefile.am  |   27 +++++++++++++
 modules/gtkbuilder/gtkbuilder.c |   81 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 152 insertions(+), 3 deletions(-)

diff --git a/configure.ac b/configure.ac
index 444d9f7..3d46f96 100644
--- a/configure.ac
+++ b/configure.ac
@@ -186,6 +186,16 @@ AC_ARG_ENABLE(os-module,
 AM_CONDITIONAL(BUILD_OS_MODULE, test "x$want_os_module" = "xyes")
 AC_SUBST(BUILD_OS_MODULE)
 
+dnl ==== os ====
+AC_ARG_ENABLE(os-module,
+			  AC_HELP_STRING([--enable-os-module],
+							 [enable the os Seed module. [default=yes]]),
+			  [want_os_module=$enableval],[want_os_module="yes"])
+
+
+AM_CONDITIONAL(BUILD_OS_MODULE, test "x$want_os_module" = "xyes")
+AC_SUBST(BUILD_OS_MODULE)
+
 dnl ==== libxml ====
 AC_ARG_ENABLE(libxml-module,
 			  AC_HELP_STRING([--enable-libxml-module],
@@ -201,6 +211,32 @@ fi
 AM_CONDITIONAL(BUILD_LIBXML_MODULE, test "x$want_libxml_module" = "xyes")
 AC_SUBST(BUILD_LIBXML_MODULE)
 
+dnl ==== os ====
+AC_ARG_ENABLE(os-module,
+			  AC_HELP_STRING([--enable-os-module],
+							 [enable the os Seed module. [default=yes]]),
+			  [want_os_module=$enableval],[want_os_module="yes"])
+
+
+AM_CONDITIONAL(BUILD_OS_MODULE, test "x$want_os_module" = "xyes")
+AC_SUBST(BUILD_OS_MODULE)
+
+dnl ==== gtkbuilder ====
+AC_ARG_ENABLE(gtkbuilder-module,
+			  AC_HELP_STRING([--enable-gtkbuilder-module],
+							 [enable the gtkbuilder Seed module. [default=yes]]),
+			  [want_gtkbuilder_module=$enableval],[want_gtkbuilder_module="yes"])
+
+if test x"$want_gtkbuilder_module" == x"yes" ; then
+   PKG_CHECK_MODULES(GTK, gtk+-2.0)
+   AC_SUBST(GTK_CFLAGS)
+   AC_SUBST(GTK_LDFLAGS)
+fi
+
+AM_CONDITIONAL(BUILD_GTKBUILDER_MODULE, test "x$want_gtkbuilder_module" = "xyes")
+AC_SUBST(BUILD_GTKBUILDER_MODULE)
+
+
 dnl ==== cairo ====
 AC_ARG_ENABLE(cairo-module,
 			  AC_HELP_STRING([--enable-cairo-module],
@@ -373,6 +409,7 @@ modules/dbus/Makefile
 modules/dbus/util/Makefile
 modules/libxml/Makefile
 modules/cairo/Makefile
+modules/gtkbuilder/Makefile
 ])
 AC_OUTPUT
 
@@ -396,6 +433,7 @@ Modules:
    DBus.......................$want_dbus_module
    libxml.....................$want_libxml_module
    cairo......................$want_cairo_module
+   gtkbuilder.................$want_gtkbuilder_module
 
 Examples:
    Turtle.....................$want_turtle_example
diff --git a/libseed/seed.h b/libseed/seed.h
index 9efad7d..f1e09c9 100644
--- a/libseed/seed.h
+++ b/libseed/seed.h
@@ -78,10 +78,13 @@ SeedEngine *seed_init (gint *argc, gchar ***argv);
 SeedEngine *seed_init_with_context_group (gint *argc, gchar ***argv,
 					  SeedContextGroup group);
 
-SeedValue seed_simple_evaluate (SeedContext ctx, gchar * source, SeedException *exception);
+SeedValue seed_simple_evaluate (SeedContext ctx, 
+				gchar * source, 
+				SeedException *exception);
 
 SeedScript *seed_make_script (SeedContext ctx,
-			      const gchar * js, const gchar * source_url,
+			      const gchar * js, 
+			      const gchar * source_url,
 			      gint line_number);
 SeedScript *seed_script_new_from_file (SeedContext ctx, gchar * file);
 SeedException seed_script_exception (SeedScript * s);
diff --git a/modules/Makefile.am b/modules/Makefile.am
index a658a85..c29069e 100644
--- a/modules/Makefile.am
+++ b/modules/Makefile.am
@@ -1 +1 @@
-SUBDIRS = example sqlite canvas Multiprocessing readline os sandbox dbus libxml cairo
+SUBDIRS = example sqlite canvas Multiprocessing readline os sandbox dbus libxml cairo gtkbuilder
diff --git a/modules/gtkbuilder/Makefile.am b/modules/gtkbuilder/Makefile.am
new file mode 100644
index 0000000..d24cd5a
--- /dev/null
+++ b/modules/gtkbuilder/Makefile.am
@@ -0,0 +1,27 @@
+if BUILD_GTKBUILDER_MODULE
+
+seedlibdir = ${libdir}/seed
+
+seedlib_LTLIBRARIES = \
+	libgtkbuilder.la
+
+libgtkbuilder_la_SOURCES = \
+	gtkbuilder.c
+
+
+AM_CPPFLAGS = \
+	-I top_srcdir@/libseed/ \
+	$(GOBJECT_INTROSPECTION_CFLAGS) \
+	$(GTK_CFLAGS) \
+	$(SEED_DEBUG_CFLAGS) \
+	$(SEED_PROFILE_CFLAGS)
+
+libgtkbuilder_la_LDFLAGS = \
+	$(GTK_LDFLAGS) \
+	$(GOBJECT_INTROSPECTION_LDFLAGS) \
+	$(SEED_PROFILE_LIBS)
+
+endif
+
+
+
diff --git a/modules/gtkbuilder/gtkbuilder.c b/modules/gtkbuilder/gtkbuilder.c
new file mode 100644
index 0000000..6aaba49
--- /dev/null
+++ b/modules/gtkbuilder/gtkbuilder.c
@@ -0,0 +1,81 @@
+#include <seed.h>
+#include <gtk/gtk.h>
+
+typedef struct _builder_ud {
+  SeedContext ctx;
+  SeedObject obj;
+  SeedObject user_data;
+} builder_ud;
+
+// Need to support connect object.
+static void
+seed_builder_connect_func (GtkBuilder *builder,
+			   GObject *object,
+			   const gchar *signal_name,
+			   const gchar *handler_name,
+			   GObject *connect_object,
+			   GConnectFlags flags,
+			   gpointer user_data)
+{
+  SeedContext ctx;
+  SeedObject obj, func;
+  builder_ud *priv = (builder_ud *)user_data;
+  GClosure *closure;
+
+  ctx = priv->ctx;
+  obj = priv->obj;
+
+  func = seed_object_get_property (ctx, obj, handler_name);
+  if (!seed_value_is_object (ctx, func) || !seed_value_is_function (ctx, func))
+    return;
+  
+  closure = seed_closure_new (ctx, func, priv->user_data, "signal handler (GtkBuilder)");
+  
+  g_signal_connect_closure (object, signal_name, closure, FALSE);
+}
+
+SeedValue
+seed_gtk_builder_connect_signals(SeedContext ctx,
+				 SeedObject function,
+				 SeedObject this_object,
+				 gsize argument_count,
+				 const SeedValue arguments[],
+				 SeedException *exception)
+{
+  builder_ud ud;
+  GtkBuilder *b;
+  
+  if (!seed_value_is_object (ctx, arguments[0]))
+    {
+      seed_make_exception (ctx, exception, "ArgumentError",
+			   "connect_signals expects one object as an argument");
+      return seed_make_undefined (ctx);
+    }
+  
+  b = GTK_BUILDER (seed_value_to_object (ctx, this_object, exception));
+  ud.ctx = ctx;
+  ud.obj = arguments[0];
+  if (argument_count == 2)
+    ud.user_data = arguments[1];
+  else
+    ud.user_data = NULL;
+  gtk_builder_connect_signals_full(b, seed_builder_connect_func, &ud);
+  
+  return seed_make_undefined (ctx);
+}
+
+SeedObject
+seed_module_init(SeedEngine *eng)
+{
+  SeedObject gtkbuilder_proto;
+  
+  gtkbuilder_proto = seed_simple_evaluate (eng->context,
+					   "imports.gi.Gtk.Builder.prototype",
+					   NULL);
+  seed_create_function (eng->context,
+			"connect_signals", 
+			seed_gtk_builder_connect_signals,
+			gtkbuilder_proto);
+
+  return seed_make_object (eng->context, NULL, NULL);
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]