@@ -125,6 +125,7 @@ struct CsmManagerPrivate
125125 GDBusServer * dialog_server ;
126126 guint dialog_reg_id ;
127127 CsmLogoutAction dialog_action ;
128+ gchar * dialog_bus_address ;
128129
129130 char * session_name ;
130131 gboolean is_fallback_session : 1 ;
@@ -2917,7 +2918,10 @@ register_manager (CsmManager *manager)
29172918
29182919 // Set up private controller interface for dialog
29192920 gchar * guid = g_dbus_generate_guid ();
2920- GDBusServer * server = g_dbus_server_new_sync (DBUS_ADDRESS ,
2921+ manager -> priv -> dialog_bus_address = g_strdup_printf ("%s-%s" , DBUS_ADDRESS , guid );
2922+ g_debug ("Dialog server address: %s" , manager -> priv -> dialog_bus_address );
2923+
2924+ GDBusServer * server = g_dbus_server_new_sync (manager -> priv -> dialog_bus_address ,
29212925 G_DBUS_SERVER_FLAGS_AUTHENTICATION_REQUIRE_SAME_USER ,
29222926 guid ,
29232927 NULL , NULL , & error );
@@ -3537,6 +3541,9 @@ csm_manager_dispose (GObject *object)
35373541 manager -> priv -> dialog_reg_id = 0 ;
35383542 g_dbus_node_info_unref (introspection_data );
35393543 g_dbus_server_stop (manager -> priv -> dialog_server );
3544+ g_object_unref (manager -> priv -> dialog_server );
3545+ g_object_unref (manager -> priv -> dialog_connection );
3546+ g_free (manager -> priv -> dialog_bus_address );
35403547 }
35413548
35423549 if (manager -> priv -> clients != NULL ) {
@@ -3926,6 +3933,34 @@ on_dialog_exited (GObject *source,
39263933 g_clear_object (& dialog_cancellable );
39273934}
39283935
3936+ static void
3937+ on_dialog_read (GObject * source ,
3938+ GAsyncResult * result ,
3939+ gpointer user_data )
3940+ {
3941+ GInputStream * stream = G_INPUT_STREAM (source );
3942+
3943+ g_debug ("Session quit dialog read output" );
3944+
3945+ gssize read = g_input_stream_read_finish (stream , result , NULL );
3946+ if (read > 0 ) {
3947+ g_debug ("Session quit dialog (self-owned) output: %.*s" , (gint ) read , (gchar * ) user_data );
3948+ } else {
3949+ g_debug ("Session quit dialog (self-owned) stdout closed" );
3950+ g_free (user_data );
3951+ g_input_stream_close (stream , NULL , NULL );
3952+ return ;
3953+ }
3954+
3955+ g_input_stream_read_async (stream ,
3956+ user_data ,
3957+ 1024 ,
3958+ G_PRIORITY_DEFAULT ,
3959+ NULL ,
3960+ (GAsyncReadyCallback ) on_dialog_read ,
3961+ user_data );
3962+ }
3963+
39293964static void
39303965terminate_dialog (void )
39313966{
@@ -3959,12 +3994,13 @@ launch_dialog (CsmManager *manager, const gchar *flag)
39593994 const gchar * argv [] = {
39603995 "cinnamon-session-quit" ,
39613996 "--sm-owned" ,
3997+ "--sm-bus-id" , manager -> priv -> dialog_bus_address ,
39623998 flag ,
39633999 NULL
39644000 };
39654001
39664002 error = NULL ;
3967- dialog_process = g_subprocess_newv (argv , G_SUBPROCESS_FLAGS_NONE , & error );
4003+ dialog_process = g_subprocess_newv (argv , G_SUBPROCESS_FLAGS_STDERR_MERGE | G_SUBPROCESS_FLAGS_STDOUT_PIPE , & error );
39684004
39694005 if (dialog_process == NULL ) {
39704006 if (error != NULL ) {
@@ -3974,6 +4010,16 @@ launch_dialog (CsmManager *manager, const gchar *flag)
39744010 }
39754011 }
39764012
4013+ GInputStream * stdout = g_subprocess_get_stdout_pipe (dialog_process );
4014+ guint8 * buffer = g_malloc (1024 );
4015+ g_input_stream_read_async (G_INPUT_STREAM (stdout ),
4016+ buffer ,
4017+ 1024 ,
4018+ G_PRIORITY_DEFAULT ,
4019+ NULL ,
4020+ (GAsyncReadyCallback ) on_dialog_read ,
4021+ buffer );
4022+
39774023 dialog_cancellable = g_cancellable_new ();
39784024
39794025 g_subprocess_wait_async (dialog_process ,
0 commit comments