* MAINTAINERS: Remove myself.
[deliverable/binutils-gdb.git] / gdb / tui / tui-io.c
CommitLineData
f377b406 1/* TUI support I/O functions.
f33c6cbf 2
c5a57081 3 Copyright (C) 1998-2004, 2007-2012 Free Software Foundation, Inc.
f33c6cbf 4
f377b406
SC
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
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
f377b406
SC
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
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 21
c906108c 22#include "defs.h"
a198b876
SC
23#include "target.h"
24#include "event-loop.h"
e09d2eba 25#include "event-top.h"
a198b876
SC
26#include "command.h"
27#include "top.h"
d7b2e967
AC
28#include "tui/tui.h"
29#include "tui/tui-data.h"
30#include "tui/tui-io.h"
31#include "tui/tui-command.h"
32#include "tui/tui-win.h"
33#include "tui/tui-wingeneral.h"
34#include "tui/tui-file.h"
a198b876
SC
35#include "ui-out.h"
36#include "cli-out.h"
37#include <fcntl.h>
9d876a16 38#include <signal.h>
96ec9981
DJ
39#include <stdio.h>
40
6a83354a 41#include "gdb_curses.h"
a198b876 42
4a1bcc8c
MK
43/* This redefines CTRL if it is not already defined, so it must come
44 after terminal state releated include files like <term.h> and
45 "gdb_curses.h". */
46#include "readline/readline.h"
47
bcdf1568
AC
48int
49key_is_start_sequence (int ch)
50{
51 return (ch == 27);
52}
53
54int
55key_is_end_sequence (int ch)
56{
57 return (ch == 126);
58}
59
60int
61key_is_backspace (int ch)
62{
63 return (ch == 8);
64}
65
66int
67key_is_command_char (int ch)
68{
69 return ((ch == KEY_NPAGE) || (ch == KEY_PPAGE)
70 || (ch == KEY_LEFT) || (ch == KEY_RIGHT)
71 || (ch == KEY_UP) || (ch == KEY_DOWN)
72 || (ch == KEY_SF) || (ch == KEY_SR)
e5908723
MS
73 || (ch == (int)'\f')
74 || key_is_start_sequence (ch));
bcdf1568
AC
75}
76
ec6f8892
SC
77/* Use definition from readline 4.3. */
78#undef CTRL_CHAR
08ef48c5
MS
79#define CTRL_CHAR(c) \
80 ((c) < control_character_threshold && (((c) & 0x80) == 0))
ec6f8892 81
a198b876
SC
82/* This file controls the IO interactions between gdb and curses.
83 When the TUI is enabled, gdb has two modes a curses and a standard
84 mode.
85
1cc6d956
MS
86 In curses mode, the gdb outputs are made in a curses command
87 window. For this, the gdb_stdout and gdb_stderr are redirected to
88 the specific ui_file implemented by TUI. The output is handled by
89 tui_puts(). The input is also controlled by curses with
90 tui_getc(). The readline library uses this function to get its
91 input. Several readline hooks are installed to redirect readline
92 output to the TUI (see also the note below).
a198b876
SC
93
94 In normal mode, the gdb outputs are restored to their origin, that
95 is as if TUI is not used. Readline also uses its original getc()
96 function with stdin.
97
1cc6d956
MS
98 Note SCz/2001-07-21: the current readline is not clean in its
99 management of the output. Even if we install a redisplay handler,
100 it sometimes writes on a stdout file. It is important to redirect
101 every output produced by readline, otherwise the curses window will
102 be garbled. This is implemented with a pipe that TUI reads and
103 readline writes to. A gdb input handler is created so that reading
104 the pipe is handled automatically. This will probably not work on
105 non-Unix platforms. The best fix is to make readline clean enougth
106 so that is never write on stdout.
107
108 Note SCz/2002-09-01: we now use more readline hooks and it seems
109 that with them we don't need the pipe anymore (verified by creating
110 the pipe and closing its end so that write causes a SIGPIPE). The
111 old pipe code is still there and can be conditionally removed by
8cee930b
SC
112 #undef TUI_USE_PIPE_FOR_READLINE. */
113
114/* For gdb 5.3, prefer to continue the pipe hack as a backup wheel. */
a156a290 115#ifdef HAVE_PIPE
8cee930b 116#define TUI_USE_PIPE_FOR_READLINE
a156a290 117#endif
1cc6d956 118/* #undef TUI_USE_PIPE_FOR_READLINE */
a198b876
SC
119
120/* TUI output files. */
121static struct ui_file *tui_stdout;
122static struct ui_file *tui_stderr;
2b68e2c5 123struct ui_out *tui_out;
a198b876
SC
124
125/* GDB output files in non-curses mode. */
126static struct ui_file *tui_old_stdout;
127static struct ui_file *tui_old_stderr;
2b68e2c5 128struct ui_out *tui_old_uiout;
a198b876
SC
129
130/* Readline previous hooks. */
131static Function *tui_old_rl_getc_function;
132static VFunction *tui_old_rl_redisplay_function;
133static VFunction *tui_old_rl_prep_terminal;
134static VFunction *tui_old_rl_deprep_terminal;
cc88a640 135static int tui_old_rl_echoing_p;
a198b876
SC
136
137/* Readline output stream.
138 Should be removed when readline is clean. */
139static FILE *tui_rl_outstream;
140static FILE *tui_old_rl_outstream;
8cee930b 141#ifdef TUI_USE_PIPE_FOR_READLINE
a198b876 142static int tui_readline_pipe[2];
8cee930b 143#endif
c906108c 144
57266a33
SC
145/* The last gdb prompt that was registered in readline.
146 This may be the main gdb prompt or a secondary prompt. */
147static char *tui_rl_saved_prompt;
148
6ba8e26f 149static unsigned int tui_handle_resize_during_io (unsigned int);
c906108c 150
8cee930b
SC
151static void
152tui_putc (char c)
153{
154 char buf[2];
155
156 buf[0] = c;
157 buf[1] = 0;
158 tui_puts (buf);
159}
c906108c 160
a198b876 161/* Print the string in the curses command window. */
c906108c 162void
a198b876 163tui_puts (const char *string)
c906108c 164{
a198b876
SC
165 static int tui_skip_line = -1;
166 char c;
167 WINDOW *w;
c906108c 168
6d012f14 169 w = TUI_CMD_WIN->generic.handle;
a198b876 170 while ((c = *string++) != 0)
c906108c 171 {
a198b876
SC
172 /* Catch annotation and discard them. We need two \032 and
173 discard until a \n is seen. */
174 if (c == '\032')
175 {
176 tui_skip_line++;
177 }
178 else if (tui_skip_line != 1)
179 {
180 tui_skip_line = -1;
181 waddch (w, c);
182 }
183 else if (c == '\n')
184 tui_skip_line = -1;
185 }
6d012f14
AC
186 getyx (w, TUI_CMD_WIN->detail.command_info.cur_line,
187 TUI_CMD_WIN->detail.command_info.curch);
9a2b4c1b
MS
188 TUI_CMD_WIN->detail.command_info.start_line
189 = TUI_CMD_WIN->detail.command_info.cur_line;
a198b876
SC
190
191 /* We could defer the following. */
192 wrefresh (w);
193 fflush (stdout);
194}
195
196/* Readline callback.
197 Redisplay the command line with its prompt after readline has
198 changed the edited text. */
e09d2eba 199void
a198b876
SC
200tui_redisplay_readline (void)
201{
202 int prev_col;
203 int height;
204 int col, line;
205 int c_pos;
206 int c_line;
207 int in;
208 WINDOW *w;
209 char *prompt;
210 int start_line;
e3da6fc5
SC
211
212 /* Detect when we temporarily left SingleKey and now the readline
1cc6d956
MS
213 edit buffer is empty, automatically restore the SingleKey
214 mode. */
6d012f14
AC
215 if (tui_current_key_mode == TUI_ONE_COMMAND_MODE && rl_end == 0)
216 tui_set_key_mode (TUI_SINGLE_KEY_MODE);
e3da6fc5 217
6d012f14 218 if (tui_current_key_mode == TUI_SINGLE_KEY_MODE)
e09d2eba
SC
219 prompt = "";
220 else
57266a33 221 prompt = tui_rl_saved_prompt;
a198b876
SC
222
223 c_pos = -1;
224 c_line = -1;
6d012f14
AC
225 w = TUI_CMD_WIN->generic.handle;
226 start_line = TUI_CMD_WIN->detail.command_info.start_line;
a198b876
SC
227 wmove (w, start_line, 0);
228 prev_col = 0;
229 height = 1;
230 for (in = 0; prompt && prompt[in]; in++)
231 {
232 waddch (w, prompt[in]);
233 getyx (w, line, col);
234 if (col < prev_col)
235 height++;
236 prev_col = col;
237 }
238 for (in = 0; in < rl_end; in++)
239 {
240 unsigned char c;
241
242 c = (unsigned char) rl_line_buffer[in];
243 if (in == rl_point)
244 {
245 getyx (w, c_line, c_pos);
246 }
247
248 if (CTRL_CHAR (c) || c == RUBOUT)
249 {
250 waddch (w, '^');
251 waddch (w, CTRL_CHAR (c) ? UNCTRL (c) : '?');
252 }
c906108c
SS
253 else
254 {
a198b876 255 waddch (w, c);
c906108c 256 }
a198b876
SC
257 if (c == '\n')
258 {
6d012f14
AC
259 getyx (w, TUI_CMD_WIN->detail.command_info.start_line,
260 TUI_CMD_WIN->detail.command_info.curch);
a198b876
SC
261 }
262 getyx (w, line, col);
263 if (col < prev_col)
264 height++;
265 prev_col = col;
c906108c 266 }
a198b876 267 wclrtobot (w);
6d012f14
AC
268 getyx (w, TUI_CMD_WIN->detail.command_info.start_line,
269 TUI_CMD_WIN->detail.command_info.curch);
a198b876 270 if (c_line >= 0)
d75e970c
SC
271 {
272 wmove (w, c_line, c_pos);
6d012f14
AC
273 TUI_CMD_WIN->detail.command_info.cur_line = c_line;
274 TUI_CMD_WIN->detail.command_info.curch = c_pos;
d75e970c 275 }
6d012f14 276 TUI_CMD_WIN->detail.command_info.start_line -= height - 1;
a198b876 277
a198b876
SC
278 wrefresh (w);
279 fflush(stdout);
280}
281
1cc6d956
MS
282/* Readline callback to prepare the terminal. It is called once each
283 time we enter readline. Terminal is already setup in curses
284 mode. */
a198b876 285static void
88fa91b4 286tui_prep_terminal (int notused1)
c906108c 287{
57266a33
SC
288 /* Save the prompt registered in readline to correctly display it.
289 (we can't use gdb_prompt() due to secondary prompts and can't use
290 rl_prompt because it points to an alloca buffer). */
291 xfree (tui_rl_saved_prompt);
292 tui_rl_saved_prompt = xstrdup (rl_prompt);
a198b876 293}
c906108c 294
1cc6d956
MS
295/* Readline callback to restore the terminal. It is called once each
296 time we leave readline. There is nothing to do in curses mode. */
a198b876
SC
297static void
298tui_deprep_terminal (void)
299{
300}
c906108c 301
8cee930b 302#ifdef TUI_USE_PIPE_FOR_READLINE
a198b876
SC
303/* Read readline output pipe and feed the command window with it.
304 Should be removed when readline is clean. */
305static void
01f69b38 306tui_readline_output (int error, gdb_client_data data)
a198b876
SC
307{
308 int size;
309 char buf[256];
c906108c 310
a198b876
SC
311 size = read (tui_readline_pipe[0], buf, sizeof (buf) - 1);
312 if (size > 0 && tui_active)
c906108c 313 {
a198b876
SC
314 buf[size] = 0;
315 tui_puts (buf);
c906108c 316 }
a198b876 317}
8cee930b
SC
318#endif
319
320/* Return the portion of PATHNAME that should be output when listing
321 possible completions. If we are hacking filename completion, we
322 are only interested in the basename, the portion following the
323 final slash. Otherwise, we return what we were passed.
324
1cc6d956 325 Comes from readline/complete.c. */
9f37bbcc
PA
326static const char *
327printable_part (const char *pathname)
8cee930b 328{
9f37bbcc 329 return rl_filename_completion_desired ? lbasename (pathname) : pathname;
8cee930b
SC
330}
331
1cc6d956
MS
332/* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and
333 we are using it, check for and output a single character for
334 `special' filenames. Return the number of characters we
335 output. */
8cee930b
SC
336
337#define PUTX(c) \
338 do { \
339 if (CTRL_CHAR (c)) \
340 { \
341 tui_puts ("^"); \
342 tui_putc (UNCTRL (c)); \
343 printed_len += 2; \
344 } \
345 else if (c == RUBOUT) \
346 { \
347 tui_puts ("^?"); \
348 printed_len += 2; \
349 } \
350 else \
351 { \
352 tui_putc (c); \
353 printed_len++; \
354 } \
355 } while (0)
356
357static int
9f37bbcc 358print_filename (const char *to_print, const char *full_pathname)
8cee930b
SC
359{
360 int printed_len = 0;
9f37bbcc 361 const char *s;
8cee930b
SC
362
363 for (s = to_print; *s; s++)
364 {
365 PUTX (*s);
366 }
367 return printed_len;
368}
369
370/* The user must press "y" or "n". Non-zero return means "y" pressed.
1cc6d956 371 Comes from readline/complete.c. */
8cee930b 372static int
d02c80cd 373get_y_or_n (void)
8cee930b
SC
374{
375 extern int _rl_abort_internal ();
376 int c;
377
378 for (;;)
379 {
380 c = rl_read_key ();
381 if (c == 'y' || c == 'Y' || c == ' ')
382 return (1);
383 if (c == 'n' || c == 'N' || c == RUBOUT)
384 return (0);
385 if (c == ABORT_CHAR)
386 _rl_abort_internal ();
387 beep ();
388 }
389}
390
391/* A convenience function for displaying a list of strings in
392 columnar format on readline's output stream. MATCHES is the list
393 of strings, in argv format, LEN is the number of strings in MATCHES,
394 and MAX is the length of the longest string in MATCHES.
395
396 Comes from readline/complete.c and modified to write in
397 the TUI command window using tui_putc/tui_puts. */
398static void
d02c80cd 399tui_rl_display_match_list (char **matches, int len, int max)
8cee930b
SC
400{
401 typedef int QSFUNC (const void *, const void *);
08ef48c5
MS
402 extern int _rl_qsort_string_compare (const void *,
403 const void *);
8cee930b
SC
404 extern int _rl_print_completions_horizontally;
405
406 int count, limit, printed_len;
407 int i, j, k, l;
9f37bbcc 408 const char *temp;
8cee930b
SC
409
410 /* Screen dimension correspond to the TUI command window. */
6d012f14 411 int screenwidth = TUI_CMD_WIN->generic.width;
8cee930b
SC
412
413 /* If there are many items, then ask the user if she really wants to
1cc6d956 414 see them all. */
8cee930b
SC
415 if (len >= rl_completion_query_items)
416 {
417 char msg[256];
418
419 sprintf (msg, "\nDisplay all %d possibilities? (y or n)", len);
420 tui_puts (msg);
421 if (get_y_or_n () == 0)
422 {
423 tui_puts ("\n");
424 return;
425 }
426 }
427
1cc6d956 428 /* How many items of MAX length can we fit in the screen window? */
8cee930b
SC
429 max += 2;
430 limit = screenwidth / max;
431 if (limit != 1 && (limit * max == screenwidth))
432 limit--;
433
1cc6d956
MS
434 /* Avoid a possible floating exception. If max > screenwidth, limit
435 will be 0 and a divide-by-zero fault will result. */
8cee930b
SC
436 if (limit == 0)
437 limit = 1;
438
1cc6d956 439 /* How many iterations of the printing loop? */
8cee930b
SC
440 count = (len + (limit - 1)) / limit;
441
442 /* Watch out for special case. If LEN is less than LIMIT, then
443 just do the inner printing loop.
1cc6d956 444 0 < len <= limit implies count = 1. */
8cee930b 445
1cc6d956 446 /* Sort the items if they are not already sorted. */
8cee930b
SC
447 if (rl_ignore_completion_duplicates == 0)
448 qsort (matches + 1, len, sizeof (char *),
449 (QSFUNC *)_rl_qsort_string_compare);
450
451 tui_putc ('\n');
452
453 if (_rl_print_completions_horizontally == 0)
454 {
1cc6d956 455 /* Print the sorted items, up-and-down alphabetically, like ls. */
8cee930b
SC
456 for (i = 1; i <= count; i++)
457 {
458 for (j = 0, l = i; j < limit; j++)
459 {
460 if (l > len || matches[l] == 0)
461 break;
462 else
463 {
464 temp = printable_part (matches[l]);
465 printed_len = print_filename (temp, matches[l]);
466
467 if (j + 1 < limit)
468 for (k = 0; k < max - printed_len; k++)
469 tui_putc (' ');
470 }
471 l += count;
472 }
473 tui_putc ('\n');
474 }
475 }
476 else
477 {
1cc6d956 478 /* Print the sorted items, across alphabetically, like ls -x. */
8cee930b
SC
479 for (i = 1; matches[i]; i++)
480 {
481 temp = printable_part (matches[i]);
482 printed_len = print_filename (temp, matches[i]);
1cc6d956 483 /* Have we reached the end of this line? */
8cee930b
SC
484 if (matches[i+1])
485 {
486 if (i && (limit > 1) && (i % limit) == 0)
487 tui_putc ('\n');
488 else
489 for (k = 0; k < max - printed_len; k++)
490 tui_putc (' ');
491 }
492 }
493 tui_putc ('\n');
494 }
495}
a198b876
SC
496
497/* Setup the IO for curses or non-curses mode.
498 - In non-curses mode, readline and gdb use the standard input and
499 standard output/error directly.
500 - In curses mode, the standard output/error is controlled by TUI
501 with the tui_stdout and tui_stderr. The output is redirected in
502 the curses command window. Several readline callbacks are installed
503 so that readline asks for its input to the curses command window
504 with wgetch(). */
505void
506tui_setup_io (int mode)
507{
cc88a640
JK
508 extern int _rl_echoing_p;
509
a198b876 510 if (mode)
c906108c 511 {
a198b876
SC
512 /* Redirect readline to TUI. */
513 tui_old_rl_redisplay_function = rl_redisplay_function;
514 tui_old_rl_deprep_terminal = rl_deprep_term_function;
515 tui_old_rl_prep_terminal = rl_prep_term_function;
516 tui_old_rl_getc_function = rl_getc_function;
517 tui_old_rl_outstream = rl_outstream;
cc88a640 518 tui_old_rl_echoing_p = _rl_echoing_p;
a198b876
SC
519 rl_redisplay_function = tui_redisplay_readline;
520 rl_deprep_term_function = tui_deprep_terminal;
521 rl_prep_term_function = tui_prep_terminal;
522 rl_getc_function = tui_getc;
cc88a640 523 _rl_echoing_p = 0;
a198b876
SC
524 rl_outstream = tui_rl_outstream;
525 rl_prompt = 0;
8cee930b
SC
526 rl_completion_display_matches_hook = tui_rl_display_match_list;
527 rl_already_prompted = 0;
a198b876
SC
528
529 /* Keep track of previous gdb output. */
530 tui_old_stdout = gdb_stdout;
531 tui_old_stderr = gdb_stderr;
79a45e25 532 tui_old_uiout = current_uiout;
a198b876
SC
533
534 /* Reconfigure gdb output. */
535 gdb_stdout = tui_stdout;
536 gdb_stderr = tui_stderr;
537 gdb_stdlog = gdb_stdout; /* for moment */
538 gdb_stdtarg = gdb_stderr; /* for moment */
8d4d924b 539 gdb_stdtargerr = gdb_stderr; /* for moment */
79a45e25 540 current_uiout = tui_out;
9d876a16
SC
541
542 /* Save tty for SIGCONT. */
543 savetty ();
c906108c 544 }
a198b876 545 else
c906108c 546 {
a198b876
SC
547 /* Restore gdb output. */
548 gdb_stdout = tui_old_stdout;
549 gdb_stderr = tui_old_stderr;
550 gdb_stdlog = gdb_stdout; /* for moment */
551 gdb_stdtarg = gdb_stderr; /* for moment */
8d4d924b 552 gdb_stdtargerr = gdb_stderr; /* for moment */
79a45e25 553 current_uiout = tui_old_uiout;
a198b876
SC
554
555 /* Restore readline. */
556 rl_redisplay_function = tui_old_rl_redisplay_function;
557 rl_deprep_term_function = tui_old_rl_deprep_terminal;
558 rl_prep_term_function = tui_old_rl_prep_terminal;
559 rl_getc_function = tui_old_rl_getc_function;
560 rl_outstream = tui_old_rl_outstream;
8cee930b 561 rl_completion_display_matches_hook = 0;
cc88a640 562 _rl_echoing_p = tui_old_rl_echoing_p;
bd9b0abf 563 rl_already_prompted = 0;
9d876a16
SC
564
565 /* Save tty for SIGCONT. */
566 savetty ();
567 }
568}
569
570#ifdef SIGCONT
571/* Catch SIGCONT to restore the terminal and refresh the screen. */
572static void
573tui_cont_sig (int sig)
574{
575 if (tui_active)
576 {
577 /* Restore the terminal setting because another process (shell)
578 might have changed it. */
579 resetty ();
580
581 /* Force a refresh of the screen. */
a21fcd8f 582 tui_refresh_all_win ();
d75e970c
SC
583
584 /* Update cursor position on the screen. */
6d012f14
AC
585 wmove (TUI_CMD_WIN->generic.handle,
586 TUI_CMD_WIN->detail.command_info.start_line,
587 TUI_CMD_WIN->detail.command_info.curch);
588 wrefresh (TUI_CMD_WIN->generic.handle);
c906108c 589 }
9d876a16 590 signal (sig, tui_cont_sig);
a198b876 591}
9d876a16 592#endif
c906108c 593
a198b876
SC
594/* Initialize the IO for gdb in curses mode. */
595void
d02c80cd 596tui_initialize_io (void)
a198b876 597{
9d876a16
SC
598#ifdef SIGCONT
599 signal (SIGCONT, tui_cont_sig);
600#endif
601
a198b876
SC
602 /* Create tui output streams. */
603 tui_stdout = tui_fileopen (stdout);
604 tui_stderr = tui_fileopen (stderr);
605 tui_out = tui_out_new (tui_stdout);
606
9a4105ab
AC
607 /* Create the default UI. It is not created because we installed a
608 deprecated_init_ui_hook. */
4801a9a3 609 tui_old_uiout = cli_out_new (gdb_stdout);
a198b876 610
8cee930b 611#ifdef TUI_USE_PIPE_FOR_READLINE
1cc6d956
MS
612 /* Temporary solution for readline writing to stdout: redirect
613 readline output in a pipe, read that pipe and output the content
614 in the curses command window. */
a198b876 615 if (pipe (tui_readline_pipe) != 0)
c906108c 616 {
a198b876
SC
617 fprintf_unfiltered (gdb_stderr, "Cannot create pipe for readline");
618 exit (1);
c906108c 619 }
a198b876
SC
620 tui_rl_outstream = fdopen (tui_readline_pipe[1], "w");
621 if (tui_rl_outstream == 0)
c906108c 622 {
a198b876
SC
623 fprintf_unfiltered (gdb_stderr, "Cannot redirect readline output");
624 exit (1);
c906108c 625 }
0f59c96f 626 setvbuf (tui_rl_outstream, (char*) NULL, _IOLBF, 0);
c906108c 627
a198b876
SC
628#ifdef O_NONBLOCK
629 (void) fcntl (tui_readline_pipe[0], F_SETFL, O_NONBLOCK);
c906108c 630#else
a198b876
SC
631#ifdef O_NDELAY
632 (void) fcntl (tui_readline_pipe[0], F_SETFL, O_NDELAY);
c906108c 633#endif
a198b876 634#endif
a198b876 635 add_file_handler (tui_readline_pipe[0], tui_readline_output, 0);
8cee930b
SC
636#else
637 tui_rl_outstream = stdout;
638#endif
a198b876
SC
639}
640
1cc6d956
MS
641/* Get a character from the command window. This is called from the
642 readline package. */
a198b876
SC
643int
644tui_getc (FILE *fp)
645{
646 int ch;
647 WINDOW *w;
648
6d012f14 649 w = TUI_CMD_WIN->generic.handle;
a198b876 650
8cee930b 651#ifdef TUI_USE_PIPE_FOR_READLINE
a198b876 652 /* Flush readline output. */
01f69b38 653 tui_readline_output (0, 0);
8cee930b
SC
654#endif
655
a198b876 656 ch = wgetch (w);
6ba8e26f 657 ch = tui_handle_resize_during_io (ch);
c906108c 658
1cc6d956
MS
659 /* The \n must be echoed because it will not be printed by
660 readline. */
a198b876
SC
661 if (ch == '\n')
662 {
663 /* When hitting return with an empty input, gdb executes the last
664 command. If we emit a newline, this fills up the command window
665 with empty lines with gdb prompt at beginning. Instead of that,
666 stay on the same line but provide a visual effect to show the
667 user we recognized the command. */
668 if (rl_end == 0)
669 {
6d012f14 670 wmove (w, TUI_CMD_WIN->detail.command_info.cur_line, 0);
a198b876
SC
671
672 /* Clear the line. This will blink the gdb prompt since
673 it will be redrawn at the same line. */
674 wclrtoeol (w);
675 wrefresh (w);
676 napms (20);
677 }
678 else
679 {
6d012f14
AC
680 wmove (w, TUI_CMD_WIN->detail.command_info.cur_line,
681 TUI_CMD_WIN->detail.command_info.curch);
a198b876
SC
682 waddch (w, ch);
683 }
684 }
685
bcdf1568 686 if (key_is_command_char (ch))
1cc6d956 687 { /* Handle prev/next/up/down here. */
b0a30fce 688 ch = tui_dispatch_ctrl_char (ch);
c906108c 689 }
a198b876 690
c906108c 691 if (ch == '\n' || ch == '\r' || ch == '\f')
6d012f14 692 TUI_CMD_WIN->detail.command_info.curch = 0;
a198b876
SC
693 if (ch == KEY_BACKSPACE)
694 return '\b';
695
c906108c 696 return ch;
a198b876 697}
c906108c 698
c906108c 699
a198b876
SC
700/* Cleanup when a resize has occured.
701 Returns the character that must be processed. */
c906108c 702static unsigned int
6ba8e26f 703tui_handle_resize_during_io (unsigned int original_ch)
c906108c 704{
dd1abb8c 705 if (tui_win_resized ())
c906108c 706 {
36900355 707 tui_resize_all ();
a21fcd8f 708 tui_refresh_all_win ();
c906108c 709 dont_repeat ();
dd1abb8c 710 tui_set_win_resized_to (FALSE);
c906108c
SS
711 return '\n';
712 }
713 else
6ba8e26f 714 return original_ch;
a198b876 715}
This page took 1.41751 seconds and 4 git commands to generate.