		/*********************************
		 *                               *
		 *   Visual Shell v1.17  10/92   *
		 *                               *
		 *     by Torsten Jürgeleit      *
		 *                               *
		 *         action part 1         *
		 *                               *
		 *********************************/

	/* Includes */

#include "includes.h"
#include "imports.h"
#include "protos.h"

	/* Perform action signaled by input event handler */

   VOID
perform_action(VOID)
{
   BOOL remove = FALSE;

   event_mode = EVENT_MODE_NORMAL;
   do {
      ULONG signals = Wait(SIGF_INTUITION | SIGF_ACTION);

      if (signals & SIGF_INTUITION) {   /* event from Intuition ? */
	 struct IntuiMessage  *msg;

	 while (msg = (struct IntuiMessage *)GetMsg(con_window->UserPort)) {
	    ULONG class = msg->Class;

	    ReplyMsg((struct Message *)msg);
	    switch (class) {
	       case REFRESHWINDOW :
		  refresh_display();
		  break;
	       case INTUITICKS :
		  remove = perform_intuitick_action();
		  break;
	    }
	 }
      }
      if ((signals & SIGF_ACTION) && (show_flag || action ==
		     VSH_ACTION_F1 || action == VSH_ACTION_QUIT || action ==
		  VSH_ACTION_HELP || action == VSH_ACTION_ABOUT || action ==
		       VSH_ACTION_CONFIG || action == VSH_ACTION_NUMLOCK)) {
	 switch (action) {
	    case VSH_ACTION_F1 :
	       action_display_mode();
	       break;
	    case VSH_ACTION_F2 :
	       action_duplicate();
	       break;
	    case VSH_ACTION_F3 :
	       action_view();
	       break;
	    case VSH_ACTION_F4 :
	       action_edit();
	       break;
	    case VSH_ACTION_F5 :
	       action_copy();
	       break;
	    case VSH_ACTION_F6 :
	       action_rename_move();
	       break;
	    case VSH_ACTION_F7 :
	       action_make_dir();
	       break;
	    case VSH_ACTION_F8 :
	       action_delete();
	       break;
	    case VSH_ACTION_F9 :
	       action_history();
	       break;
	    case VSH_ACTION_F10 :
	       print_fkey_text(FKEY_MODE_NONE);
	       if (get_answer(ANSWER_MODE_QUIT, NULL, ANSWER_TYPE_YES) ==
							  ANSWER_TYPE_YES) {
		  remove = TRUE;
	       }
	       print_status(VSH_STATUS_NORMAL);
	       change_fkey_text();
	       break;
	    case VSH_ACTION_F11 :
	       action_freq_mode(FREQ_MODE_DEVS_ASN);
	       break;
	    case VSH_ACTION_F12 :
	       action_freq_mode(FREQ_MODE_INFO);
	       break;
	    case VSH_ACTION_F13 :
	       action_freq_mode(FREQ_MODE_QUICK_VIEW);
	       break;
	    case VSH_ACTION_F14 :
	       action_freq_mode(FREQ_MODE_FIND);
	       break;
	    case VSH_ACTION_F15 :
	       action_tree();
	       break;
	    case VSH_ACTION_F16 :
	       action_search_pattern();
	       break;
	    case VSH_ACTION_F17 :
	       action_compare_directories();
	       break;
	    case VSH_ACTION_CALL_USER_FUNC1 :
	    case VSH_ACTION_CALL_USER_FUNC2 :
	    case VSH_ACTION_CALL_USER_FUNC3 :
	    case VSH_ACTION_CALL_USER_FUNC4 :
	    case VSH_ACTION_CALL_USER_FUNC5 :
	    case VSH_ACTION_CALL_USER_FUNC6 :
	    case VSH_ACTION_CALL_USER_FUNC7 :
	    case VSH_ACTION_CALL_USER_FUNC8 :
	    case VSH_ACTION_CALL_USER_FUNC9 :
	    case VSH_ACTION_CALL_USER_FUNC10 :
	       action_user_function((USHORT)(action -
					       VSH_ACTION_CALL_USER_FUNC1));
	       break;
	    case VSH_ACTION_CHANGE_USER_FUNC1 :
	    case VSH_ACTION_CHANGE_USER_FUNC2 :
	    case VSH_ACTION_CHANGE_USER_FUNC3 :
	    case VSH_ACTION_CHANGE_USER_FUNC4 :
	    case VSH_ACTION_CHANGE_USER_FUNC5 :
	    case VSH_ACTION_CHANGE_USER_FUNC6 :
	    case VSH_ACTION_CHANGE_USER_FUNC7 :
	    case VSH_ACTION_CHANGE_USER_FUNC8 :
	    case VSH_ACTION_CHANGE_USER_FUNC9 :
	    case VSH_ACTION_CHANGE_USER_FUNC10 :
	       action_change_user_function((USHORT)(action -
					     VSH_ACTION_CHANGE_USER_FUNC1));
	       break;
	    case VSH_ACTION_TAB :
	       action_switch();
	       break;
	    case VSH_ACTION_HELP :
	       action_help();
	       break;
	    case VSH_ACTION_ABOUT :
	       action_about();
	       break;
	    case VSH_ACTION_CONFIG :
	       action_config();
	       break;
	    case VSH_ACTION_PARENT_DIR :
	       if (! auto_repeat) {
		  action_parent_dir();
	       }
	       break;
	    case VSH_ACTION_READ_AGAIN :
	       action_read_again();
	       break;
	    case VSH_ACTION_NEW_DIR :
	       if (! auto_repeat) {
		  action_new_dir(NEW_DIR_MODE_NORMAL);
	       }
	       break;
	    case VSH_ACTION_NEW_DIR_TO_NONACTIVE :
	       if (! auto_repeat) {
		  action_new_dir(NEW_DIR_MODE_TO_NONACTIVE);
		  action_switch();
	       }
	       break;
	    case VSH_ACTION_ROOT_DIR :
	       if (! auto_repeat) {
		  action_root_dir();
	       }
	       break;
	    case VSH_ACTION_FORCE_BASE :
	       action_force_base();
	       break;
	    case VSH_ACTION_FORCE_FULL :
	       action_force_full();
	       break;
	    case VSH_ACTION_NUM_MINUS :
	       if (vsh_keyboard_type == KEYBOARD_TYPE1) {
		  action_pattern_select(PATTERN_SELECT_MODE_MARK);
	       } else {
		  action_pattern_select(PATTERN_SELECT_MODE_UNMARK);
	       }
	       break;
	    case VSH_ACTION_PAT_SELECT_MARK2 :
	       if (vsh_keyboard_type == KEYBOARD_TYPE2) {
		  action_pattern_select(PATTERN_SELECT_MODE_MARK);
	       }
	       break;
	    case VSH_ACTION_PAT_SELECT_UNMARK1 :
	       if (vsh_keyboard_type == KEYBOARD_TYPE1) {
		  action_pattern_select(PATTERN_SELECT_MODE_UNMARK);
	       }
	       break;
	    case VSH_ACTION_NUMLOCK :
	       action_num_lock();
	       break;
	    case VSH_ACTION_NUM_ENTER :
	       action_enter();
	       break;
	    case VSH_ACTION_MARK_FILE :
	       action_mark_file();
	       break;
	    case VSH_ACTION_UNMARK_ALL_FILES :
	       action_unmark_all_files();
	       break;
	    case VSH_ACTION_SCROLL_TOP :
	    case VSH_ACTION_SCROLL_BOTTOM :
	    case VSH_ACTION_SCROLL_PAGE_UP :
	    case VSH_ACTION_SCROLL_PAGE_DOWN :
	    case VSH_ACTION_SCROLL_UP :
	    case VSH_ACTION_SCROLL_DOWN :
	       scroll_file_req();
	       break;
	    case VSH_ACTION_SPEED_SEARCH :
	       action_jump_to_freq_entry();
	       break;
	    case VSH_ACTION_QUALIFIER :
	       change_fkey_text();
	       break;
         }
      }
   } while (remove == FALSE);
   event_mode = EVENT_MODE_NORMAL;
}
	/* Perform action for every INTUITICK */

   BOOL
perform_intuitick_action(VOID)
{
   BOOL remove = FALSE;

   if (auto_repeat) {
      scroll_file_req();
      if (action == VSH_ACTION_MARK_FILE) {
	 action_mark_file();
      }
   }
   if (show_flag) {   /* display hidden ? */
      get_current_dir();
   }
   if (status == VSH_STATUS_NORMAL) {
      if (status_delay-- < 0) {   /* refresh status line */
	 print_status(VSH_STATUS_NORMAL);
      }
   } else {
      if (error_delay-- < 0) {   /* remove error msg in status line */
	 print_status(VSH_STATUS_NORMAL);
      }
   }
   if ((struct CommandLineInterface *)BTOC(_parent_proc->pr_CLI) !=
								 save_cli) {
      remove = TRUE;   /* EndCLI detected -> quit VSh */
   }
   return(remove);
}
	/* Toggle active filerequester */

   VOID
action_switch(VOID)
{
   SHORT error;

   hcomp_freq_cursor(&file_req[active_freq]);
   active_freq = (active_freq ? 0 : 1);
   mark_active_freq();
   hcomp_freq_cursor(&file_req[active_freq]);
   print_info_line(INFO_LINE_MODE_NORMAL);
   change_fkey_text();
   if ((error = change_current_dir()) == VSH_STATUS_NORMAL) {
      error = check_date_stamp(&file_req[active_freq],
						 READ_SAME_DIR_MODE_NORMAL);
   }
   print_status(error);
}
	/* Toggle show mode */

   VOID
action_display_mode(VOID)
{
   if (show_flag) {   /* hide display */
      clear_display(PART_DISPLAY);
      show_flag = 0;
   } else {   /* show display */
      show_flag = 1;
      draw_display(PART_DISPLAY);
   }
   change_fkey_text();
}
	/* Duplicate the active filereq to the nonactivated */

   VOID
action_duplicate(VOID)
{
   struct FileRequest  *freq1 = &file_req[active_freq],
		       *freq2 = &file_req[(active_freq ? 0 : 1)];
   struct FileNode     *fnode;
   struct MinList      *old_file_list;
   struct MinNode      *old_fv_node;
   BYTE  *old_node_name = &file1_buffer[0];
   ULONG old_num_entries, old_marked_entries, old_marked_size;
   SHORT i, old_cursor_line, error = VSH_STATUS_NORMAL;

   if (freq1->fr_DirLock) {
      print_status(VSH_STATUS_DUPLICATE_FREQ);
      hcomp_freq_cursor(freq1);
      print_info_line(INFO_LINE_MODE_EMPTY);
      print_fkey_text(FKEY_MODE_NONE);
      if ((error = duplicate_file_list(freq1, freq2)) == VSH_STATUS_NORMAL) {
	 if (freq1->fr_Mode == FREQ_MODE_DEVS_ASN || freq1->fr_Mode ==
							   FREQ_MODE_FIND) {
	    old_cursor_line = freq1->fr_SaveCursorLine;
	    old_fv_node     = freq1->fr_SaveFirstVisibleNode;
	 } else {
	    old_cursor_line = freq1->fr_CursorLine;
	    old_fv_node     = freq1->fr_Display.d_FirstVisibleNode;
	 }
	 if (old_cursor_line != -1) {
	    for (i = old_cursor_line, fnode = (struct FileNode *)
						      old_fv_node; i; i--) {   /* get file node under cursor */
	       fnode = (struct FileNode *)fnode->fn_Node.mln_Succ;
	    }
	    strncpy(old_node_name, &fnode->fn_Text[0], (size_t)
							 fnode->fn_NameLen);
	    *(old_node_name + fnode->fn_NameLen) = '\0';
	    duplicate_cursor_line(freq2, old_node_name, fnode->fn_Pos,
							   old_cursor_line);
	 }
	 strcpy(&freq2->fr_FilePattern[0], &freq1->fr_FilePattern[0]);
	 strcpy(&freq2->fr_MarkPattern[0], &freq1->fr_MarkPattern[0]);
	 strcpy(&freq2->fr_UnmarkPattern[0], &freq1->fr_UnmarkPattern[0]);
	 if (freq1->fr_Mode != FREQ_MODE_FIND) {
	    freq2->fr_Mode = freq1->fr_Mode;
	 }
	 if (freq2->fr_Mode == FREQ_MODE_DEVS_ASN) {
	    old_num_entries    = freq2->fr_Display.d_NumEntries;
	    old_file_list      = freq2->fr_Display.d_List;
	    old_fv_node        = freq2->fr_Display.d_FirstVisibleNode;
	    old_cursor_line    = freq2->fr_CursorLine;
	    old_marked_entries = freq2->fr_MarkedEntries;
	    old_marked_size    = freq2->fr_MarkedSize;
	    if ((error = read_devs(freq2)) != VSH_STATUS_NORMAL) {
	       freq2->fr_Mode = FREQ_MODE_NORMAL;
	    } else {
	       if (freq1->fr_CursorLine != -1) {
		  fnode = get_file_node_under_cursor(freq1);
		  strncpy(old_node_name, &fnode->fn_Text[0],
						 (size_t)fnode->fn_NameLen);
		  *(old_node_name + fnode->fn_NameLen) = '\0';
		  duplicate_cursor_line(freq2, old_node_name, fnode->fn_Pos,
						      freq1->fr_CursorLine);
	       }
	       freq2->fr_SaveNumEntries       = old_num_entries;
	       freq2->fr_SaveFileList         = old_file_list;
	       freq2->fr_SaveFirstVisibleNode = old_fv_node;
	       freq2->fr_SaveCursorLine       = old_cursor_line;
	       freq2->fr_SaveMarkedEntries    = old_marked_entries;
	       freq2->fr_SaveMarkedSize       = old_marked_size;
	    }
	 }
      }
      refresh_dir_info(freq2);
      print_dir_name(freq2, (BYTE *)NULL);
      print_freq_lines(freq2, freq2->fr_Display.d_FirstVisibleNode, (USHORT)
				       0, freq2->fr_Display.d_VisibleLines);
      hcomp_freq_cursor(freq1);
      print_info_line(INFO_LINE_MODE_NORMAL);
      change_fkey_text();
      print_status(error);
   }
}
	/* Change mode for active file requester */

   VOID
action_freq_mode(USHORT new_mode)
{
   struct FileRequest  *freq = &file_req[active_freq];
   BYTE   *find_text;
   USHORT old_mode = freq->fr_Mode;
   SHORT  error = VSH_STATUS_NORMAL;

   hcomp_freq_cursor(freq);
   print_info_line(INFO_LINE_MODE_EMPTY);
   print_fkey_text(FKEY_MODE_NONE);
   if (new_mode == old_mode) {   /* toggle old mode to normal */
      if (old_mode == FREQ_MODE_DEVS_ASN || old_mode == FREQ_MODE_FIND) {
	 free_list(freq->fr_Display.d_List, (LONG)sizeof(struct FileNode));
	 freq->fr_Display.d_NumEntries       = freq->fr_SaveNumEntries;
	 freq->fr_Display.d_List             = freq->fr_SaveFileList;
	 freq->fr_Display.d_FirstVisibleNode = freq->fr_SaveFirstVisibleNode;
	 freq->fr_CursorLine                 = freq->fr_SaveCursorLine;
	 freq->fr_MarkedEntries              = freq->fr_SaveMarkedEntries;
	 freq->fr_MarkedSize                 = freq->fr_SaveMarkedSize;
	 freq->fr_SaveFileList               = NULL;
	 freq->fr_SaveFirstVisibleNode       = NULL;
	 freq->fr_SaveCursorLine             = 0;
	 freq->fr_SaveMarkedEntries          = 0;
	 freq->fr_SaveMarkedSize             = 0;
	 error = check_date_stamp(freq, READ_SAME_DIR_MODE_NORMAL);
      }
      freq->fr_Mode = FREQ_MODE_NORMAL;
   } else {   /* set new mode */
      switch (new_mode) {
	 case FREQ_MODE_DEVS_ASN :
	    if (old_mode == FREQ_MODE_FIND) {
	       free_list(freq->fr_Display.d_List, (LONG)
						   sizeof(struct FileNode));
	    } else {
	       freq->fr_SaveNumEntries       = freq->fr_Display.d_NumEntries;
	       freq->fr_SaveFileList         = freq->fr_Display.d_List;
	       freq->fr_SaveFirstVisibleNode = freq->fr_Display.d_FirstVisibleNode;
	       freq->fr_SaveCursorLine       = freq->fr_CursorLine;
	       freq->fr_SaveMarkedEntries    = freq->fr_MarkedEntries;
	       freq->fr_SaveMarkedSize       = freq->fr_MarkedSize;
	    }
	    error = read_devs(freq);
	    break;
	 case FREQ_MODE_FIND :
	    if (find_text = get_input(INPUT_MODE_FIND, NULL)) {
	       if (PreParse(find_text, &line1_buffer[0]) == FALSE) {
		  error = VSH_ERROR_INVALID_PATTERN;
	       } else {
		  if (old_mode == FREQ_MODE_DEVS_ASN) {
		     free_list(freq->fr_Display.d_List, (LONG)
						   sizeof(struct FileNode));
		  } else {
		     freq->fr_SaveNumEntries       = freq->fr_Display.d_NumEntries;
		     freq->fr_SaveFileList         = freq->fr_Display.d_List;
		     freq->fr_SaveFirstVisibleNode = freq->fr_Display.d_FirstVisibleNode;
		     freq->fr_SaveCursorLine       = freq->fr_CursorLine;
		     freq->fr_SaveMarkedEntries    = freq->fr_MarkedEntries;
		     freq->fr_SaveMarkedSize       = freq->fr_MarkedSize;
		  }
		  error = find(freq, find_text);
	       }
	    }
	    break;
	 default :
	    if (old_mode == FREQ_MODE_DEVS_ASN || old_mode ==
							   FREQ_MODE_FIND) {
	       free_list(freq->fr_Display.d_List, (LONG)sizeof(struct FileNode));
	       freq->fr_Display.d_NumEntries       = freq->fr_SaveNumEntries;
	       freq->fr_Display.d_List             = freq->fr_SaveFileList;
	       freq->fr_Display.d_FirstVisibleNode = freq->fr_SaveFirstVisibleNode;
	       freq->fr_CursorLine                 = freq->fr_SaveCursorLine;
	       freq->fr_MarkedEntries              = freq->fr_SaveMarkedEntries;
	       freq->fr_MarkedSize                 = freq->fr_SaveMarkedSize;
	       freq->fr_SaveFileList               = NULL;
	       freq->fr_SaveFirstVisibleNode       = NULL;
	       freq->fr_SaveCursorLine             = 0;
	       freq->fr_SaveMarkedEntries          = 0;
	       freq->fr_SaveMarkedSize             = 0;
	       error = check_date_stamp(freq, READ_SAME_DIR_MODE_NORMAL);
	    }
	    freq->fr_Mode = new_mode;
	    break;
      }
   }
   print_freq_lines(freq, freq->fr_Display.d_FirstVisibleNode, (USHORT)0,
					   freq->fr_Display.d_VisibleLines);
   hcomp_freq_cursor(freq);
   print_info_line(INFO_LINE_MODE_NORMAL);
   change_fkey_text();
   print_status(error);
}
	/* Edit file from cursor line */

   VOID
action_edit(VOID)
{
   struct FileRequest  *freq = &file_req[active_freq];
   struct FileNode     *fnode;
   BYTE  *prog = &path1_buffer[0], *args, *ptr;
   BPTR  editor_lock;
   SHORT error = VSH_STATUS_NORMAL;

   if ((freq->fr_Mode == FREQ_MODE_NORMAL || freq->fr_Mode ==
			     FREQ_MODE_FIND) && freq->fr_CursorLine != -1) {
      fnode = get_file_node_under_cursor(freq);
      if (fnode->fn_Type == ENTRY_TYPE_FILE) {   /* file selected ? */
	 strcpy(prog, vsh_editor_name);   /* build full path name */
	 ptr = prog + strlen(prog) + 1;
	 if (!(editor_lock = quiet_lock(prog, (LONG)SHARED_LOCK))) {
	    error = VSH_ERROR_NO_EDITOR;
	 } else {
	    if ((error = check_for_load_file(prog)) == VSH_STATUS_NORMAL) {
	       args = ptr;
	       strcpy(ptr, vsh_editor_opts);   /* don't allow editor to detach */
	       ptr   += strlen(ptr);
	       *ptr++ = ' ';
	       if (!append_path_name(ptr, freq, fnode, APPEND_MODE_QUOTED)) {
		  error = VSH_ERROR_LOCK_FAILED;
	       } else {
		  print_status(VSH_STATUS_EDIT_FILE);   /* start selected file */
		  print_fkey_text(FKEY_MODE_NONE);
		  error = execute(prog, args);
		  change_fkey_text();
	       }
	    }
	    UnLock(editor_lock);
	 }
	 print_status(error);
      }
   }
}
	/* Show help pages */

   VOID
action_help(VOID)
{
   struct IntuiMessage  *msg;
   ULONG  signals, class;
   USHORT page_num = 0;
   BOOL   last_page, next_page = FALSE, keepon = TRUE;

   print_fkey_text(FKEY_MODE_QUIT_ONLY);
   if (! show_flag) {  /* hidden display ? */
      clear_display(PART_DISPLAY);
   } else {
      SetAPen(con_rport, (LONG)COLOR0);
      RectFill(con_rport, (LONG)(BORDER_LEFT - 2), (LONG)BORDER_TOP, (LONG)
		      (vsh_width - BORDER_RIGHT + 1), (LONG)(cli_vpos - 3));
   }
   do {
      last_page = print_help_page(page_num);
      next_page = FALSE;
      do {
	 signals = Wait(SIGF_INTUITION | SIGF_ACTION);
	 if (signals & SIGF_INTUITION) {   /* event from Intuition ? */
	    while (msg = (struct IntuiMessage *)
					     GetMsg(con_window->UserPort)) {
	       class = msg->Class;
	       ReplyMsg((struct Message *)msg);
	       if (class == REFRESHWINDOW) {
		  last_page = refresh_help_page(page_num);
	       }
	    }
	 }
	 if (signals & SIGF_ACTION) {   /* action event ? */
	    switch (action) {
	       case VSH_ACTION_NEXT_PAGE :
		  if (last_page == FALSE) {
		     page_num++;   /* show next page */
		  }
		  next_page = TRUE;
		  break;
	       case VSH_ACTION_PREVIOUS_PAGE :
		  if (page_num) {
		     page_num--;   /* show previous page */
		  }
		  next_page = TRUE;
		  break;
	       case VSH_ACTION_QUIT :
	       case VSH_ACTION_ESC :
		  keepon    = FALSE;   /* terminate help */
		  next_page = TRUE;
		  break;
	    }
	 }
      } while (next_page == FALSE);
   } while (keepon == TRUE);
   status = VSH_STATUS_NORMAL;
   if (! show_flag) {  /* hidden display ? */
      draw_display(PART_DISPLAY);
   } else {
      draw_requesters(DRAW_MODE_CLEAR);
   }
}
	/* Show about page */

   VOID
action_about(VOID)
{
   BOOL keepon = TRUE;

   print_fkey_text(FKEY_MODE_QUIT_ONLY);
   if (! show_flag) {  /* hidden display ? */
      clear_display(PART_DISPLAY);
   } else {
      SetAPen(con_rport, (LONG)COLOR0);
      RectFill(con_rport, (LONG)(BORDER_LEFT - 2), (LONG)BORDER_TOP, (LONG)
		      (vsh_width - BORDER_RIGHT + 1), (LONG)(cli_vpos - 3));
   }
   print_about_page();
   draw_line(COLOR1, (USHORT)2, (USHORT)(cli_vpos - 2), (USHORT)(vsh_width -
						3), (USHORT)(cli_vpos - 2));
   do {
      ULONG signals = Wait(SIGF_INTUITION | SIGF_ACTION);

      if (signals & SIGF_INTUITION) {   /* event from Intuition ? */
	 struct IntuiMessage  *msg;

	 while (msg = (struct IntuiMessage *)GetMsg(con_window->UserPort)) {
	    ULONG class = msg->Class;

	    ReplyMsg((struct Message *)msg);
	    if (class == REFRESHWINDOW) {
	       refresh_about_page();
	    }
	 }
      }
      if (signals & SIGF_ACTION) {   /* action event ? */
	 if (action == VSH_ACTION_HELP || action == VSH_ACTION_NUM_ENTER ||
		    action == VSH_ACTION_QUIT || action == VSH_ACTION_ESC) {
	    keepon = FALSE;
	 }
      }
   } while (keepon == TRUE);
   if (action == VSH_ACTION_HELP) {
      action_help();
   } else {
      if (! show_flag) {  /* hidden display ? */
	 draw_display(PART_DISPLAY);
      } else {
	 draw_requesters(DRAW_MODE_CLEAR);
      }
   }
}
	/* Jump to an entry in file requester */

   VOID
action_jump_to_freq_entry(VOID)
{
   struct FileRequest  *freq = &file_req[active_freq];
   struct FileNode     *old_fv_node = (struct FileNode *)
					freq->fr_Display.d_FirstVisibleNode;
   USHORT old_cursor_line = freq->fr_CursorLine;

   if (freq->fr_Mode != FREQ_MODE_INFO && freq->fr_Mode !=
			    FREQ_MODE_QUICK_VIEW && old_cursor_line != -1) {
      if (!get_input(INPUT_MODE_FREQ_ENTRY, &gadget_buffer[0])) {

	 /* Restore old cursor position */
	 hcomp_freq_cursor(freq);
	 print_info_line(INFO_LINE_MODE_EMPTY);
	 freq->fr_Display.d_FirstVisibleNode = (struct MinNode *)old_fv_node;
	 freq->fr_CursorLine                 = old_cursor_line;
	 print_freq_lines(freq, (struct MinNode *)old_fv_node, (USHORT)0,
					   freq->fr_Display.d_VisibleLines);
	 hcomp_freq_cursor(freq);
	 print_info_line(INFO_LINE_MODE_NORMAL);
      }
      print_status(VSH_STATUS_NORMAL);
      change_fkey_text();
   }
}
