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