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