|
5 | 5 | from itertools import islice
|
6 | 6 | from xml.etree import ElementTree
|
7 | 7 |
|
| 8 | +from pydbus.generic import signal |
| 9 | + |
8 | 10 |
|
9 | 11 | PROPERTY_EMITS_SIGNAL = "org.freedesktop.DBus.Property.EmitsChangedSignal"
|
10 | 12 |
|
@@ -149,7 +151,7 @@ def valid_member(member):
|
149 | 151 | """Only select members with the correct type and name."""
|
150 | 152 | if isinstance(member, property):
|
151 | 153 | member = member.fget
|
152 |
| - elif not ismethod(member): |
| 154 | + elif not ismethod(member) and not isinstance(member, signal): |
153 | 155 | return False
|
154 | 156 | return member.__name__[0].isupper()
|
155 | 157 |
|
@@ -190,6 +192,17 @@ def valid_member(member):
|
190 | 192 | entry, "annotation",
|
191 | 193 | {"name": PROPERTY_EMITS_SIGNAL, "value": "true"})
|
192 | 194 | attributes["access"] = "readwrite"
|
| 195 | + elif isinstance(value, signal): |
| 196 | + if hasattr(value, "arguments"): |
| 197 | + arguments = value.arguments |
| 198 | + elif require_strong_typing: |
| 199 | + raise ValueError( |
| 200 | + "No argument definitions for signal " |
| 201 | + "'{}'".format(value.__name__)) |
| 202 | + entry = ElementTree.SubElement(value, "signal") |
| 203 | + for arg, arg_type in arguments: |
| 204 | + ElementTree.SubElement( |
| 205 | + entry, "arg", {"name": arg, "type": arg_type}) |
193 | 206 | elif ismethod(value):
|
194 | 207 | arg_types, ret_type = verify_arguments(value)
|
195 | 208 | entry = ElementTree.SubElement(get_interface(value), "method")
|
|
0 commit comments