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