summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/xfer.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/core/xfer.c b/src/core/xfer.c
index a755d438a..4d7d6b43e 100644
--- a/src/core/xfer.c
+++ b/src/core/xfer.c
@@ -54,6 +54,7 @@ static struct xfer_metadata dummy_metadata;
* @ret rc Return status code
*/
int xfer_vredirect ( struct interface *intf, int type, va_list args ) {
+ struct interface tmp = INTF_INIT ( null_intf_desc );
struct interface *dest;
xfer_vredirect_TYPE ( void * ) *op =
intf_get_dest_op_no_passthru ( intf, xfer_vredirect, &dest );
@@ -66,8 +67,22 @@ int xfer_vredirect ( struct interface *intf, int type, va_list args ) {
if ( op ) {
rc = op ( object, type, args );
} else {
- /* Default is to reopen the interface as instructed */
+ /* Default is to reopen the interface as instructed,
+ * then send xfer_window_changed() messages to both
+ * new child and parent interfaces. Since our
+ * original child interface is likely to be closed and
+ * unplugged as a result of the call to
+ * xfer_vreopen(), we create a temporary interface in
+ * order to be able to send xfer_window_changed() to
+ * the parent.
+ */
+ intf_plug ( &tmp, dest );
rc = xfer_vreopen ( dest, type, args );
+ if ( rc == 0 ) {
+ xfer_window_changed ( dest );
+ xfer_window_changed ( &tmp );
+ }
+ intf_unplug ( &tmp );
}
if ( rc != 0 ) {