/* General window behavior.

   Copyright (C) 1998-2024 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_TUI_WINGENERAL_H
#define TUI_TUI_WINGENERAL_H

#include "gdb_curses.h"

struct tui_win_info;

extern void tui_unhighlight_win (struct tui_win_info *);
extern void tui_highlight_win (struct tui_win_info *);

/* An RAII class that suppresses output on construction (calling
   wnoutrefresh on the existing windows), and then flushes the output
   (via doupdate) when destroyed.  */

class tui_suppress_output
{
public:

  tui_suppress_output ();
  ~tui_suppress_output ();

  DISABLE_COPY_AND_ASSIGN (tui_suppress_output);

private:

  /* Save the state of the suppression global.  */
  bool m_saved_suppress;
};

/* Call wrefresh on the given window.  However, if output is being
   suppressed via tui_suppress_output, do not call wrefresh.  */
extern void tui_wrefresh (WINDOW *win);

#endif /* TUI_TUI_WINGENERAL_H */
