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