* [Qemu-devel] [PATCH 1/2] char: Handle resize.
@ 2010-04-16 11:42 Kusanagi Kouichi
0 siblings, 0 replies; 4+ messages in thread
From: Kusanagi Kouichi @ 2010-04-16 11:42 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Kusanagi Kouichi <slash@ac.auone-net.jp>
---
qemu-char.c | 34 ++++++++++++++++++++++++++++++++++
qemu-char.h | 3 +++
2 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index 05df971..03f9cbd 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -437,6 +437,11 @@ static void mux_chr_event(void *opaque, int event)
MuxDriver *d = chr->opaque;
int i;
+ if (event == CHR_EVENT_RESIZE) {
+ chr->rows = d->drv->rows;
+ chr->cols = d->drv->cols;
+ }
+
/* Send the event to all registered listeners */
for (i = 0; i < d->mux_cnt; i++)
mux_chr_send_event(d, i, event);
@@ -465,6 +470,10 @@ static void mux_chr_update_read_handler(CharDriverState *chr)
d->focus = d->mux_cnt;
d->mux_cnt++;
mux_chr_send_event(d, d->focus, CHR_EVENT_MUX_IN);
+
+ if (chr->rows > 0 && chr->cols > 0) {
+ mux_chr_send_event(d, d->focus, CHR_EVENT_RESIZE);
+ }
}
static CharDriverState *qemu_chr_open_mux(CharDriverState *drv)
@@ -545,6 +554,7 @@ int send_all(int fd, const void *buf, int len1)
typedef struct {
int fd_in, fd_out;
int max_size;
+ QEMUTimer *timer;
} FDCharDriver;
#define STDIO_MAX_CLIENTS 1
@@ -600,6 +610,8 @@ static void fd_chr_update_read_handler(CharDriverState *chr)
fd_chr_read, NULL, chr);
}
}
+
+ qemu_mod_timer(s->timer, qemu_get_clock(vm_clock));
}
static void fd_chr_close(struct CharDriverState *chr)
@@ -613,10 +625,31 @@ static void fd_chr_close(struct CharDriverState *chr)
}
}
+ qemu_del_timer(s->timer);
+ qemu_free_timer(s->timer);
qemu_free(s);
qemu_chr_event(chr, CHR_EVENT_CLOSED);
}
+static void fd_chr_timer(void *opaque)
+{
+ struct CharDriverState *chr = opaque;
+ FDCharDriver *s = chr->opaque;
+ struct winsize size;
+
+ if (ioctl(s->fd_out, TIOCGWINSZ, &size) == -1) {
+ return;
+ }
+
+ if (size.ws_row != chr->rows || size.ws_col != chr->cols) {
+ chr->rows = size.ws_row;
+ chr->cols = size.ws_col;
+ qemu_chr_event(chr, CHR_EVENT_RESIZE);
+ }
+
+ qemu_mod_timer(s->timer, qemu_get_clock(vm_clock) + get_ticks_per_sec());
+}
+
/* open a character device to a unix fd */
static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
{
@@ -627,6 +660,7 @@ static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
s = qemu_mallocz(sizeof(FDCharDriver));
s->fd_in = fd_in;
s->fd_out = fd_out;
+ s->timer = qemu_new_timer(vm_clock, fd_chr_timer, chr);
chr->opaque = s;
chr->chr_write = fd_chr_write;
chr->chr_update_read_handler = fd_chr_update_read_handler;
diff --git a/qemu-char.h b/qemu-char.h
index e3a0783..4fa2812 100644
--- a/qemu-char.h
+++ b/qemu-char.h
@@ -15,6 +15,7 @@
#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_EVENT_CLOSED 5 /* connection closed */
+#define CHR_EVENT_RESIZE 6 /* terminal resize */
#define CHR_IOCTL_SERIAL_SET_PARAMS 1
@@ -68,6 +69,8 @@ struct CharDriverState {
char *label;
char *filename;
int opened;
+ int rows;
+ int cols;
QTAILQ_ENTRY(CharDriverState) next;
};
--
1.7.0.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH 1/2] char: Handle resize.
@ 2010-05-03 6:36 Amit Shah
0 siblings, 0 replies; 4+ messages in thread
From: Amit Shah @ 2010-05-03 6:36 UTC (permalink / raw)
To: Anthony Liguori; +Cc: Amit Shah, Kusanagi Kouichi, qemu list
From: Kusanagi Kouichi <slash@ac.auone-net.jp>
Signed-off-by: Kusanagi Kouichi <slash@ac.auone-net.jp>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
qemu-char.c | 34 ++++++++++++++++++++++++++++++++++
qemu-char.h | 3 +++
2 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index ac65a1c..ce24483 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -437,6 +437,11 @@ static void mux_chr_event(void *opaque, int event)
MuxDriver *d = chr->opaque;
int i;
+ if (event == CHR_EVENT_RESIZE) {
+ chr->rows = d->drv->rows;
+ chr->cols = d->drv->cols;
+ }
+
/* Send the event to all registered listeners */
for (i = 0; i < d->mux_cnt; i++)
mux_chr_send_event(d, i, event);
@@ -465,6 +470,10 @@ static void mux_chr_update_read_handler(CharDriverState *chr)
d->focus = d->mux_cnt;
d->mux_cnt++;
mux_chr_send_event(d, d->focus, CHR_EVENT_MUX_IN);
+
+ if (chr->rows > 0 && chr->cols > 0) {
+ mux_chr_send_event(d, d->focus, CHR_EVENT_RESIZE);
+ }
}
static CharDriverState *qemu_chr_open_mux(CharDriverState *drv)
@@ -545,6 +554,7 @@ int send_all(int fd, const void *buf, int len1)
typedef struct {
int fd_in, fd_out;
int max_size;
+ QEMUTimer *timer;
} FDCharDriver;
#define STDIO_MAX_CLIENTS 1
@@ -600,6 +610,8 @@ static void fd_chr_update_read_handler(CharDriverState *chr)
fd_chr_read, NULL, chr);
}
}
+
+ qemu_mod_timer(s->timer, qemu_get_clock(vm_clock));
}
static void fd_chr_close(struct CharDriverState *chr)
@@ -613,10 +625,31 @@ static void fd_chr_close(struct CharDriverState *chr)
}
}
+ qemu_del_timer(s->timer);
+ qemu_free_timer(s->timer);
qemu_free(s);
qemu_chr_event(chr, CHR_EVENT_CLOSED);
}
+static void fd_chr_timer(void *opaque)
+{
+ struct CharDriverState *chr = opaque;
+ FDCharDriver *s = chr->opaque;
+ struct winsize size;
+
+ if (ioctl(s->fd_out, TIOCGWINSZ, &size) == -1) {
+ return;
+ }
+
+ if (size.ws_row != chr->rows || size.ws_col != chr->cols) {
+ chr->rows = size.ws_row;
+ chr->cols = size.ws_col;
+ qemu_chr_event(chr, CHR_EVENT_RESIZE);
+ }
+
+ qemu_mod_timer(s->timer, qemu_get_clock(vm_clock) + get_ticks_per_sec());
+}
+
/* open a character device to a unix fd */
static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
{
@@ -627,6 +660,7 @@ static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
s = qemu_mallocz(sizeof(FDCharDriver));
s->fd_in = fd_in;
s->fd_out = fd_out;
+ s->timer = qemu_new_timer(vm_clock, fd_chr_timer, chr);
chr->opaque = s;
chr->chr_write = fd_chr_write;
chr->chr_update_read_handler = fd_chr_update_read_handler;
diff --git a/qemu-char.h b/qemu-char.h
index e3a0783..4fa2812 100644
--- a/qemu-char.h
+++ b/qemu-char.h
@@ -15,6 +15,7 @@
#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_EVENT_CLOSED 5 /* connection closed */
+#define CHR_EVENT_RESIZE 6 /* terminal resize */
#define CHR_IOCTL_SERIAL_SET_PARAMS 1
@@ -68,6 +69,8 @@ struct CharDriverState {
char *label;
char *filename;
int opened;
+ int rows;
+ int cols;
QTAILQ_ENTRY(CharDriverState) next;
};
--
1.6.2.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH 1/2] char: Handle resize.
@ 2010-05-05 20:50 Amit Shah
2010-05-05 20:50 ` [Qemu-devel] [PATCH 2/2] virtio-console: Notify guest of console size resize Amit Shah
0 siblings, 1 reply; 4+ messages in thread
From: Amit Shah @ 2010-05-05 20:50 UTC (permalink / raw)
To: Anthony Liguori; +Cc: Amit Shah, Kusanagi Kouichi, qemu list
From: Kusanagi Kouichi <slash@ac.auone-net.jp>
Signed-off-by: Kusanagi Kouichi <slash@ac.auone-net.jp>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
qemu-char.c | 34 ++++++++++++++++++++++++++++++++++
qemu-char.h | 3 +++
2 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index ac65a1c..ce24483 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -437,6 +437,11 @@ static void mux_chr_event(void *opaque, int event)
MuxDriver *d = chr->opaque;
int i;
+ if (event == CHR_EVENT_RESIZE) {
+ chr->rows = d->drv->rows;
+ chr->cols = d->drv->cols;
+ }
+
/* Send the event to all registered listeners */
for (i = 0; i < d->mux_cnt; i++)
mux_chr_send_event(d, i, event);
@@ -465,6 +470,10 @@ static void mux_chr_update_read_handler(CharDriverState *chr)
d->focus = d->mux_cnt;
d->mux_cnt++;
mux_chr_send_event(d, d->focus, CHR_EVENT_MUX_IN);
+
+ if (chr->rows > 0 && chr->cols > 0) {
+ mux_chr_send_event(d, d->focus, CHR_EVENT_RESIZE);
+ }
}
static CharDriverState *qemu_chr_open_mux(CharDriverState *drv)
@@ -545,6 +554,7 @@ int send_all(int fd, const void *buf, int len1)
typedef struct {
int fd_in, fd_out;
int max_size;
+ QEMUTimer *timer;
} FDCharDriver;
#define STDIO_MAX_CLIENTS 1
@@ -600,6 +610,8 @@ static void fd_chr_update_read_handler(CharDriverState *chr)
fd_chr_read, NULL, chr);
}
}
+
+ qemu_mod_timer(s->timer, qemu_get_clock(vm_clock));
}
static void fd_chr_close(struct CharDriverState *chr)
@@ -613,10 +625,31 @@ static void fd_chr_close(struct CharDriverState *chr)
}
}
+ qemu_del_timer(s->timer);
+ qemu_free_timer(s->timer);
qemu_free(s);
qemu_chr_event(chr, CHR_EVENT_CLOSED);
}
+static void fd_chr_timer(void *opaque)
+{
+ struct CharDriverState *chr = opaque;
+ FDCharDriver *s = chr->opaque;
+ struct winsize size;
+
+ if (ioctl(s->fd_out, TIOCGWINSZ, &size) == -1) {
+ return;
+ }
+
+ if (size.ws_row != chr->rows || size.ws_col != chr->cols) {
+ chr->rows = size.ws_row;
+ chr->cols = size.ws_col;
+ qemu_chr_event(chr, CHR_EVENT_RESIZE);
+ }
+
+ qemu_mod_timer(s->timer, qemu_get_clock(vm_clock) + get_ticks_per_sec());
+}
+
/* open a character device to a unix fd */
static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
{
@@ -627,6 +660,7 @@ static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
s = qemu_mallocz(sizeof(FDCharDriver));
s->fd_in = fd_in;
s->fd_out = fd_out;
+ s->timer = qemu_new_timer(vm_clock, fd_chr_timer, chr);
chr->opaque = s;
chr->chr_write = fd_chr_write;
chr->chr_update_read_handler = fd_chr_update_read_handler;
diff --git a/qemu-char.h b/qemu-char.h
index e3a0783..4fa2812 100644
--- a/qemu-char.h
+++ b/qemu-char.h
@@ -15,6 +15,7 @@
#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_EVENT_CLOSED 5 /* connection closed */
+#define CHR_EVENT_RESIZE 6 /* terminal resize */
#define CHR_IOCTL_SERIAL_SET_PARAMS 1
@@ -68,6 +69,8 @@ struct CharDriverState {
char *label;
char *filename;
int opened;
+ int rows;
+ int cols;
QTAILQ_ENTRY(CharDriverState) next;
};
--
1.6.2.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH 2/2] virtio-console: Notify guest of console size resize
2010-05-05 20:50 [Qemu-devel] [PATCH 1/2] char: Handle resize Amit Shah
@ 2010-05-05 20:50 ` Amit Shah
0 siblings, 0 replies; 4+ messages in thread
From: Amit Shah @ 2010-05-05 20:50 UTC (permalink / raw)
To: Anthony Liguori; +Cc: Amit Shah, Kusanagi Kouichi, qemu list
From: Kusanagi Kouichi <slash@ac.auone-net.jp>
When we receive a CHR_EVENT_RESIZE notification, let the guest know of
the console size update.
Signed-off-by: Kusanagi Kouichi <slash@ac.auone-net.jp>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
hw/virtio-console.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/hw/virtio-console.c b/hw/virtio-console.c
index caea11f..58246d1 100644
--- a/hw/virtio-console.c
+++ b/hw/virtio-console.c
@@ -55,6 +55,9 @@ static void chr_event(void *opaque, int event)
case CHR_EVENT_CLOSED:
virtio_serial_close(&vcon->port);
break;
+ case CHR_EVENT_RESIZE:
+ virtio_serial_resize_console(&vcon->port, vcon->chr->rows, vcon->chr->cols);
+ break;
}
}
--
1.6.2.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-05-05 20:52 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-05 20:50 [Qemu-devel] [PATCH 1/2] char: Handle resize Amit Shah
2010-05-05 20:50 ` [Qemu-devel] [PATCH 2/2] virtio-console: Notify guest of console size resize Amit Shah
-- strict thread matches above, loose matches on Subject: below --
2010-05-03 6:36 [Qemu-devel] [PATCH 1/2] char: Handle resize Amit Shah
2010-04-16 11:42 Kusanagi Kouichi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).