Skip to content

Commit 267196d

Browse files
committed
Use droppable signal subscription
Instead of returning an opaque ID for manual unsubscription, let's instead return a struct which holds on the connection and automatically unsubscribes when dropped. This allows controlling the lifecycle of a signal subscription through the standard lifetime management of Rust which is a lot more convenient.
1 parent 93fefd4 commit 267196d

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

gio/src/dbus_connection.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,20 @@ pub struct ActionGroupExportId(NonZeroU32);
117117
pub struct MenuModelExportId(NonZeroU32);
118118
#[derive(Debug, Eq, PartialEq)]
119119
pub struct FilterId(NonZeroU32);
120+
120121
#[derive(Debug, Eq, PartialEq)]
121-
pub struct SignalSubscriptionId(NonZeroU32);
122+
struct SignalSubscriptionId(NonZeroU32);
123+
124+
#[derive(Debug)]
125+
pub struct SignalSubscription(DBusConnection, Option<SignalSubscriptionId>);
126+
127+
impl Drop for SignalSubscription {
128+
fn drop(&mut self) {
129+
if let Some(id) = self.1.take() {
130+
self.0.signal_unsubscribe(id);
131+
}
132+
}
133+
}
122134

123135
// rustdoc-stripper-ignore-next
124136
/// Build a registered DBus object, by handling different parts of DBus.
@@ -450,7 +462,7 @@ impl DBusConnection {
450462
arg0: Option<&str>,
451463
flags: DBusSignalFlags,
452464
callback: P,
453-
) -> SignalSubscriptionId {
465+
) -> SignalSubscription {
454466
let callback_data: Box_<P> = Box_::new(callback);
455467
unsafe extern "C" fn callback_func<
456468
P: Fn(&DBusConnection, &str, &str, &str, &str, &glib::Variant) + 'static,
@@ -502,12 +514,15 @@ impl DBusConnection {
502514
Box_::into_raw(super_callback0) as *mut _,
503515
destroy_call9,
504516
);
505-
SignalSubscriptionId(NonZeroU32::new_unchecked(id))
517+
SignalSubscription(
518+
self.clone(),
519+
Some(SignalSubscriptionId(NonZeroU32::new_unchecked(id))),
520+
)
506521
}
507522
}
508523

509524
#[doc(alias = "g_dbus_connection_signal_unsubscribe")]
510-
pub fn signal_unsubscribe(&self, subscription_id: SignalSubscriptionId) {
525+
fn signal_unsubscribe(&self, subscription_id: SignalSubscriptionId) {
511526
unsafe {
512527
ffi::g_dbus_connection_signal_unsubscribe(
513528
self.to_glib_none().0,

gio/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub use self::dbus::*;
3333
mod dbus_connection;
3434
pub use self::dbus_connection::{
3535
ActionGroupExportId, FilterId, MenuModelExportId, RegistrationBuilder, RegistrationId,
36-
SignalSubscriptionId, WatcherId,
36+
SignalSubscription, WatcherId,
3737
};
3838
mod dbus_message;
3939
mod dbus_method_invocation;

0 commit comments

Comments
 (0)