Home | History | Annotate | Line # | Download | only in tui
tui-data.h revision 1.9
      1 /* TUI data manipulation routines.
      2 
      3    Copyright (C) 1998-2020 Free Software Foundation, Inc.
      4 
      5    Contributed by Hewlett-Packard Company.
      6 
      7    This file is part of GDB.
      8 
      9    This program is free software; you can redistribute it and/or modify
     10    it under the terms of the GNU General Public License as published by
     11    the Free Software Foundation; either version 3 of the License, or
     12    (at your option) any later version.
     13 
     14    This program is distributed in the hope that it will be useful,
     15    but WITHOUT ANY WARRANTY; without even the implied warranty of
     16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17    GNU General Public License for more details.
     18 
     19    You should have received a copy of the GNU General Public License
     20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     21 
     22 #ifndef TUI_TUI_DATA_H
     23 #define TUI_TUI_DATA_H
     24 
     25 #include "tui/tui.h"
     26 #include "gdb_curses.h"	/* For WINDOW.  */
     27 #include "observable.h"
     28 
     29 /* A deleter that calls delwin.  */
     30 struct curses_deleter
     31 {
     32   void operator() (WINDOW *win) const
     33   {
     34     delwin (win);
     35   }
     36 };
     37 
     38 #define MIN_WIN_HEIGHT          3
     39 
     40 /* Generic window information.  */
     41 struct tui_win_info
     42 {
     43 protected:
     44 
     45   tui_win_info () = default;
     46   DISABLE_COPY_AND_ASSIGN (tui_win_info);
     47 
     48   /* This is called after the window is resized, and should update the
     49      window's contents.  */
     50   virtual void rerender ();
     51 
     52   virtual void make_window ();
     53 
     54 public:
     55   tui_win_info (tui_win_info &&) = default;
     56   virtual ~tui_win_info () = default;
     57 
     58   /* Call to refresh this window.  */
     59   virtual void refresh_window ();
     60 
     61   /* Make this window visible or invisible.  */
     62   virtual void make_visible (bool visible);
     63 
     64   /* Return the name of this type of window.  */
     65   virtual const char *name () const = 0;
     66 
     67   /* Compute the maximum height of this window.  */
     68   virtual int max_height () const;
     69 
     70   /* Compute the minimum height of this window.  */
     71   virtual int min_height () const
     72   {
     73     return MIN_WIN_HEIGHT;
     74   }
     75 
     76   /* Compute the maximum width of this window.  */
     77   int max_width () const;
     78 
     79   /* Compute the minimum width of this window.  */
     80   int min_width () const
     81   {
     82     return 3;
     83   }
     84 
     85   /* Return true if this window can be boxed.  */
     86   virtual bool can_box () const
     87   {
     88     return true;
     89   }
     90 
     91   /* Resize this window.  The parameters are used to set the window's
     92      size and position.  */
     93   virtual void resize (int height, int width,
     94 		       int origin_x, int origin_y);
     95 
     96   /* Return true if this window is visible.  */
     97   bool is_visible () const
     98   {
     99     return handle != nullptr;
    100   }
    101 
    102   /* Disable output until the next call to doupdate.  */
    103   void no_refresh ()
    104   {
    105     if (handle != nullptr)
    106       wnoutrefresh (handle.get ());
    107   }
    108 
    109   /* Called after the tab width has been changed.  */
    110   virtual void update_tab_width ()
    111   {
    112   }
    113 
    114   /* Set whether this window is highlighted.  */
    115   void set_highlight (bool highlight)
    116   {
    117     is_highlighted = highlight;
    118   }
    119 
    120   /* Methods to scroll the contents of this window.  Note that they
    121      are named with "_scroll" coming at the end because the more
    122      obvious "scroll_forward" is defined as a macro in term.h.  */
    123   void forward_scroll (int num_to_scroll);
    124   void backward_scroll (int num_to_scroll);
    125   void left_scroll (int num_to_scroll);
    126   void right_scroll (int num_to_scroll);
    127 
    128   /* Return true if this window can be scrolled, false otherwise.  */
    129   virtual bool can_scroll () const
    130   {
    131     return true;
    132   }
    133 
    134   void check_and_display_highlight_if_needed ();
    135 
    136   /* Window handle.  */
    137   std::unique_ptr<WINDOW, curses_deleter> handle;
    138   /* Window width.  */
    139   int width = 0;
    140   /* Window height.  */
    141   int height = 0;
    142   /* Origin of window.  */
    143   int x = 0;
    144   int y = 0;
    145 
    146   /* Window title to display.  */
    147   std::string title;
    148 
    149   /* Is this window highlighted?  */
    150   bool is_highlighted = false;
    151 
    152 protected:
    153 
    154   /* Scroll the contents vertically.  This is only called via
    155      forward_scroll and backward_scroll.  */
    156   virtual void do_scroll_vertical (int num_to_scroll) = 0;
    157 
    158   /* Scroll the contents horizontally.  This is only called via
    159      left_scroll and right_scroll.  */
    160   virtual void do_scroll_horizontal (int num_to_scroll) = 0;
    161 };
    162 
    163 /* Constant definitions.  */
    164 #define SRC_NAME                "src"
    165 #define CMD_NAME                "cmd"
    166 #define DATA_NAME               "regs"
    167 #define DISASSEM_NAME           "asm"
    168 #define STATUS_NAME		"status"
    169 
    170 /* Global Data.  */
    171 extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
    172 
    173 #define TUI_SRC_WIN     ((tui_source_window *) tui_win_list[SRC_WIN])
    174 #define TUI_DISASM_WIN	((tui_disasm_window *) tui_win_list[DISASSEM_WIN])
    175 #define TUI_DATA_WIN    ((tui_data_window *) tui_win_list[DATA_WIN])
    176 #define TUI_CMD_WIN     ((tui_cmd_window *) tui_win_list[CMD_WIN])
    177 
    178 /* All the windows that are currently instantiated, in layout
    179    order.  */
    180 extern std::vector<tui_win_info *> tui_windows;
    181 
    182 /* Return a range adapter for iterating over TUI windows.  */
    183 static inline std::vector<tui_win_info *> &
    184 all_tui_windows ()
    185 {
    186   return tui_windows;
    187 }
    188 
    189 /* Data Manipulation Functions.  */
    190 extern int tui_term_height (void);
    191 extern void tui_set_term_height_to (int);
    192 extern int tui_term_width (void);
    193 extern void tui_set_term_width_to (int);
    194 extern struct tui_locator_window *tui_locator_win_info_ptr (void);
    195 extern struct tui_win_info *tui_win_with_focus (void);
    196 extern bool tui_win_resized ();
    197 extern void tui_set_win_resized_to (bool);
    198 
    199 extern struct tui_win_info *tui_next_win (struct tui_win_info *);
    200 extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
    201 
    202 extern unsigned int tui_tab_width;
    203 
    204 #endif /* TUI_TUI_DATA_H */
    205