]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/tui/tui-io.c
Update years in copyright notice for the GDB files.
[thirdparty/binutils-gdb.git] / gdb / tui / tui-io.c
CommitLineData
f377b406 1/* TUI support I/O functions.
f33c6cbf 2
8acc9f48 3 Copyright (C) 1998-2013 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 213 edit buffer is empty, automatically restore the SingleKey
9b8d6827
SC
214 mode. The restore must only be done if the command has finished.
215 The command could call prompt_for_continue and we must not
216 restore SingleKey so that the prompt and normal keymap are used. */
217 if (tui_current_key_mode == TUI_ONE_COMMAND_MODE && rl_end == 0
218 && immediate_quit == 0)
6d012f14 219 tui_set_key_mode (TUI_SINGLE_KEY_MODE);
e3da6fc5 220
6d012f14 221 if (tui_current_key_mode == TUI_SINGLE_KEY_MODE)
e09d2eba
SC
222 prompt = "";
223 else
57266a33 224 prompt = tui_rl_saved_prompt;
a198b876
SC
225
226 c_pos = -1;
227 c_line = -1;
6d012f14
AC
228 w = TUI_CMD_WIN->generic.handle;
229 start_line = TUI_CMD_WIN->detail.command_info.start_line;
a198b876
SC
230 wmove (w, start_line, 0);
231 prev_col = 0;
232 height = 1;
233 for (in = 0; prompt && prompt[in]; in++)
234 {
235 waddch (w, prompt[in]);
236 getyx (w, line, col);
237 if (col < prev_col)
238 height++;
239 prev_col = col;
240 }
241 for (in = 0; in < rl_end; in++)
242 {
243 unsigned char c;
244
245 c = (unsigned char) rl_line_buffer[in];
246 if (in == rl_point)
247 {
248 getyx (w, c_line, c_pos);
249 }
250
251 if (CTRL_CHAR (c) || c == RUBOUT)
252 {
253 waddch (w, '^');
254 waddch (w, CTRL_CHAR (c) ? UNCTRL (c) : '?');
255 }
c906108c
SS
256 else
257 {
a198b876 258 waddch (w, c);
c906108c 259 }
a198b876
SC
260 if (c == '\n')
261 {
6d012f14
AC
262 getyx (w, TUI_CMD_WIN->detail.command_info.start_line,
263 TUI_CMD_WIN->detail.command_info.curch);
a198b876
SC
264 }
265 getyx (w, line, col);
266 if (col < prev_col)
267 height++;
268 prev_col = col;
c906108c 269 }
a198b876 270 wclrtobot (w);
6d012f14
AC
271 getyx (w, TUI_CMD_WIN->detail.command_info.start_line,
272 TUI_CMD_WIN->detail.command_info.curch);
a198b876 273 if (c_line >= 0)
d75e970c
SC
274 {
275 wmove (w, c_line, c_pos);
6d012f14
AC
276 TUI_CMD_WIN->detail.command_info.cur_line = c_line;
277 TUI_CMD_WIN->detail.command_info.curch = c_pos;
d75e970c 278 }
6d012f14 279 TUI_CMD_WIN->detail.command_info.start_line -= height - 1;
a198b876 280
a198b876
SC
281 wrefresh (w);
282 fflush(stdout);
283}
284
1cc6d956
MS
285/* Readline callback to prepare the terminal. It is called once each
286 time we enter readline. Terminal is already setup in curses
287 mode. */
a198b876 288static void
88fa91b4 289tui_prep_terminal (int notused1)
c906108c 290{
57266a33
SC
291 /* Save the prompt registered in readline to correctly display it.
292 (we can't use gdb_prompt() due to secondary prompts and can't use
293 rl_prompt because it points to an alloca buffer). */
294 xfree (tui_rl_saved_prompt);
295 tui_rl_saved_prompt = xstrdup (rl_prompt);
a198b876 296}
c906108c 297
1cc6d956
MS
298/* Readline callback to restore the terminal. It is called once each
299 time we leave readline. There is nothing to do in curses mode. */
a198b876
SC
300static void
301tui_deprep_terminal (void)
302{
303}
c906108c 304
8cee930b 305#ifdef TUI_USE_PIPE_FOR_READLINE
a198b876
SC
306/* Read readline output pipe and feed the command window with it.
307 Should be removed when readline is clean. */
308static void
01f69b38 309tui_readline_output (int error, gdb_client_data data)
a198b876
SC
310{
311 int size;
312 char buf[256];
c906108c 313
a198b876
SC
314 size = read (tui_readline_pipe[0], buf, sizeof (buf) - 1);
315 if (size > 0 && tui_active)
c906108c 316 {
a198b876
SC
317 buf[size] = 0;
318 tui_puts (buf);
c906108c 319 }
a198b876 320}
8cee930b
SC
321#endif
322
323/* Return the portion of PATHNAME that should be output when listing
324 possible completions. If we are hacking filename completion, we
325 are only interested in the basename, the portion following the
326 final slash. Otherwise, we return what we were passed.
327
1cc6d956 328 Comes from readline/complete.c. */
9f37bbcc
PA
329static const char *
330printable_part (const char *pathname)
8cee930b 331{
9f37bbcc 332 return rl_filename_completion_desired ? lbasename (pathname) : pathname;
8cee930b
SC
333}
334
1cc6d956
MS
335/* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and
336 we are using it, check for and output a single character for
337 `special' filenames. Return the number of characters we
338 output. */
8cee930b
SC
339
340#define PUTX(c) \
341 do { \
342 if (CTRL_CHAR (c)) \
343 { \
344 tui_puts ("^"); \
345 tui_putc (UNCTRL (c)); \
346 printed_len += 2; \
347 } \
348 else if (c == RUBOUT) \
349 { \
350 tui_puts ("^?"); \
351 printed_len += 2; \
352 } \
353 else \
354 { \
355 tui_putc (c); \
356 printed_len++; \
357 } \
358 } while (0)
359
360static int
9f37bbcc 361print_filename (const char *to_print, const char *full_pathname)
8cee930b
SC
362{
363 int printed_len = 0;
9f37bbcc 364 const char *s;
8cee930b
SC
365
366 for (s = to_print; *s; s++)
367 {
368 PUTX (*s);
369 }
370 return printed_len;
371}
372
373/* The user must press "y" or "n". Non-zero return means "y" pressed.
1cc6d956 374 Comes from readline/complete.c. */
8cee930b 375static int
d02c80cd 376get_y_or_n (void)
8cee930b
SC
377{
378 extern int _rl_abort_internal ();
379 int c;
380
381 for (;;)
382 {
383 c = rl_read_key ();
384 if (c == 'y' || c == 'Y' || c == ' ')
385 return (1);
386 if (c == 'n' || c == 'N' || c == RUBOUT)
387 return (0);
388 if (c == ABORT_CHAR)
389 _rl_abort_internal ();
390 beep ();
391 }
392}
393
394/* A convenience function for displaying a list of strings in
395 columnar format on readline's output stream. MATCHES is the list
396 of strings, in argv format, LEN is the number of strings in MATCHES,
397 and MAX is the length of the longest string in MATCHES.
398
399 Comes from readline/complete.c and modified to write in
400 the TUI command window using tui_putc/tui_puts. */
401static void
d02c80cd 402tui_rl_display_match_list (char **matches, int len, int max)
8cee930b
SC
403{
404 typedef int QSFUNC (const void *, const void *);
08ef48c5
MS
405 extern int _rl_qsort_string_compare (const void *,
406 const void *);
8cee930b
SC
407 extern int _rl_print_completions_horizontally;
408
409 int count, limit, printed_len;
410 int i, j, k, l;
9f37bbcc 411 const char *temp;
8cee930b
SC
412
413 /* Screen dimension correspond to the TUI command window. */
6d012f14 414 int screenwidth = TUI_CMD_WIN->generic.width;
8cee930b
SC
415
416 /* If there are many items, then ask the user if she really wants to
1cc6d956 417 see them all. */
8cee930b
SC
418 if (len >= rl_completion_query_items)
419 {
420 char msg[256];
421
8c042590
PM
422 xsnprintf (msg, sizeof (msg),
423 "\nDisplay all %d possibilities? (y or n)", len);
8cee930b
SC
424 tui_puts (msg);
425 if (get_y_or_n () == 0)
426 {
427 tui_puts ("\n");
428 return;
429 }
430 }
431
1cc6d956 432 /* How many items of MAX length can we fit in the screen window? */
8cee930b
SC
433 max += 2;
434 limit = screenwidth / max;
435 if (limit != 1 && (limit * max == screenwidth))
436 limit--;
437
1cc6d956
MS
438 /* Avoid a possible floating exception. If max > screenwidth, limit
439 will be 0 and a divide-by-zero fault will result. */
8cee930b
SC
440 if (limit == 0)
441 limit = 1;
442
1cc6d956 443 /* How many iterations of the printing loop? */
8cee930b
SC
444 count = (len + (limit - 1)) / limit;
445
446 /* Watch out for special case. If LEN is less than LIMIT, then
447 just do the inner printing loop.
1cc6d956 448 0 < len <= limit implies count = 1. */
8cee930b 449
1cc6d956 450 /* Sort the items if they are not already sorted. */
8cee930b
SC
451 if (rl_ignore_completion_duplicates == 0)
452 qsort (matches + 1, len, sizeof (char *),
453 (QSFUNC *)_rl_qsort_string_compare);
454
455 tui_putc ('\n');
456
457 if (_rl_print_completions_horizontally == 0)
458 {
1cc6d956 459 /* Print the sorted items, up-and-down alphabetically, like ls. */
8cee930b
SC
460 for (i = 1; i <= count; i++)
461 {
462 for (j = 0, l = i; j < limit; j++)
463 {
464 if (l > len || matches[l] == 0)
465 break;
466 else
467 {
468 temp = printable_part (matches[l]);
469 printed_len = print_filename (temp, matches[l]);
470
471 if (j + 1 < limit)
472 for (k = 0; k < max - printed_len; k++)
473 tui_putc (' ');
474 }
475 l += count;
476 }
477 tui_putc ('\n');
478 }
479 }
480 else
481 {
1cc6d956 482 /* Print the sorted items, across alphabetically, like ls -x. */
8cee930b
SC
483 for (i = 1; matches[i]; i++)
484 {
485 temp = printable_part (matches[i]);
486 printed_len = print_filename (temp, matches[i]);
1cc6d956 487 /* Have we reached the end of this line? */
8cee930b
SC
488 if (matches[i+1])
489 {
490 if (i && (limit > 1) && (i % limit) == 0)
491 tui_putc ('\n');
492 else
493 for (k = 0; k < max - printed_len; k++)
494 tui_putc (' ');
495 }
496 }
497 tui_putc ('\n');
498 }
499}
a198b876
SC
500
501/* Setup the IO for curses or non-curses mode.
502 - In non-curses mode, readline and gdb use the standard input and
503 standard output/error directly.
504 - In curses mode, the standard output/error is controlled by TUI
505 with the tui_stdout and tui_stderr. The output is redirected in
506 the curses command window. Several readline callbacks are installed
507 so that readline asks for its input to the curses command window
508 with wgetch(). */
509void
510tui_setup_io (int mode)
511{
cc88a640
JK
512 extern int _rl_echoing_p;
513
a198b876 514 if (mode)
c906108c 515 {
a198b876
SC
516 /* Redirect readline to TUI. */
517 tui_old_rl_redisplay_function = rl_redisplay_function;
518 tui_old_rl_deprep_terminal = rl_deprep_term_function;
519 tui_old_rl_prep_terminal = rl_prep_term_function;
520 tui_old_rl_getc_function = rl_getc_function;
521 tui_old_rl_outstream = rl_outstream;
cc88a640 522 tui_old_rl_echoing_p = _rl_echoing_p;
a198b876
SC
523 rl_redisplay_function = tui_redisplay_readline;
524 rl_deprep_term_function = tui_deprep_terminal;
525 rl_prep_term_function = tui_prep_terminal;
526 rl_getc_function = tui_getc;
cc88a640 527 _rl_echoing_p = 0;
a198b876
SC
528 rl_outstream = tui_rl_outstream;
529 rl_prompt = 0;
8cee930b
SC
530 rl_completion_display_matches_hook = tui_rl_display_match_list;
531 rl_already_prompted = 0;
a198b876
SC
532
533 /* Keep track of previous gdb output. */
534 tui_old_stdout = gdb_stdout;
535 tui_old_stderr = gdb_stderr;
79a45e25 536 tui_old_uiout = current_uiout;
a198b876
SC
537
538 /* Reconfigure gdb output. */
539 gdb_stdout = tui_stdout;
540 gdb_stderr = tui_stderr;
541 gdb_stdlog = gdb_stdout; /* for moment */
542 gdb_stdtarg = gdb_stderr; /* for moment */
8d4d924b 543 gdb_stdtargerr = gdb_stderr; /* for moment */
79a45e25 544 current_uiout = tui_out;
9d876a16
SC
545
546 /* Save tty for SIGCONT. */
547 savetty ();
c906108c 548 }
a198b876 549 else
c906108c 550 {
a198b876
SC
551 /* Restore gdb output. */
552 gdb_stdout = tui_old_stdout;
553 gdb_stderr = tui_old_stderr;
554 gdb_stdlog = gdb_stdout; /* for moment */
555 gdb_stdtarg = gdb_stderr; /* for moment */
8d4d924b 556 gdb_stdtargerr = gdb_stderr; /* for moment */
79a45e25 557 current_uiout = tui_old_uiout;
a198b876
SC
558
559 /* Restore readline. */
560 rl_redisplay_function = tui_old_rl_redisplay_function;
561 rl_deprep_term_function = tui_old_rl_deprep_terminal;
562 rl_prep_term_function = tui_old_rl_prep_terminal;
563 rl_getc_function = tui_old_rl_getc_function;
564 rl_outstream = tui_old_rl_outstream;
8cee930b 565 rl_completion_display_matches_hook = 0;
cc88a640 566 _rl_echoing_p = tui_old_rl_echoing_p;
bd9b0abf 567 rl_already_prompted = 0;
9d876a16
SC
568
569 /* Save tty for SIGCONT. */
570 savetty ();
571 }
572}
573
574#ifdef SIGCONT
575/* Catch SIGCONT to restore the terminal and refresh the screen. */
576static void
577tui_cont_sig (int sig)
578{
579 if (tui_active)
580 {
581 /* Restore the terminal setting because another process (shell)
582 might have changed it. */
583 resetty ();
584
585 /* Force a refresh of the screen. */
a21fcd8f 586 tui_refresh_all_win ();
d75e970c
SC
587
588 /* Update cursor position on the screen. */
6d012f14
AC
589 wmove (TUI_CMD_WIN->generic.handle,
590 TUI_CMD_WIN->detail.command_info.start_line,
591 TUI_CMD_WIN->detail.command_info.curch);
592 wrefresh (TUI_CMD_WIN->generic.handle);
c906108c 593 }
9d876a16 594 signal (sig, tui_cont_sig);
a198b876 595}
9d876a16 596#endif
c906108c 597
a198b876
SC
598/* Initialize the IO for gdb in curses mode. */
599void
d02c80cd 600tui_initialize_io (void)
a198b876 601{
9d876a16
SC
602#ifdef SIGCONT
603 signal (SIGCONT, tui_cont_sig);
604#endif
605
a198b876
SC
606 /* Create tui output streams. */
607 tui_stdout = tui_fileopen (stdout);
608 tui_stderr = tui_fileopen (stderr);
609 tui_out = tui_out_new (tui_stdout);
610
9a4105ab
AC
611 /* Create the default UI. It is not created because we installed a
612 deprecated_init_ui_hook. */
4801a9a3 613 tui_old_uiout = cli_out_new (gdb_stdout);
a198b876 614
8cee930b 615#ifdef TUI_USE_PIPE_FOR_READLINE
1cc6d956
MS
616 /* Temporary solution for readline writing to stdout: redirect
617 readline output in a pipe, read that pipe and output the content
618 in the curses command window. */
a198b876 619 if (pipe (tui_readline_pipe) != 0)
c906108c 620 {
a198b876
SC
621 fprintf_unfiltered (gdb_stderr, "Cannot create pipe for readline");
622 exit (1);
c906108c 623 }
a198b876
SC
624 tui_rl_outstream = fdopen (tui_readline_pipe[1], "w");
625 if (tui_rl_outstream == 0)
c906108c 626 {
a198b876
SC
627 fprintf_unfiltered (gdb_stderr, "Cannot redirect readline output");
628 exit (1);
c906108c 629 }
0f59c96f 630 setvbuf (tui_rl_outstream, (char*) NULL, _IOLBF, 0);
c906108c 631
a198b876
SC
632#ifdef O_NONBLOCK
633 (void) fcntl (tui_readline_pipe[0], F_SETFL, O_NONBLOCK);
c906108c 634#else
a198b876
SC
635#ifdef O_NDELAY
636 (void) fcntl (tui_readline_pipe[0], F_SETFL, O_NDELAY);
c906108c 637#endif
a198b876 638#endif
a198b876 639 add_file_handler (tui_readline_pipe[0], tui_readline_output, 0);
8cee930b
SC
640#else
641 tui_rl_outstream = stdout;
642#endif
a198b876
SC
643}
644
1cc6d956
MS
645/* Get a character from the command window. This is called from the
646 readline package. */
a198b876
SC
647int
648tui_getc (FILE *fp)
649{
650 int ch;
651 WINDOW *w;
652
6d012f14 653 w = TUI_CMD_WIN->generic.handle;
a198b876 654
8cee930b 655#ifdef TUI_USE_PIPE_FOR_READLINE
a198b876 656 /* Flush readline output. */
01f69b38 657 tui_readline_output (0, 0);
8cee930b
SC
658#endif
659
a198b876 660 ch = wgetch (w);
6ba8e26f 661 ch = tui_handle_resize_during_io (ch);
c906108c 662
1cc6d956
MS
663 /* The \n must be echoed because it will not be printed by
664 readline. */
a198b876
SC
665 if (ch == '\n')
666 {
667 /* When hitting return with an empty input, gdb executes the last
668 command. If we emit a newline, this fills up the command window
669 with empty lines with gdb prompt at beginning. Instead of that,
670 stay on the same line but provide a visual effect to show the
671 user we recognized the command. */
672 if (rl_end == 0)
673 {
6d012f14 674 wmove (w, TUI_CMD_WIN->detail.command_info.cur_line, 0);
a198b876
SC
675
676 /* Clear the line. This will blink the gdb prompt since
677 it will be redrawn at the same line. */
678 wclrtoeol (w);
679 wrefresh (w);
680 napms (20);
681 }
682 else
683 {
6d012f14
AC
684 wmove (w, TUI_CMD_WIN->detail.command_info.cur_line,
685 TUI_CMD_WIN->detail.command_info.curch);
a198b876
SC
686 waddch (w, ch);
687 }
688 }
689
bcdf1568 690 if (key_is_command_char (ch))
1cc6d956 691 { /* Handle prev/next/up/down here. */
b0a30fce 692 ch = tui_dispatch_ctrl_char (ch);
c906108c 693 }
a198b876 694
c906108c 695 if (ch == '\n' || ch == '\r' || ch == '\f')
6d012f14 696 TUI_CMD_WIN->detail.command_info.curch = 0;
a198b876
SC
697 if (ch == KEY_BACKSPACE)
698 return '\b';
699
c906108c 700 return ch;
a198b876 701}
c906108c 702
c906108c 703
a198b876
SC
704/* Cleanup when a resize has occured.
705 Returns the character that must be processed. */
c906108c 706static unsigned int
6ba8e26f 707tui_handle_resize_during_io (unsigned int original_ch)
c906108c 708{
dd1abb8c 709 if (tui_win_resized ())
c906108c 710 {
36900355 711 tui_resize_all ();
a21fcd8f 712 tui_refresh_all_win ();
c906108c 713 dont_repeat ();
dd1abb8c 714 tui_set_win_resized_to (FALSE);
c906108c
SS
715 return '\n';
716 }
717 else
6ba8e26f 718 return original_ch;
a198b876 719}