Skip to content

Commit

Permalink
codegen: Better handling of EmitsChangedSignal for crossroads
Browse files Browse the repository at this point in the history
Closes: #460
  • Loading branch information
diwic committed Mar 13, 2024
1 parent a36c4a7 commit 35f7ad3
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 7 deletions.
9 changes: 9 additions & 0 deletions dbus-codegen-tests/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,15 @@ static DEPRECATED_XML: &'static str = r#"
<property name="property_name" type="s" access="readwrite">
<annotation name="org.freedesktop.DBus.Deprecated" value="this property is deprecated"/>
</property>
<property name="property_true" type="s" access="readwrite">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="true"/>
</property>
<property name="property_invalidates" type="s" access="readwrite">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/>
</property>
<property name="property_false" type="s" access="readwrite">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
</property>
</interface>
</node>
"#;
Expand Down
17 changes: 10 additions & 7 deletions dbus-codegen/src/generate/write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -304,10 +304,14 @@ fn cr_strs(args: &[Arg]) -> String {
args.iter().fold(String::new(), |mut ss, arg| { ss += &format!("\"{}\",", arg.name); ss })
}

fn cr_anno(a: &HashMap<String, String>, prefix: &str, suffix: &str) -> String {
fn cr_anno(a: &HashMap<String, String>, prefix: &str, suffix: &str, is_prop: bool) -> String {
let mut r = String::new();
for (name, value) in a.iter() {
r.push_str(&format!("\n{}.annotate(\"{}\", \"{}\"){}", prefix, name, value, suffix));
if is_prop && name == "org.freedesktop.DBus.Property.EmitsChangedSignal" {
r.push_str(&format!("\n{}.emits_changed_{}(){}", prefix, value, suffix));
} else {
r.push_str(&format!("\n{}.annotate(\"{}\", \"{}\"){}", prefix, name, value, suffix));
}
}
r
}
Expand All @@ -319,10 +323,10 @@ where T: {} + Send + 'static
{{
cr.register("{}", |b| {{
"#, make_snake(&i.shortname, false), make_camel(&i.shortname), i.origname);
*s += &cr_anno(&i.annotations, " b", ";\n");
*s += &cr_anno(&i.annotations, " b", ";\n", false);
for z in &i.signals {
*s += &format!(" b.signal::<({}), _>(\"{}\", ({})){};\n",
cr_types(&z.args)?, z.name, cr_strs(&z.args), cr_anno(&z.annotations, " ", ""));
cr_types(&z.args)?, z.name, cr_strs(&z.args), cr_anno(&z.annotations, " ", "", false));
}
for m in &i.methods {
let ivars = m.iargs.iter().fold(String::new(), |mut ss, arg| { ss += &format!("{},", arg.name); ss });
Expand All @@ -333,18 +337,17 @@ where T: {} + Send + 'static
if m.oargs.len() == 1 {
*s += " .map(|x| (x,))\n";
}
*s += &format!(" }}){};\n", cr_anno(&m.annotations, " ", ""));
*s += &format!(" }}){};\n", cr_anno(&m.annotations, " ", "", false));
}
for p in &i.props {
*s += &format!(" b.property::<{}, _>(\"{}\")", p.typename()?, p.name);
if p.can_get() {
*s += &format!("\n .get(|_, t: &mut T| t.{}())", p.get_fn_name);
}
if p.can_set() {
// TODO: Handle EmitsChangedSignal correctly here.
*s += &format!("\n .set(|_, t: &mut T, value| t.{}(value).map(|_| None))", p.set_fn_name);
}
*s += &cr_anno(&p.annotations, " ", "");
*s += &cr_anno(&p.annotations, " ", "", true);
*s += ";\n";
}

Expand Down

0 comments on commit 35f7ad3

Please sign in to comment.