gobject-introspection r225 - in trunk: . giscanner tests/parser
- From: johan svn gnome org
- To: svn-commits-list gnome org
- Subject: gobject-introspection r225 - in trunk: . giscanner tests/parser
- Date: Fri, 25 Apr 2008 17:26:51 +0100 (BST)
Author: johan
Date: Fri Apr 25 16:26:51 2008
New Revision: 225
URL: http://svn.gnome.org/viewvc/gobject-introspection?rev=225&view=rev
Log:
2008-04-25 Johan Dahlin <jdahlin async com br>
* giscanner/cgobject.py:
* giscanner/gidlwriter.py:
* giscanner/gobjecttreebuilder.py:
Add support for signals
* tests/parser/foo.c (foo_object_class_init):
* Foo-expected.gidl:
Add a signal and update the expected output.
Modified:
trunk/ChangeLog
trunk/giscanner/cgobject.py
trunk/giscanner/gidlwriter.py
trunk/giscanner/gobjecttreebuilder.py
trunk/tests/parser/Foo-expected.gidl
trunk/tests/parser/foo.c
Modified: trunk/giscanner/cgobject.py
==============================================================================
--- trunk/giscanner/cgobject.py (original)
+++ trunk/giscanner/cgobject.py Fri Apr 25 16:26:51 2008
@@ -87,6 +87,20 @@
('owner_type', GType)]
+class GSignalInfo(ctypes.Structure):
+ _fields_ = [('signal_id', ctypes.c_uint),
+ ('signal_name', ctypes.c_char_p),
+ ('itype', GType),
+ ('signal_flags', ctypes.c_uint),
+ ('return_type', GType),
+ ('n_params', ctypes.c_uint),
+ ('param_types', ctypes.POINTER(GType))]
+
+ def get_params(self):
+ for i in range(self.n_params):
+ yield self.param_types[i]
+
+
_library_path = find_library('gobject-2.0')
if not _library_path:
raise ImportError("Could not find gobject-2.0 library")
@@ -161,3 +175,12 @@
type_ids = _gobj.g_type_interface_prerequisites(type_id, ctypes.byref(n))
for i in range(n.value):
yield type_ids[i]
+
+_gobj.g_signal_list_ids.restype = ctypes.POINTER(ctypes.c_int)
+def signal_list(type_id):
+ n = ctypes.c_uint()
+ signal_ids = _gobj.g_signal_list_ids(type_id, ctypes.byref(n))
+ for i in range(n.value):
+ info = GSignalInfo()
+ _gobj.g_signal_query(signal_ids[i], ctypes.byref(info))
+ yield info
Modified: trunk/giscanner/gidlwriter.py
==============================================================================
--- trunk/giscanner/gidlwriter.py (original)
+++ trunk/giscanner/gidlwriter.py Fri Apr 25 16:26:51 2008
@@ -110,6 +110,8 @@
self._write_method(method)
for prop in node.properties:
self._write_property(prop)
+ for signal in node.signals:
+ self._write_signal(signal)
def _write_boxed(self, boxed):
attrs = [('name', boxed.name),
@@ -127,6 +129,12 @@
('prop', prop.type)]
self.write_tag('property', attrs)
+ def _write_signal(self, signal):
+ attrs = [('name', signal.name)]
+ with self.tagcontext('signal', attrs):
+ self._write_return_type(signal.retval)
+ self._write_parameters(signal.parameters)
+
def _write_callback(self, func):
attrs = [('name', func.name)]
with self.tagcontext('callback', attrs):
Modified: trunk/giscanner/gobjecttreebuilder.py
==============================================================================
--- trunk/giscanner/gobjecttreebuilder.py (original)
+++ trunk/giscanner/gobjecttreebuilder.py Fri Apr 25 16:26:51 2008
@@ -5,7 +5,7 @@
from . import cgobject
from .odict import odict
from .treebuilder import (Callback, Class, Enum, Function, Interface,
- Member, Property, Struct)
+ Member, Node, Parameter, Property, Return, Struct)
# Copied from h2defs.py
_upperstr_pat1 = re.compile(r'([^A-Z])([A-Z])')
@@ -60,7 +60,7 @@
Class.__init__(self, name, parent)
self.type_name = type_name
self.get_type = get_type
-
+ self.signals = []
class GLibBoxed(Struct):
def __init__(self, name, type_name, get_type):
@@ -76,12 +76,20 @@
Interface.__init__(self, name)
self.type_name = type_name
self.get_type = get_type
+ self.signals = []
class GLibProperty(Property):
pass
+class GLibSignal(Node):
+ def __init__(self, name, retval):
+ Node.__init__(self, name)
+ self.retval = retval
+ self.parameters = []
+
+
class GObjectTreeBuilder(object):
def __init__(self, namespace_name):
self._namespace_name = namespace_name
@@ -307,6 +315,7 @@
self._resolve_type_name(parent_type_name),
type_name, symbol)
self._introspect_properties(node, type_id)
+ self._introspect_signals(node, type_id)
self._add_attribute(node)
self._remove_attribute(type_name)
self._register_internal_type(type_name, node)
@@ -316,6 +325,7 @@
node = GLibInterface(self._strip_namespace_object(type_name),
type_name, symbol)
self._introspect_properties(node, type_id)
+ self._introspect_signals(node, type_id)
self._add_attribute(node)
self._remove_attribute(type_name)
self._register_internal_type(type_name, node)
@@ -343,3 +353,16 @@
node.properties.append(Property(
pspec.name,
cgobject.type_name(pspec.value_type)))
+
+ def _introspect_signals(self, node, type_id):
+ for signal_info in cgobject.signal_list(type_id):
+ retval = Return(cgobject.type_name(signal_info.return_type))
+ signal = GLibSignal(signal_info.signal_name, retval)
+ for i, parameter in enumerate(signal_info.get_params()):
+ if i == 0:
+ name = 'object'
+ else:
+ name = 'p%s' % (i-1,)
+ signal.parameters.append(
+ Parameter(name, cgobject.type_name(parameter)))
+ node.signals.append(signal)
Modified: trunk/tests/parser/Foo-expected.gidl
==============================================================================
--- trunk/tests/parser/Foo-expected.gidl (original)
+++ trunk/tests/parser/Foo-expected.gidl Fri Apr 25 16:26:51 2008
@@ -117,6 +117,14 @@
</parameters>
</method>
<property name="string" type="char*" readable="1" writable="1" construct="1" construct-only="0"/>
+ <signal name="signal" when="LAST">
+ <return-type type="char*"/>
+ <parameters>
+ <parameter name="object" type="FooObject*"/>
+ <parameter name="p0" type="GObject*"/>
+ <parameter name="p1" type="gpointer"/>
+ </parameters>
+ </signal>
</object>
<object name="FooSubobject" parent="FooObject" type-name="FooSubobject" get-type="foo_subobject_get_type">
<constructor name="new" symbol="foo_subobject_new">
Modified: trunk/tests/parser/foo.c
==============================================================================
--- trunk/tests/parser/foo.c (original)
+++ trunk/tests/parser/foo.c Fri Apr 25 16:26:51 2008
@@ -30,13 +30,21 @@
return object_type;
}
-G_DEFINE_TYPE (FooObject, foo_object, G_TYPE_OBJECT);
enum {
PROP_0,
PROP_STRING
};
+enum {
+ SIGNAL,
+ LAST_SIGNAL
+};
+
+static guint foo_object_signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (FooObject, foo_object, G_TYPE_OBJECT);
+
static void
foo_object_set_property (GObject *object,
guint prop_id,
@@ -90,6 +98,15 @@
"The String Property Blurb",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ foo_object_signals[SIGNAL] =
+ g_signal_new ("signal",
+ G_OBJECT_CLASS_TYPE (gobject_class),
+ G_SIGNAL_RUN_LAST,
+ NULL,
+ NULL, NULL,
+ (GSignalCMarshaller)g_cclosure_marshal_STRING__OBJECT_POINTER,
+ G_TYPE_STRING, 2, G_TYPE_OBJECT, G_TYPE_POINTER);
+
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]