Home | History | Annotate | Line # | Download | only in tui
tui-data.h revision 1.9.2.1
      1 /* TUI data manipulation routines.
      2 
      3    Copyright (C) 1998-2023 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 && tui_active;
    100   }
    101 
    102   /* Return true if this window can accept the focus.  */
    103   virtual bool can_focus () const
    104   {
    105     return true;
    106   }
    107 
    108   /* Disable output until the next call to doupdate.  */
    109   void no_refresh ()
    110   {
    111     if (handle != nullptr)
    112       wnoutrefresh (handle.get ());
    113   }
    114 
    115   /* Called after the tab width has been changed.  */
    116   virtual void update_tab_width ()
    117   {
    118   }
    119 
    120   /* Set whether this window is highlighted.  */
    121   void set_highlight (bool highlight)
    122   {
    123     is_highlighted = highlight;
    124   }
    125 
    126   /* Methods to scroll the contents of this window.  Note that they
    127      are named with "_scroll" coming at the end because the more
    128      obvious "scroll_forward" is defined as a macro in term.h.  */
    129   void forward_scroll (int num_to_scroll);
    130   void backward_scroll (int num_to_scroll);
    131   void left_scroll (int num_to_scroll);
    132   void right_scroll (int num_to_scroll);
    133 
    134   /* Return true if this window can be scrolled, false otherwise.  */
    135   virtual bool can_scroll () const
    136   {
    137     return true;
    138   }
    139 
    140   /* Called for each mouse click inside this window.  Coordinates MOUSE_X
    141      and MOUSE_Y are 0-based relative to the window, and MOUSE_BUTTON can
    142      be 1 (left), 2 (middle), or 3 (right).  */
    143   virtual void click (int mouse_x, int mouse_y, int mouse_button)
    144   {
    145   }
    146 
    147   void check_and_display_highlight_if_needed ();
    148 
    149   /* Window handle.  */
    150   std::unique_ptr<WINDOW, curses_deleter> handle;
    151   /* Window width.  */
    152   int width = 0;
    153   /* Window height.  */
    154   int height = 0;
    155   /* Origin of window.  */
    156   int x = 0;
    157   int y = 0;
    158 
    159   /* Window title to display.  */
    160   std::string title;
    161 
    162   /* Is this window highlighted?  */
    163   bool is_highlighted = false;
    164 
    165 protected:
    166 
    167   /* Scroll the contents vertically.  This is only called via
    168      forward_scroll and backward_scroll.  */
    169   virtual void do_scroll_vertical (int num_to_scroll) = 0;
    170 
    171   /* Scroll the contents horizontally.  This is only called via
    172      left_scroll and right_scroll.  */
    173   virtual void do_scroll_horizontal (int num_to_scroll) = 0;
    174 };
    175 
    176 /* Constant definitions.  */
    177 #define SRC_NAME                "src"
    178 #define CMD_NAME                "cmd"
    179 #define DATA_NAME               "regs"
    180 #define DISASSEM_NAME           "asm"
    181 #define STATUS_NAME		"status"
    182 
    183 /* Global Data.  */
    184 extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
    185 
    186 #define TUI_SRC_WIN     ((tui_source_window *) tui_win_list[SRC_WIN])
    187 #define TUI_DISASM_WIN	((tui_disasm_window *) tui_win_list[DISASSEM_WIN])
    188 #define TUI_DATA_WIN    ((tui_data_window *) tui_win_list[DATA_WIN])
    189 #define TUI_CMD_WIN     ((tui_cmd_window *) tui_win_list[CMD_WIN])
    190 #define TUI_STATUS_WIN  ((tui_locator_window *) tui_win_list[STATUS_WIN])
    191 
    192 /* All the windows that are currently instantiated, in layout
    193    order.  */
    194 extern std::vector<tui_win_info *> tui_windows;
    195 
    196 /* Return a range adapter for iterating over TUI windows.  */
    197 static inline std::vector<tui_win_info *> &
    198 all_tui_windows ()
    199 {
    200   return tui_windows;
    201 }
    202 
    203 /* Data Manipulation Functions.  */
    204 extern int tui_term_height (void);
    205 extern void tui_set_term_height_to (int);
    206 extern int tui_term_width (void);
    207 extern void tui_set_term_width_to (int);
    208 extern struct tui_win_info *tui_win_with_focus (void);
    209 extern bool tui_win_resized ();
    210 extern void tui_set_win_resized_to (bool);
    211 
    212 extern struct tui_win_info *tui_next_win (struct tui_win_info *);
    213 extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
    214 
    215 extern unsigned int tui_tab_width;
    216 
    217 #endif /* TUI_TUI_DATA_H */
    218