@@ -37,6 +37,7 @@ mod imp {
3737 <arg type='u' name='delay' direction='in'/>
3838 <arg type='s' name='greet' direction='out'/>
3939 </method>
40+ <method name='GoodBye'></method>
4041 </interface>
4142</node>
4243"# ;
@@ -56,6 +57,7 @@ mod imp {
5657 enum HelloMethod {
5758 Hello ( Hello ) ,
5859 SlowHello ( SlowHello ) ,
60+ GoodBye ,
5961 }
6062
6163 impl DBusMethodCall for HelloMethod {
@@ -68,6 +70,7 @@ mod imp {
6870 match method {
6971 "Hello" => Ok ( params. get :: < Hello > ( ) . map ( Self :: Hello ) ) ,
7072 "SlowHello" => Ok ( params. get :: < SlowHello > ( ) . map ( Self :: SlowHello ) ) ,
73+ "GoodBye" => Ok ( Some ( Self :: GoodBye ) ) ,
7174 _ => Err ( glib:: Error :: new ( IOErrorEnum :: Failed , "No such method" ) ) ,
7275 }
7376 . and_then ( |p| {
@@ -94,24 +97,33 @@ mod imp {
9497 connection
9598 . register_object ( "/com/github/gtk_rs/examples/HelloWorld" , & example)
9699 . typed_method_call :: < HelloMethod > ( )
97- . invoke_and_return_future_local ( |_, sender, call| {
98- println ! ( "Method call from {sender:?}" ) ;
99- async {
100- match call {
101- HelloMethod :: Hello ( Hello { name } ) => {
102- let greet = format ! ( "Hello {name}!" ) ;
103- println ! ( "{greet}" ) ;
104- Ok ( Some ( greet. to_variant ( ) ) )
105- }
106- HelloMethod :: SlowHello ( SlowHello { name, delay } ) => {
107- glib:: timeout_future ( Duration :: from_secs ( delay as u64 ) ) . await ;
108- let greet = format ! ( "Hello {name} after {delay} seconds!" ) ;
109- println ! ( "{greet}" ) ;
110- Ok ( Some ( greet. to_variant ( ) ) )
100+ . invoke_and_return_future_local ( glib:: clone!(
101+ #[ strong( rename_to = app) ]
102+ self . obj( ) ,
103+ move |_, sender, call| {
104+ println!( "Method call from {sender:?}" ) ;
105+ let app = app. clone( ) ;
106+ async move {
107+ match call {
108+ HelloMethod :: Hello ( Hello { name } ) => {
109+ let greet = format!( "Hello {name}!" ) ;
110+ println!( "{greet}" ) ;
111+ Ok ( Some ( greet. to_variant( ) ) )
112+ }
113+ HelloMethod :: SlowHello ( SlowHello { name, delay } ) => {
114+ glib:: timeout_future( Duration :: from_secs( delay as u64 ) ) . await ;
115+ let greet = format!( "Hello {name} after {delay} seconds!" ) ;
116+ println!( "{greet}" ) ;
117+ Ok ( Some ( greet. to_variant( ) ) )
118+ }
119+ HelloMethod :: GoodBye => {
120+ app. quit( ) ;
121+ Ok ( None )
122+ }
111123 }
112124 }
113125 }
114- } )
126+ ) )
115127 . build ( )
116128 }
117129 }
@@ -140,9 +152,9 @@ mod imp {
140152 Ok ( true )
141153 }
142154
143- fn shutdown ( & self ) {
155+ fn dbus_unregister ( & self , connection : & DBusConnection , object_path : & str ) {
156+ self . parent_dbus_unregister ( connection, object_path) ;
144157 if let Some ( id) = self . registration_id . take ( ) {
145- let connection = self . obj ( ) . dbus_connection ( ) . expect ( "connection" ) ;
146158 if connection. unregister_object ( id) . is_ok ( ) {
147159 println ! ( "Unregistered object" ) ;
148160 } else {
@@ -154,6 +166,8 @@ mod imp {
154166 fn activate ( & self ) {
155167 println ! ( "Waiting for DBus Hello method to be called. Call the following command from another terminal:" ) ;
156168 println ! ( "dbus-send --print-reply --dest=com.github.gtk-rs.examples.RegisterDBusObject /com/github/gtk_rs/examples/HelloWorld com.github.gtk_rs.examples.HelloWorld.Hello string:YourName" ) ;
169+ println ! ( "Quit with the following command:" ) ;
170+ println ! ( "dbus-send --print-reply --dest=com.github.gtk-rs.examples.RegisterDBusObject /com/github/gtk_rs/examples/HelloWorld com.github.gtk_rs.examples.HelloWorld.GoodBye" ) ;
157171 }
158172 }
159173}
0 commit comments