Skip to content

Commit

Permalink
monitor: Improve mux'ed console experience (Jan Kiszka)
Browse files Browse the repository at this point in the history
Up to now, you never really knew if you already switched the console
after pressing CTRL-A C or if you mistyped it again. This patch
clarifies the situation by providing a prompt in a new line and
injecting a linebreak when switching away again. For this purpose, the
two events CHR_EVENT_MUX_IN and CHR_EVENT_MUX_OUT are introduced and
distributed on focus switches.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6716 c046a42c-6fe2-441c-8c8c-71466251a162
  • Loading branch information
aliguori committed Mar 5, 2009
1 parent 731b036 commit 2724b18
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 10 deletions.
27 changes: 22 additions & 5 deletions monitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -2918,12 +2918,27 @@ static void monitor_event(void *opaque, int event)
{
Monitor *mon = opaque;

if (event != CHR_EVENT_RESET)
return;
switch (event) {
case CHR_EVENT_MUX_IN:
readline_restart(mon->rs);
monitor_resume(mon);
monitor_flush(mon);
break;

case CHR_EVENT_MUX_OUT:
if (mon->suspend_cnt == 0)
monitor_printf(mon, "\n");
monitor_flush(mon);
monitor_suspend(mon);
break;

monitor_printf(mon, "QEMU %s monitor - type 'help' for more information\n",
QEMU_VERSION);
readline_show_prompt(mon->rs);
case CHR_EVENT_RESET:
monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
"information\n", QEMU_VERSION);
if (mon->chr->focus == 0)
readline_show_prompt(mon->rs);
break;
}
}

void monitor_init(CharDriverState *chr, int flags)
Expand All @@ -2940,6 +2955,8 @@ void monitor_init(CharDriverState *chr, int flags)

mon->chr = chr;
mon->flags = flags;
if (mon->chr->focus != 0)
mon->suspend_cnt = 1; /* mux'ed monitors start suspended */
mon->rs = readline_init(mon, monitor_find_completion);
monitor_read_command(mon, 0);

Expand Down
11 changes: 9 additions & 2 deletions qemu-char.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,12 @@ static void mux_print_help(CharDriverState *chr)
}
}

static void mux_chr_send_event(MuxDriver *d, int mux_nr, int event)
{
if (d->chr_event[mux_nr])
d->chr_event[mux_nr](d->ext_opaque[mux_nr], event);
}

static int mux_proc_byte(CharDriverState *chr, MuxDriver *d, int ch)
{
if (d->term_got_escape) {
Expand Down Expand Up @@ -341,9 +347,11 @@ static int mux_proc_byte(CharDriverState *chr, MuxDriver *d, int ch)
break;
case 'c':
/* Switch to the next registered device */
mux_chr_send_event(d, chr->focus, CHR_EVENT_MUX_OUT);
chr->focus++;
if (chr->focus >= d->mux_cnt)
chr->focus = 0;
mux_chr_send_event(d, chr->focus, CHR_EVENT_MUX_IN);
break;
case 't':
term_timestamps = !term_timestamps;
Expand Down Expand Up @@ -413,8 +421,7 @@ static void mux_chr_event(void *opaque, int event)

/* Send the event to all registered listeners */
for (i = 0; i < d->mux_cnt; i++)
if (d->chr_event[i])
d->chr_event[i](d->ext_opaque[i], event);
mux_chr_send_event(d, i, event);
}

static void mux_chr_update_read_handler(CharDriverState *chr)
Expand Down
8 changes: 5 additions & 3 deletions qemu-char.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@

/* character device */

#define CHR_EVENT_BREAK 0 /* serial break char */
#define CHR_EVENT_FOCUS 1 /* focus to this terminal (modal input needed) */
#define CHR_EVENT_RESET 2 /* new connection established */
#define CHR_EVENT_BREAK 0 /* serial break char */
#define CHR_EVENT_FOCUS 1 /* focus to this terminal (modal input needed) */
#define CHR_EVENT_RESET 2 /* new connection established */
#define CHR_EVENT_MUX_IN 3 /* mux-focus was set to this terminal */
#define CHR_EVENT_MUX_OUT 4 /* mux-focus will move on */


#define CHR_IOCTL_SERIAL_SET_PARAMS 1
Expand Down
5 changes: 5 additions & 0 deletions readline.c
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,11 @@ void readline_start(ReadLineState *rs, const char *prompt, int read_password,
rs->readline_func = readline_func;
rs->readline_opaque = opaque;
rs->read_password = read_password;
readline_restart(rs);
}

void readline_restart(ReadLineState *rs)
{
rs->cmd_buf_index = 0;
rs->cmd_buf_size = 0;
}
Expand Down
1 change: 1 addition & 0 deletions readline.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ void readline_handle_byte(ReadLineState *rs, int ch);

void readline_start(ReadLineState *rs, const char *prompt, int read_password,
ReadLineFunc *readline_func, void *opaque);
void readline_restart(ReadLineState *rs);
void readline_show_prompt(ReadLineState *rs);

ReadLineState *readline_init(Monitor *mon,
Expand Down

0 comments on commit 2724b18

Please sign in to comment.