summaryrefslogtreecommitdiff
path: root/gio/gdbus-2.0/codegen
diff options
context:
space:
mode:
authorPhilip Withnall <philip@tecnocode.co.uk>2018-12-21 12:34:55 +0000
committerPhilip Withnall <philip@tecnocode.co.uk>2018-12-21 12:34:55 +0000
commit87ea4ce1ffb42e341e18e36e7049a64d127bb68e (patch)
tree4e4221f3408a93e244759fdddbe76361d07e7d7e /gio/gdbus-2.0/codegen
parentac974a721fc5f00bd65c62f8bf823717926d4d19 (diff)
parent5731f065414394c1c9f04c38c884bc475590af80 (diff)
downloadglib-87ea4ce1ffb42e341e18e36e7049a64d127bb68e.tar.gz
Merge branch 'gdbus-codegen-propemitschanged' into 'master'
honor "Property.EmitsChangedSignal" annotations Closes #542 See merge request GNOME/glib!532
Diffstat (limited to 'gio/gdbus-2.0/codegen')
-rw-r--r--gio/gdbus-2.0/codegen/codegen.py18
-rw-r--r--gio/gdbus-2.0/codegen/dbustypes.py7
2 files changed, 20 insertions, 5 deletions
diff --git a/gio/gdbus-2.0/codegen/codegen.py b/gio/gdbus-2.0/codegen/codegen.py
index df3dfb723..8dabc1448 100644
--- a/gio/gdbus-2.0/codegen/codegen.py
+++ b/gio/gdbus-2.0/codegen/codegen.py
@@ -959,7 +959,8 @@ class CodeGenerator:
'{\n'
' GDBusPropertyInfo parent_struct;\n'
' const gchar *hyphen_name;\n'
- ' gboolean use_gvariant;\n'
+ ' guint use_gvariant : 1;\n'
+ ' guint emits_changed_signal : 1;\n'
'} _ExtendedGDBusPropertyInfo;\n'
'\n')
@@ -1254,9 +1255,13 @@ class CodeGenerator:
' "%s",\n'
%(p.name_hyphen))
if not utils.lookup_annotation(p.annotations, 'org.gtk.GDBus.C.ForceGVariant'):
- self.outfile.write(' FALSE\n')
+ self.outfile.write(' FALSE,\n')
else:
+ self.outfile.write(' TRUE,\n')
+ if p.emits_changed_signal:
self.outfile.write(' TRUE\n')
+ else:
+ self.outfile.write(' FALSE\n')
self.outfile.write('};\n'
'\n')
@@ -2892,14 +2897,17 @@ class CodeGenerator:
' const GValue *value,\n'
' GParamSpec *pspec)\n'
'{\n'%(i.name_lower))
- self.outfile.write(' %sSkeleton *skeleton = %s%s_SKELETON (object);\n'
+ self.outfile.write(' const _ExtendedGDBusPropertyInfo *info;\n'
+ ' %sSkeleton *skeleton = %s%s_SKELETON (object);\n'
' g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
+ ' info = (const _ExtendedGDBusPropertyInfo *) _%s_property_info_pointers[prop_id - 1];\n'
' g_mutex_lock (&skeleton->priv->lock);\n'
' g_object_freeze_notify (object);\n'
' if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))\n'
' {\n'
- ' if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)\n'
- ' _%s_schedule_emit_changed (skeleton, (const _ExtendedGDBusPropertyInfo *) _%s_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]);\n'
+ ' if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL &&\n'
+ ' info->emits_changed_signal)\n'
+ ' _%s_schedule_emit_changed (skeleton, info, prop_id, &skeleton->priv->properties[prop_id - 1]);\n'
' g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);\n'
' g_object_notify_by_pspec (object, pspec);\n'
' }\n'
diff --git a/gio/gdbus-2.0/codegen/dbustypes.py b/gio/gdbus-2.0/codegen/dbustypes.py
index 2ff736a5e..60c53c4be 100644
--- a/gio/gdbus-2.0/codegen/dbustypes.py
+++ b/gio/gdbus-2.0/codegen/dbustypes.py
@@ -354,6 +354,7 @@ class Property:
self.doc_string = ''
self.since = ''
self.deprecated = False
+ self.emits_changed_signal = True
def post_process(self, interface_prefix, cns, cns_upper, cns_lower, containing_iface):
if len(self.doc_string) == 0:
@@ -386,6 +387,12 @@ class Property:
for a in self.annotations:
a.post_process(interface_prefix, cns, cns_upper, cns_lower, self)
+ # FIXME: for now we only support 'false' and 'const' on the signal itself, see #674913 and
+ # http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
+ # for details
+ if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Property.EmitsChangedSignal') in ('false', 'const'):
+ self.emits_changed_signal = False
+
class Interface:
def __init__(self, name):
self.name = name