diff --git a/godot-codegen/src/generator/signals.rs b/godot-codegen/src/generator/signals.rs index ce81b89f7..87e49745a 100644 --- a/godot-codegen/src/generator/signals.rs +++ b/godot-codegen/src/generator/signals.rs @@ -131,7 +131,7 @@ fn make_with_signals_impl( // Used outside, to document class with links to this type. pub fn make_collection_name(class_name: &TyName) -> Ident { - format_ident!("SignalsIn{}", class_name.rust_ty) + format_ident!("SignalsOf{}", class_name.rust_ty) } fn make_individual_struct_name(signal_name: &str) -> Ident { diff --git a/godot-core/src/registry/signal/connect_builder.rs b/godot-core/src/registry/signal/connect_builder.rs index 420997289..4d18b3f4c 100644 --- a/godot-core/src/registry/signal/connect_builder.rs +++ b/godot-core/src/registry/signal/connect_builder.rs @@ -183,6 +183,7 @@ macro_rules! impl_builder_connect { F: FnMut(&mut C, $($Ps),*) -> R + 'static, { let mut gd = self.parent_sig.receiver_object(); + let godot_fn = make_godot_fn(move |($($args,)*): ($($Ps,)*)| { let mut guard = Gd::bind_mut(&mut gd); function(&mut *guard, $($args),*); @@ -201,11 +202,12 @@ macro_rules! impl_builder_connect { /// - If you need cross-thread signals, use [`connect_sync()`](#method.connect_sync) instead (requires feature `experimental-threads`). pub fn connect_self_gd(self, mut function: F) where - F: FnMut(&mut Gd, $($Ps),*) -> R + 'static, + F: FnMut(Gd, $($Ps),*) -> R + 'static, { - let mut gd = self.parent_sig.receiver_object(); + let gd = self.parent_sig.receiver_object(); + let godot_fn = make_godot_fn(move |($($args,)*): ($($Ps,)*)| { - function(&mut gd, $($args),*); + function(gd.clone(), $($args),*); }); self.inner_connect_godot_fn::(godot_fn); @@ -253,12 +255,12 @@ macro_rules! impl_builder_connect { pub fn connect_other_gd(self, object: &impl ToSignalObj, mut method: F) where OtherC: GodotClass, - F: FnMut(&mut Gd, $($Ps),*) -> R + 'static, + F: FnMut(Gd, $($Ps),*) -> R + 'static, { - let mut gd = object.to_signal_obj(); + let gd = object.to_signal_obj(); let godot_fn = make_godot_fn(move |($($args,)*): ($($Ps,)*)| { - method(&mut gd, $($args),*); + method(gd.clone(), $($args),*); }); self.inner_connect_godot_fn::(godot_fn); diff --git a/itest/rust/src/builtin_tests/containers/signal_test.rs b/itest/rust/src/builtin_tests/containers/signal_test.rs index f371b2f38..866560c65 100644 --- a/itest/rust/src/builtin_tests/containers/signal_test.rs +++ b/itest/rust/src/builtin_tests/containers/signal_test.rs @@ -59,10 +59,10 @@ fn signal_symbols_internal() { // Check that closure is invoked. assert_eq!(tracker.get(), 1234, "Emit failed (closure)"); - // Check that instance method is invoked. + // Check that instance methods self_receive() and self_receive_gd_inc1() are invoked. assert_eq!( emitter.bind().last_received_int, - 1234, + 1234 + 1, // self_receive_gd_inc1() increments by 1, and should be called after self_receive(). "Emit failed (method)" ); @@ -400,7 +400,7 @@ fn signal_symbols_connect_inferred() { .tree_exiting() .builder() .flags(ConnectFlags::DEFERRED) - .connect_self_gd(|this| { + .connect_self_gd(|mut this| { // Use methods that `Node` declares. let _ = this.get_path(); // ref. this.set_unique_name_in_owner(true); // mut. @@ -422,7 +422,7 @@ fn signal_symbols_connect_inferred() { .signals() .tree_exiting() .builder() - .connect_other_gd(&user, |this| { + .connect_other_gd(&user, |mut this| { // Use methods that `Node` declares. let _ = this.get_path(); // ref. this.set_unique_name_in_owner(true); // mut. @@ -513,6 +513,14 @@ mod emitter { } } + #[func] + pub fn self_receive_gd_inc1(mut this: Gd, _arg1: i64) { + #[cfg(since_api = "4.2")] + { + this.bind_mut().last_received_int += 1; + } + } + #[func] pub fn self_receive_constant(&mut self) { #[cfg(since_api = "4.2")] @@ -534,6 +542,7 @@ mod emitter { sig.connect_self(Self::self_receive); sig.connect(Self::self_receive_static); sig.connect(move |i| tracker.set(i)); + sig.builder().connect_self_gd(Self::self_receive_gd_inc1); } #[cfg(since_api = "4.2")]