patch 8.2.3920: restoring directory after using another window is inefficient

Problem:    Restoring directory after using another window is inefficient.
Solution:   Only restore the directory for win_execute().  Apply 'autochdir'
            only when needed.
diff --git a/src/evalwindow.c b/src/evalwindow.c
index 794d6aa..ebab856 100644
--- a/src/evalwindow.c
+++ b/src/evalwindow.c
@@ -707,6 +707,21 @@
     if (wp != NULL && tp != NULL)
     {
 	pos_T	curpos = wp->w_cursor;
+	char_u	cwd[MAXPATHL];
+	int	cwd_status;
+	char_u	autocwd[MAXPATHL];
+	int	apply_acd = FALSE;
+
+	cwd_status = mch_dirname(cwd, MAXPATHL);
+
+	// If 'acd' is set, check we are using that directory.  If yes, then
+	// apply 'acd' afterwards, otherwise restore the current directory.
+	if (cwd_status == OK && p_acd)
+	{
+	    do_autochdir();
+	    apply_acd = mch_dirname(autocwd, MAXPATHL) == OK
+						  && STRCMP(cwd, autocwd) == 0;
+	}
 
 	if (switch_win_noblock(&save_curwin, &save_curtab, wp, tp, TRUE) == OK)
 	{
@@ -714,6 +729,10 @@
 	    execute_common(argvars, rettv, 1);
 	}
 	restore_win_noblock(save_curwin, save_curtab, TRUE);
+	if (apply_acd)
+	    do_autochdir();
+	else if (cwd_status == OK)
+	    mch_chdir((char *)cwd);
 
 	// Update the status line if the cursor moved.
 	if (win_valid(wp) && !EQUAL_POS(curpos, wp->w_cursor))
@@ -1316,9 +1335,5 @@
 	// to the first valid window.
 	win_goto(firstwin);
 # endif
-
-    // If called by win_execute() and executing the command changed the
-    // directory, it now has to be restored.
-    fix_current_dir();
 }
 #endif