/* TUI support I/O functions.

   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2007, 2008
   Free Software Foundation, Inc.

   Contributed by Hewlett-Packard Company.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef TUI_IO_H
#define TUI_IO_H

struct ui_out;

/* Print the string in the curses command window.  */
extern void tui_puts (const char *);

/* Setup the IO for curses or non-curses mode.  */
extern void tui_setup_io (int mode);

/* Initialize the IO for gdb in curses mode.  */
extern void tui_initialize_io (void);

/* Get a character from the command window.  */
extern int tui_getc (FILE *);

/* Readline callback.
   Redisplay the command line with its prompt after readline has
   changed the edited text.  */
extern void tui_redisplay_readline (void);

extern struct ui_out *tui_out;
extern struct ui_out *tui_old_uiout;

extern int key_is_start_sequence (int ch);
extern int key_is_end_sequence (int ch);
extern int key_is_backspace (int ch);
extern int key_is_command_char (int ch);

#endif
