Home | History | Annotate | Line # | Download | only in tui
tui-data.h revision 1.12
      1   1.1  christos /* TUI data manipulation routines.
      2   1.1  christos 
      3  1.11  christos    Copyright (C) 1998-2024 Free Software Foundation, Inc.
      4   1.1  christos 
      5   1.1  christos    Contributed by Hewlett-Packard Company.
      6   1.1  christos 
      7   1.1  christos    This file is part of GDB.
      8   1.1  christos 
      9   1.1  christos    This program is free software; you can redistribute it and/or modify
     10   1.1  christos    it under the terms of the GNU General Public License as published by
     11   1.1  christos    the Free Software Foundation; either version 3 of the License, or
     12   1.1  christos    (at your option) any later version.
     13   1.1  christos 
     14   1.1  christos    This program is distributed in the hope that it will be useful,
     15   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     16   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17   1.1  christos    GNU General Public License for more details.
     18   1.1  christos 
     19   1.1  christos    You should have received a copy of the GNU General Public License
     20   1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     21   1.1  christos 
     22  1.12  christos #ifndef GDB_TUI_TUI_DATA_H
     23  1.12  christos #define GDB_TUI_TUI_DATA_H
     24   1.1  christos 
     25   1.9  christos #include "tui/tui.h"
     26  1.11  christos #include "gdb_curses.h"
     27   1.1  christos 
     28   1.9  christos /* A deleter that calls delwin.  */
     29   1.9  christos struct curses_deleter
     30   1.1  christos {
     31   1.9  christos   void operator() (WINDOW *win) const
     32   1.9  christos   {
     33   1.9  christos     delwin (win);
     34   1.9  christos   }
     35   1.1  christos };
     36   1.1  christos 
     37   1.9  christos #define MIN_WIN_HEIGHT          3
     38   1.5  christos 
     39   1.1  christos /* Generic window information.  */
     40   1.9  christos struct tui_win_info
     41   1.1  christos {
     42   1.9  christos protected:
     43   1.1  christos 
     44   1.9  christos   tui_win_info () = default;
     45   1.9  christos   DISABLE_COPY_AND_ASSIGN (tui_win_info);
     46   1.1  christos 
     47   1.9  christos   /* This is called after the window is resized, and should update the
     48   1.9  christos      window's contents.  */
     49   1.9  christos   virtual void rerender ();
     50   1.1  christos 
     51  1.12  christos   /* Create the curses window.  */
     52  1.12  christos   void make_window ();
     53   1.1  christos 
     54   1.9  christos public:
     55   1.9  christos   tui_win_info (tui_win_info &&) = default;
     56   1.9  christos   virtual ~tui_win_info () = default;
     57   1.1  christos 
     58   1.9  christos   /* Call to refresh this window.  */
     59   1.9  christos   virtual void refresh_window ();
     60   1.1  christos 
     61   1.9  christos   /* Make this window visible or invisible.  */
     62   1.9  christos   virtual void make_visible (bool visible);
     63   1.1  christos 
     64   1.9  christos   /* Return the name of this type of window.  */
     65   1.9  christos   virtual const char *name () const = 0;
     66   1.1  christos 
     67   1.9  christos   /* Compute the maximum height of this window.  */
     68   1.9  christos   virtual int max_height () const;
     69   1.1  christos 
     70   1.9  christos   /* Compute the minimum height of this window.  */
     71   1.9  christos   virtual int min_height () const
     72   1.9  christos   {
     73   1.9  christos     return MIN_WIN_HEIGHT;
     74   1.9  christos   }
     75   1.1  christos 
     76   1.9  christos   /* Compute the maximum width of this window.  */
     77   1.9  christos   int max_width () const;
     78   1.1  christos 
     79   1.9  christos   /* Compute the minimum width of this window.  */
     80   1.9  christos   int min_width () const
     81   1.9  christos   {
     82   1.9  christos     return 3;
     83   1.9  christos   }
     84   1.1  christos 
     85   1.9  christos   /* Return true if this window can be boxed.  */
     86   1.9  christos   virtual bool can_box () const
     87   1.9  christos   {
     88   1.9  christos     return true;
     89   1.9  christos   }
     90   1.1  christos 
     91  1.11  christos   /* Return the width of the box.  */
     92  1.11  christos   int box_width () const
     93  1.11  christos   {
     94  1.11  christos     return can_box () ? 1 : 0;
     95  1.11  christos   }
     96  1.11  christos 
     97  1.11  christos   /* Return the size of the box.  */
     98  1.11  christos   int box_size () const
     99  1.11  christos   {
    100  1.11  christos     return 2 * box_width ();
    101  1.11  christos   }
    102  1.11  christos 
    103   1.9  christos   /* Resize this window.  The parameters are used to set the window's
    104   1.9  christos      size and position.  */
    105   1.9  christos   virtual void resize (int height, int width,
    106   1.9  christos 		       int origin_x, int origin_y);
    107   1.1  christos 
    108   1.9  christos   /* Return true if this window is visible.  */
    109   1.9  christos   bool is_visible () const
    110   1.9  christos   {
    111  1.10  christos     return handle != nullptr && tui_active;
    112  1.10  christos   }
    113  1.10  christos 
    114  1.10  christos   /* Return true if this window can accept the focus.  */
    115  1.10  christos   virtual bool can_focus () const
    116  1.10  christos   {
    117  1.10  christos     return true;
    118   1.9  christos   }
    119   1.1  christos 
    120   1.9  christos   /* Called after the tab width has been changed.  */
    121   1.9  christos   virtual void update_tab_width ()
    122   1.9  christos   {
    123   1.9  christos   }
    124   1.1  christos 
    125   1.9  christos   /* Set whether this window is highlighted.  */
    126   1.9  christos   void set_highlight (bool highlight)
    127   1.9  christos   {
    128   1.9  christos     is_highlighted = highlight;
    129   1.9  christos   }
    130   1.1  christos 
    131   1.9  christos   /* Methods to scroll the contents of this window.  Note that they
    132   1.9  christos      are named with "_scroll" coming at the end because the more
    133   1.9  christos      obvious "scroll_forward" is defined as a macro in term.h.  */
    134   1.9  christos   void forward_scroll (int num_to_scroll);
    135   1.9  christos   void backward_scroll (int num_to_scroll);
    136   1.9  christos   void left_scroll (int num_to_scroll);
    137   1.9  christos   void right_scroll (int num_to_scroll);
    138   1.1  christos 
    139   1.9  christos   /* Return true if this window can be scrolled, false otherwise.  */
    140   1.9  christos   virtual bool can_scroll () const
    141   1.9  christos   {
    142   1.9  christos     return true;
    143   1.9  christos   }
    144   1.1  christos 
    145  1.10  christos   /* Called for each mouse click inside this window.  Coordinates MOUSE_X
    146  1.10  christos      and MOUSE_Y are 0-based relative to the window, and MOUSE_BUTTON can
    147  1.10  christos      be 1 (left), 2 (middle), or 3 (right).  */
    148  1.10  christos   virtual void click (int mouse_x, int mouse_y, int mouse_button)
    149  1.10  christos   {
    150  1.10  christos   }
    151  1.10  christos 
    152   1.9  christos   void check_and_display_highlight_if_needed ();
    153   1.1  christos 
    154  1.11  christos   /* A helper function to change the title and then redraw the
    155  1.11  christos      surrounding box, if needed.  */
    156  1.11  christos   void set_title (std::string &&new_title);
    157  1.11  christos 
    158  1.11  christos   /* Return a reference to the current window title.  */
    159  1.11  christos   const std::string &title () const
    160  1.11  christos   { return m_title; }
    161  1.11  christos 
    162  1.12  christos   /* Clear the window, maybe draw the border, and then display string
    163  1.11  christos      STR centered in the window, abbreviated if necessary.  */
    164  1.11  christos   void center_string (const char *str);
    165  1.11  christos 
    166  1.11  christos   /* Display string STR in the window at the current cursor position,
    167  1.11  christos      abbreviated if necessary.  */
    168  1.11  christos   void display_string (const char *str) const;
    169  1.11  christos 
    170   1.9  christos   /* Window handle.  */
    171   1.9  christos   std::unique_ptr<WINDOW, curses_deleter> handle;
    172   1.9  christos   /* Window width.  */
    173   1.9  christos   int width = 0;
    174   1.9  christos   /* Window height.  */
    175   1.9  christos   int height = 0;
    176   1.9  christos   /* Origin of window.  */
    177   1.9  christos   int x = 0;
    178   1.9  christos   int y = 0;
    179   1.9  christos 
    180   1.9  christos   /* Is this window highlighted?  */
    181   1.9  christos   bool is_highlighted = false;
    182   1.9  christos 
    183   1.9  christos protected:
    184   1.9  christos 
    185   1.9  christos   /* Scroll the contents vertically.  This is only called via
    186   1.9  christos      forward_scroll and backward_scroll.  */
    187   1.9  christos   virtual void do_scroll_vertical (int num_to_scroll) = 0;
    188   1.9  christos 
    189   1.9  christos   /* Scroll the contents horizontally.  This is only called via
    190   1.9  christos      left_scroll and right_scroll.  */
    191   1.9  christos   virtual void do_scroll_horizontal (int num_to_scroll) = 0;
    192  1.11  christos 
    193  1.11  christos private:
    194  1.11  christos   /* Window title to display.  */
    195  1.11  christos   std::string m_title;
    196  1.11  christos };
    197  1.11  christos 
    198  1.11  christos /* A TUI window that doesn't scroll.  */
    199  1.11  christos 
    200  1.11  christos struct tui_noscroll_window : public virtual tui_win_info
    201  1.11  christos {
    202  1.11  christos public:
    203  1.11  christos   virtual bool can_scroll () const final override
    204  1.11  christos   {
    205  1.11  christos     return false;
    206  1.11  christos   }
    207  1.11  christos 
    208  1.11  christos protected:
    209  1.11  christos   virtual void do_scroll_vertical (int num_to_scroll) final override
    210  1.11  christos   {
    211  1.11  christos   }
    212  1.11  christos 
    213  1.11  christos   /* Scroll the contents horizontally.  This is only called via
    214  1.11  christos      left_scroll and right_scroll.  */
    215  1.11  christos   virtual void do_scroll_horizontal (int num_to_scroll) final override
    216  1.11  christos   {
    217  1.11  christos   }
    218  1.11  christos };
    219  1.11  christos 
    220  1.11  christos /* A TUI window that cannot have focus.  */
    221  1.11  christos 
    222  1.11  christos struct tui_nofocus_window : public virtual tui_win_info
    223  1.11  christos {
    224  1.11  christos public:
    225  1.11  christos   virtual bool can_focus () const final override
    226  1.11  christos   {
    227  1.11  christos     return false;
    228  1.11  christos   }
    229  1.11  christos };
    230  1.11  christos 
    231  1.11  christos /* A TUI window that occupies a single line.  */
    232  1.11  christos 
    233  1.11  christos struct tui_oneline_window : public virtual tui_win_info
    234  1.11  christos {
    235  1.11  christos   int max_height () const final override
    236  1.11  christos   {
    237  1.11  christos     return 1;
    238  1.11  christos   }
    239  1.11  christos 
    240  1.11  christos   int min_height () const final override
    241  1.11  christos   {
    242  1.11  christos     return 1;
    243  1.11  christos   }
    244  1.11  christos };
    245  1.11  christos 
    246  1.11  christos /* A TUI window that has no border.  */
    247  1.11  christos 
    248  1.11  christos struct tui_nobox_window : public virtual tui_win_info
    249  1.11  christos {
    250  1.11  christos   bool can_box () const final override
    251  1.11  christos   {
    252  1.11  christos     return false;
    253  1.11  christos   }
    254  1.11  christos };
    255  1.11  christos 
    256  1.11  christos /* A TUI window that is always visible.  */
    257  1.11  christos 
    258  1.11  christos struct tui_always_visible_window : public virtual tui_win_info
    259  1.11  christos {
    260  1.11  christos   virtual void make_visible (bool visible) final override
    261  1.11  christos   {
    262  1.11  christos   }
    263   1.1  christos };
    264   1.1  christos 
    265   1.9  christos /* Constant definitions.  */
    266   1.9  christos #define SRC_NAME                "src"
    267   1.9  christos #define CMD_NAME                "cmd"
    268   1.9  christos #define DATA_NAME               "regs"
    269   1.9  christos #define DISASSEM_NAME           "asm"
    270   1.9  christos #define STATUS_NAME		"status"
    271   1.1  christos 
    272   1.1  christos /* Global Data.  */
    273   1.8  christos extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
    274   1.1  christos 
    275   1.9  christos /* All the windows that are currently instantiated, in layout
    276   1.9  christos    order.  */
    277   1.9  christos extern std::vector<tui_win_info *> tui_windows;
    278   1.9  christos 
    279   1.9  christos /* Return a range adapter for iterating over TUI windows.  */
    280   1.9  christos static inline std::vector<tui_win_info *> &
    281   1.9  christos all_tui_windows ()
    282   1.9  christos {
    283   1.9  christos   return tui_windows;
    284   1.9  christos }
    285   1.1  christos 
    286   1.1  christos /* Data Manipulation Functions.  */
    287   1.1  christos extern int tui_term_height (void);
    288   1.1  christos extern void tui_set_term_height_to (int);
    289   1.1  christos extern int tui_term_width (void);
    290   1.1  christos extern void tui_set_term_width_to (int);
    291   1.1  christos extern struct tui_win_info *tui_win_with_focus (void);
    292   1.9  christos extern bool tui_win_resized ();
    293   1.9  christos extern void tui_set_win_resized_to (bool);
    294   1.1  christos 
    295   1.1  christos extern struct tui_win_info *tui_next_win (struct tui_win_info *);
    296   1.1  christos extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
    297   1.1  christos 
    298   1.8  christos extern unsigned int tui_tab_width;
    299   1.8  christos 
    300  1.12  christos #endif /* GDB_TUI_TUI_DATA_H */
    301