Home | History | Annotate | Line # | Download | only in tui
tui-data.h revision 1.12
      1 /* TUI data manipulation routines.
      2 
      3    Copyright (C) 1998-2024 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 GDB_TUI_TUI_DATA_H
     23 #define GDB_TUI_TUI_DATA_H
     24 
     25 #include "tui/tui.h"
     26 #include "gdb_curses.h"
     27 
     28 /* A deleter that calls delwin.  */
     29 struct curses_deleter
     30 {
     31   void operator() (WINDOW *win) const
     32   {
     33     delwin (win);
     34   }
     35 };
     36 
     37 #define MIN_WIN_HEIGHT          3
     38 
     39 /* Generic window information.  */
     40 struct tui_win_info
     41 {
     42 protected:
     43 
     44   tui_win_info () = default;
     45   DISABLE_COPY_AND_ASSIGN (tui_win_info);
     46 
     47   /* This is called after the window is resized, and should update the
     48      window's contents.  */
     49   virtual void rerender ();
     50 
     51   /* Create the curses window.  */
     52   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   /* Return the width of the box.  */
     92   int box_width () const
     93   {
     94     return can_box () ? 1 : 0;
     95   }
     96 
     97   /* Return the size of the box.  */
     98   int box_size () const
     99   {
    100     return 2 * box_width ();
    101   }
    102 
    103   /* Resize this window.  The parameters are used to set the window's
    104      size and position.  */
    105   virtual void resize (int height, int width,
    106 		       int origin_x, int origin_y);
    107 
    108   /* Return true if this window is visible.  */
    109   bool is_visible () const
    110   {
    111     return handle != nullptr && tui_active;
    112   }
    113 
    114   /* Return true if this window can accept the focus.  */
    115   virtual bool can_focus () const
    116   {
    117     return true;
    118   }
    119 
    120   /* Called after the tab width has been changed.  */
    121   virtual void update_tab_width ()
    122   {
    123   }
    124 
    125   /* Set whether this window is highlighted.  */
    126   void set_highlight (bool highlight)
    127   {
    128     is_highlighted = highlight;
    129   }
    130 
    131   /* Methods to scroll the contents of this window.  Note that they
    132      are named with "_scroll" coming at the end because the more
    133      obvious "scroll_forward" is defined as a macro in term.h.  */
    134   void forward_scroll (int num_to_scroll);
    135   void backward_scroll (int num_to_scroll);
    136   void left_scroll (int num_to_scroll);
    137   void right_scroll (int num_to_scroll);
    138 
    139   /* Return true if this window can be scrolled, false otherwise.  */
    140   virtual bool can_scroll () const
    141   {
    142     return true;
    143   }
    144 
    145   /* Called for each mouse click inside this window.  Coordinates MOUSE_X
    146      and MOUSE_Y are 0-based relative to the window, and MOUSE_BUTTON can
    147      be 1 (left), 2 (middle), or 3 (right).  */
    148   virtual void click (int mouse_x, int mouse_y, int mouse_button)
    149   {
    150   }
    151 
    152   void check_and_display_highlight_if_needed ();
    153 
    154   /* A helper function to change the title and then redraw the
    155      surrounding box, if needed.  */
    156   void set_title (std::string &&new_title);
    157 
    158   /* Return a reference to the current window title.  */
    159   const std::string &title () const
    160   { return m_title; }
    161 
    162   /* Clear the window, maybe draw the border, and then display string
    163      STR centered in the window, abbreviated if necessary.  */
    164   void center_string (const char *str);
    165 
    166   /* Display string STR in the window at the current cursor position,
    167      abbreviated if necessary.  */
    168   void display_string (const char *str) const;
    169 
    170   /* Window handle.  */
    171   std::unique_ptr<WINDOW, curses_deleter> handle;
    172   /* Window width.  */
    173   int width = 0;
    174   /* Window height.  */
    175   int height = 0;
    176   /* Origin of window.  */
    177   int x = 0;
    178   int y = 0;
    179 
    180   /* Is this window highlighted?  */
    181   bool is_highlighted = false;
    182 
    183 protected:
    184 
    185   /* Scroll the contents vertically.  This is only called via
    186      forward_scroll and backward_scroll.  */
    187   virtual void do_scroll_vertical (int num_to_scroll) = 0;
    188 
    189   /* Scroll the contents horizontally.  This is only called via
    190      left_scroll and right_scroll.  */
    191   virtual void do_scroll_horizontal (int num_to_scroll) = 0;
    192 
    193 private:
    194   /* Window title to display.  */
    195   std::string m_title;
    196 };
    197 
    198 /* A TUI window that doesn't scroll.  */
    199 
    200 struct tui_noscroll_window : public virtual tui_win_info
    201 {
    202 public:
    203   virtual bool can_scroll () const final override
    204   {
    205     return false;
    206   }
    207 
    208 protected:
    209   virtual void do_scroll_vertical (int num_to_scroll) final override
    210   {
    211   }
    212 
    213   /* Scroll the contents horizontally.  This is only called via
    214      left_scroll and right_scroll.  */
    215   virtual void do_scroll_horizontal (int num_to_scroll) final override
    216   {
    217   }
    218 };
    219 
    220 /* A TUI window that cannot have focus.  */
    221 
    222 struct tui_nofocus_window : public virtual tui_win_info
    223 {
    224 public:
    225   virtual bool can_focus () const final override
    226   {
    227     return false;
    228   }
    229 };
    230 
    231 /* A TUI window that occupies a single line.  */
    232 
    233 struct tui_oneline_window : public virtual tui_win_info
    234 {
    235   int max_height () const final override
    236   {
    237     return 1;
    238   }
    239 
    240   int min_height () const final override
    241   {
    242     return 1;
    243   }
    244 };
    245 
    246 /* A TUI window that has no border.  */
    247 
    248 struct tui_nobox_window : public virtual tui_win_info
    249 {
    250   bool can_box () const final override
    251   {
    252     return false;
    253   }
    254 };
    255 
    256 /* A TUI window that is always visible.  */
    257 
    258 struct tui_always_visible_window : public virtual tui_win_info
    259 {
    260   virtual void make_visible (bool visible) final override
    261   {
    262   }
    263 };
    264 
    265 /* Constant definitions.  */
    266 #define SRC_NAME                "src"
    267 #define CMD_NAME                "cmd"
    268 #define DATA_NAME               "regs"
    269 #define DISASSEM_NAME           "asm"
    270 #define STATUS_NAME		"status"
    271 
    272 /* Global Data.  */
    273 extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
    274 
    275 /* All the windows that are currently instantiated, in layout
    276    order.  */
    277 extern std::vector<tui_win_info *> tui_windows;
    278 
    279 /* Return a range adapter for iterating over TUI windows.  */
    280 static inline std::vector<tui_win_info *> &
    281 all_tui_windows ()
    282 {
    283   return tui_windows;
    284 }
    285 
    286 /* Data Manipulation Functions.  */
    287 extern int tui_term_height (void);
    288 extern void tui_set_term_height_to (int);
    289 extern int tui_term_width (void);
    290 extern void tui_set_term_width_to (int);
    291 extern struct tui_win_info *tui_win_with_focus (void);
    292 extern bool tui_win_resized ();
    293 extern void tui_set_win_resized_to (bool);
    294 
    295 extern struct tui_win_info *tui_next_win (struct tui_win_info *);
    296 extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
    297 
    298 extern unsigned int tui_tab_width;
    299 
    300 #endif /* GDB_TUI_TUI_DATA_H */
    301