5a776fa9de3b6832a192cb25ce79c6d58e7e1cb4
[external/binutils.git] / gdb / tui / tui-command.c
1 /* Specific command window processing.
2
3    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
4    Free Software Foundation, Inc.
5
6    Contributed by Hewlett-Packard Company.
7
8    This file is part of GDB.
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin Street, Fifth Floor,
23    Boston, MA 02110-1301, USA.  */
24
25 #include "defs.h"
26 #include <ctype.h>
27 #include "tui/tui.h"
28 #include "tui/tui-data.h"
29 #include "tui/tui-win.h"
30 #include "tui/tui-io.h"
31
32 #include "gdb_curses.h"
33 #include "gdb_string.h"
34
35
36 /*****************************************
37 ** STATIC LOCAL FUNCTIONS FORWARD DECLS    **
38 ******************************************/
39
40
41
42 /*****************************************
43 ** PUBLIC FUNCTIONS                        **
44 ******************************************/
45
46 /* Dispatch the correct tui function based upon the control
47    character.  */
48 unsigned int
49 tui_dispatch_ctrl_char (unsigned int ch)
50 {
51   struct tui_win_info *win_info = tui_win_with_focus ();
52
53   /* Handle the CTRL-L refresh for each window.  */
54   if (ch == '\f')
55     tui_refresh_all_win ();
56
57   /* If the command window has the logical focus, or no-one does
58      assume it is the command window; in this case, pass the character
59      on through and do nothing here.  */
60   if (win_info == NULL || win_info == TUI_CMD_WIN)
61     return ch;
62   else
63     {
64       unsigned int c = 0, ch_copy = ch;
65       int i;
66       char *term;
67
68       /* If this is an xterm, page next/prev keys aren't returned
69          ** by keypad as a single char, so we must handle them here.
70          ** Seems like a bug in the curses library?
71        */
72       term = (char *) getenv ("TERM");
73       if (term)
74         {
75           for (i = 0; term[i]; i++)
76             term[i] = toupper (term[i]);
77           if ((strcmp (term, "XTERM") == 0) && key_is_start_sequence (ch))
78             {
79               unsigned int page_ch = 0;
80               unsigned int tmp_char;
81               WINDOW *w = TUI_CMD_WIN->generic.handle;
82
83               tmp_char = 0;
84               while (!key_is_end_sequence (tmp_char))
85                 {
86                   tmp_char = (int) wgetch (w);
87                   if (tmp_char == ERR)
88                     {
89                       return ch;
90                     }
91                   if (!tmp_char)
92                     break;
93                   if (tmp_char == 53)
94                     page_ch = KEY_PPAGE;
95                   else if (tmp_char == 54)
96                     page_ch = KEY_NPAGE;
97                   else
98                     {
99                       return 0;
100                     }
101                 }
102               ch_copy = page_ch;
103             }
104         }
105
106       switch (ch_copy)
107         {
108         case KEY_NPAGE:
109           tui_scroll_forward (win_info, 0);
110           break;
111         case KEY_PPAGE:
112           tui_scroll_backward (win_info, 0);
113           break;
114         case KEY_DOWN:
115         case KEY_SF:
116           tui_scroll_forward (win_info, 1);
117           break;
118         case KEY_UP:
119         case KEY_SR:
120           tui_scroll_backward (win_info, 1);
121           break;
122         case KEY_RIGHT:
123           tui_scroll_left (win_info, 1);
124           break;
125         case KEY_LEFT:
126           tui_scroll_right (win_info, 1);
127           break;
128         case '\f':
129           break;
130         default:
131           c = ch_copy;
132           break;
133         }
134       return c;
135     }
136 }