mirror of
https://github.com/qemu/qemu.git
synced 2024-12-04 09:13:39 +08:00
ui/curses: Do not use console_select()
ui/curses is the only user of console_select(). Move the implementation to ui/curses. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20240319-console-v2-4-3fd6feef321a@daynix.com>
This commit is contained in:
parent
ca3de7b5af
commit
e99441a379
@ -433,7 +433,6 @@ int qemu_console_get_window_id(QemuConsole *con);
|
|||||||
/* Set the low-level window id for the console */
|
/* Set the low-level window id for the console */
|
||||||
void qemu_console_set_window_id(QemuConsole *con, int window_id);
|
void qemu_console_set_window_id(QemuConsole *con, int window_id);
|
||||||
|
|
||||||
void console_select(unsigned int index);
|
|
||||||
void qemu_console_resize(QemuConsole *con, int width, int height);
|
void qemu_console_resize(QemuConsole *con, int width, int height);
|
||||||
DisplaySurface *qemu_console_surface(QemuConsole *con);
|
DisplaySurface *qemu_console_surface(QemuConsole *con);
|
||||||
void coroutine_fn qemu_console_co_wait_update(QemuConsole *con);
|
void coroutine_fn qemu_console_co_wait_update(QemuConsole *con);
|
||||||
|
@ -35,7 +35,7 @@ struct QemuConsole {
|
|||||||
QTAILQ_ENTRY(QemuConsole) next;
|
QTAILQ_ENTRY(QemuConsole) next;
|
||||||
};
|
};
|
||||||
|
|
||||||
void qemu_text_console_select(QemuTextConsole *c);
|
void qemu_text_console_update_size(QemuTextConsole *c);
|
||||||
const char * qemu_text_console_get_label(QemuTextConsole *c);
|
const char * qemu_text_console_get_label(QemuTextConsole *c);
|
||||||
void qemu_text_console_update_cursor(void);
|
void qemu_text_console_update_cursor(void);
|
||||||
void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym);
|
void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym);
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include "chardev/char.h"
|
#include "chardev/char.h"
|
||||||
#include "ui/console-priv.h"
|
#include "ui/console-priv.h"
|
||||||
|
|
||||||
void qemu_text_console_select(QemuTextConsole *c)
|
void qemu_text_console_update_size(QemuTextConsole *c)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -958,10 +958,9 @@ static void vc_chr_set_echo(Chardev *chr, bool echo)
|
|||||||
drv->console->echo = echo;
|
drv->console->echo = echo;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_text_console_select(QemuTextConsole *c)
|
void qemu_text_console_update_size(QemuTextConsole *c)
|
||||||
{
|
{
|
||||||
dpy_text_resize(QEMU_CONSOLE(c), c->width, c->height);
|
dpy_text_resize(QEMU_CONSOLE(c), c->width, c->height);
|
||||||
qemu_text_console_update_cursor();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vc_chr_open(Chardev *chr,
|
static void vc_chr_open(Chardev *chr,
|
||||||
|
121
ui/console.c
121
ui/console.c
@ -66,7 +66,6 @@ struct DisplayState {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static DisplayState *display_state;
|
static DisplayState *display_state;
|
||||||
static QemuConsole *active_console;
|
|
||||||
static QTAILQ_HEAD(, QemuConsole) consoles =
|
static QTAILQ_HEAD(, QemuConsole) consoles =
|
||||||
QTAILQ_HEAD_INITIALIZER(consoles);
|
QTAILQ_HEAD_INITIALIZER(consoles);
|
||||||
|
|
||||||
@ -135,7 +134,6 @@ void graphic_hw_update_done(QemuConsole *con)
|
|||||||
void graphic_hw_update(QemuConsole *con)
|
void graphic_hw_update(QemuConsole *con)
|
||||||
{
|
{
|
||||||
bool async = false;
|
bool async = false;
|
||||||
con = con ? con : active_console;
|
|
||||||
if (!con) {
|
if (!con) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -209,9 +207,6 @@ void qemu_console_set_window_id(QemuConsole *con, int window_id)
|
|||||||
|
|
||||||
void graphic_hw_invalidate(QemuConsole *con)
|
void graphic_hw_invalidate(QemuConsole *con)
|
||||||
{
|
{
|
||||||
if (!con) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
if (con && con->hw_ops->invalidate) {
|
if (con && con->hw_ops->invalidate) {
|
||||||
con->hw_ops->invalidate(con->hw);
|
con->hw_ops->invalidate(con->hw);
|
||||||
}
|
}
|
||||||
@ -219,9 +214,6 @@ void graphic_hw_invalidate(QemuConsole *con)
|
|||||||
|
|
||||||
void graphic_hw_text_update(QemuConsole *con, console_ch_t *chardata)
|
void graphic_hw_text_update(QemuConsole *con, console_ch_t *chardata)
|
||||||
{
|
{
|
||||||
if (!con) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
if (con && con->hw_ops->text_update) {
|
if (con && con->hw_ops->text_update) {
|
||||||
con->hw_ops->text_update(con->hw, chardata);
|
con->hw_ops->text_update(con->hw, chardata);
|
||||||
}
|
}
|
||||||
@ -265,12 +257,12 @@ static void dpy_gfx_update_texture(QemuConsole *con, DisplaySurface *surface,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void displaychangelistener_display_console(DisplayChangeListener *dcl,
|
static void displaychangelistener_display_console(DisplayChangeListener *dcl,
|
||||||
QemuConsole *con,
|
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
static const char nodev[] =
|
static const char nodev[] =
|
||||||
"This VM has no graphic display device.";
|
"This VM has no graphic display device.";
|
||||||
static DisplaySurface *dummy;
|
static DisplaySurface *dummy;
|
||||||
|
QemuConsole *con = dcl->con;
|
||||||
|
|
||||||
if (!con || !console_compatible_with(con, dcl, errp)) {
|
if (!con || !console_compatible_with(con, dcl, errp)) {
|
||||||
if (!dummy) {
|
if (!dummy) {
|
||||||
@ -305,39 +297,8 @@ static void displaychangelistener_display_console(DisplayChangeListener *dcl,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void console_select(unsigned int index)
|
|
||||||
{
|
|
||||||
DisplayChangeListener *dcl;
|
|
||||||
QemuConsole *s;
|
|
||||||
|
|
||||||
trace_console_select(index);
|
|
||||||
s = qemu_console_lookup_by_index(index);
|
|
||||||
if (s) {
|
|
||||||
DisplayState *ds = s->ds;
|
|
||||||
|
|
||||||
active_console = s;
|
|
||||||
QLIST_FOREACH (dcl, &ds->listeners, next) {
|
|
||||||
if (dcl->con != NULL) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
displaychangelistener_display_console(dcl, s, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (QEMU_IS_TEXT_CONSOLE(s)) {
|
|
||||||
qemu_text_console_select(QEMU_TEXT_CONSOLE(s));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void qemu_text_console_put_keysym(QemuTextConsole *s, int keysym)
|
void qemu_text_console_put_keysym(QemuTextConsole *s, int keysym)
|
||||||
{
|
{
|
||||||
if (!s) {
|
|
||||||
if (!QEMU_IS_TEXT_CONSOLE(active_console)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
s = QEMU_TEXT_CONSOLE(active_console);
|
|
||||||
}
|
|
||||||
|
|
||||||
qemu_text_console_handle_keysym(s, keysym);
|
qemu_text_console_handle_keysym(s, keysym);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -392,11 +353,6 @@ qemu_console_register(QemuConsole *c)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!active_console || (!QEMU_IS_GRAPHIC_CONSOLE(active_console) &&
|
|
||||||
QEMU_IS_GRAPHIC_CONSOLE(c))) {
|
|
||||||
active_console = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (QTAILQ_EMPTY(&consoles)) {
|
if (QTAILQ_EMPTY(&consoles)) {
|
||||||
c->index = 0;
|
c->index = 0;
|
||||||
QTAILQ_INSERT_TAIL(&consoles, c, next);
|
QTAILQ_INSERT_TAIL(&consoles, c, next);
|
||||||
@ -751,8 +707,6 @@ dcl_set_graphic_cursor(DisplayChangeListener *dcl, QemuGraphicConsole *con)
|
|||||||
|
|
||||||
void register_displaychangelistener(DisplayChangeListener *dcl)
|
void register_displaychangelistener(DisplayChangeListener *dcl)
|
||||||
{
|
{
|
||||||
QemuConsole *con;
|
|
||||||
|
|
||||||
assert(!dcl->ds);
|
assert(!dcl->ds);
|
||||||
|
|
||||||
trace_displaychangelistener_register(dcl, dcl->ops->dpy_name);
|
trace_displaychangelistener_register(dcl, dcl->ops->dpy_name);
|
||||||
@ -761,13 +715,12 @@ void register_displaychangelistener(DisplayChangeListener *dcl)
|
|||||||
gui_setup_refresh(dcl->ds);
|
gui_setup_refresh(dcl->ds);
|
||||||
if (dcl->con) {
|
if (dcl->con) {
|
||||||
dcl->con->dcls++;
|
dcl->con->dcls++;
|
||||||
con = dcl->con;
|
|
||||||
} else {
|
|
||||||
con = active_console;
|
|
||||||
}
|
}
|
||||||
displaychangelistener_display_console(dcl, con, dcl->con ? &error_fatal : NULL);
|
displaychangelistener_display_console(dcl, &error_fatal);
|
||||||
if (QEMU_IS_GRAPHIC_CONSOLE(con)) {
|
if (QEMU_IS_GRAPHIC_CONSOLE(dcl->con)) {
|
||||||
dcl_set_graphic_cursor(dcl, QEMU_GRAPHIC_CONSOLE(con));
|
dcl_set_graphic_cursor(dcl, QEMU_GRAPHIC_CONSOLE(dcl->con));
|
||||||
|
} else if (QEMU_IS_TEXT_CONSOLE(dcl->con)) {
|
||||||
|
qemu_text_console_update_size(QEMU_TEXT_CONSOLE(dcl->con));
|
||||||
}
|
}
|
||||||
qemu_text_console_update_cursor();
|
qemu_text_console_update_cursor();
|
||||||
}
|
}
|
||||||
@ -805,9 +758,6 @@ static void dpy_set_ui_info_timer(void *opaque)
|
|||||||
|
|
||||||
bool dpy_ui_info_supported(const QemuConsole *con)
|
bool dpy_ui_info_supported(const QemuConsole *con)
|
||||||
{
|
{
|
||||||
if (con == NULL) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
if (con == NULL) {
|
if (con == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -819,19 +769,11 @@ const QemuUIInfo *dpy_get_ui_info(const QemuConsole *con)
|
|||||||
{
|
{
|
||||||
assert(dpy_ui_info_supported(con));
|
assert(dpy_ui_info_supported(con));
|
||||||
|
|
||||||
if (con == NULL) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
|
|
||||||
return &con->ui_info;
|
return &con->ui_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info, bool delay)
|
int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info, bool delay)
|
||||||
{
|
{
|
||||||
if (con == NULL) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!dpy_ui_info_supported(con)) {
|
if (!dpy_ui_info_supported(con)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -870,7 +812,7 @@ void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h)
|
|||||||
}
|
}
|
||||||
dpy_gfx_update_texture(con, con->surface, x, y, w, h);
|
dpy_gfx_update_texture(con, con->surface, x, y, w, h);
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_gfx_update) {
|
if (dcl->ops->dpy_gfx_update) {
|
||||||
@ -916,7 +858,7 @@ void dpy_gfx_replace_surface(QemuConsole *con,
|
|||||||
con->surface = new_surface;
|
con->surface = new_surface;
|
||||||
dpy_gfx_create_texture(con, new_surface);
|
dpy_gfx_create_texture(con, new_surface);
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
displaychangelistener_gfx_switch(dcl, new_surface, surface ? FALSE : TRUE);
|
displaychangelistener_gfx_switch(dcl, new_surface, surface ? FALSE : TRUE);
|
||||||
@ -970,7 +912,7 @@ void dpy_text_cursor(QemuConsole *con, int x, int y)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_text_cursor) {
|
if (dcl->ops->dpy_text_cursor) {
|
||||||
@ -988,7 +930,7 @@ void dpy_text_update(QemuConsole *con, int x, int y, int w, int h)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_text_update) {
|
if (dcl->ops->dpy_text_update) {
|
||||||
@ -1006,7 +948,7 @@ void dpy_text_resize(QemuConsole *con, int w, int h)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_text_resize) {
|
if (dcl->ops->dpy_text_resize) {
|
||||||
@ -1028,7 +970,7 @@ void dpy_mouse_set(QemuConsole *c, int x, int y, int on)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (c != (dcl->con ? dcl->con : active_console)) {
|
if (c != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_mouse_set) {
|
if (dcl->ops->dpy_mouse_set) {
|
||||||
@ -1049,7 +991,7 @@ void dpy_cursor_define(QemuConsole *c, QEMUCursor *cursor)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (c != (dcl->con ? dcl->con : active_console)) {
|
if (c != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_cursor_define) {
|
if (dcl->ops->dpy_cursor_define) {
|
||||||
@ -1099,7 +1041,7 @@ void dpy_gl_scanout_disable(QemuConsole *con)
|
|||||||
con->scanout.kind = SCANOUT_NONE;
|
con->scanout.kind = SCANOUT_NONE;
|
||||||
}
|
}
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_gl_scanout_disable) {
|
if (dcl->ops->dpy_gl_scanout_disable) {
|
||||||
@ -1126,7 +1068,7 @@ void dpy_gl_scanout_texture(QemuConsole *con,
|
|||||||
x, y, width, height, d3d_tex2d,
|
x, y, width, height, d3d_tex2d,
|
||||||
};
|
};
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_gl_scanout_texture) {
|
if (dcl->ops->dpy_gl_scanout_texture) {
|
||||||
@ -1148,7 +1090,7 @@ void dpy_gl_scanout_dmabuf(QemuConsole *con,
|
|||||||
con->scanout.kind = SCANOUT_DMABUF;
|
con->scanout.kind = SCANOUT_DMABUF;
|
||||||
con->scanout.dmabuf = dmabuf;
|
con->scanout.dmabuf = dmabuf;
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_gl_scanout_dmabuf) {
|
if (dcl->ops->dpy_gl_scanout_dmabuf) {
|
||||||
@ -1164,7 +1106,7 @@ void dpy_gl_cursor_dmabuf(QemuConsole *con, QemuDmaBuf *dmabuf,
|
|||||||
DisplayChangeListener *dcl;
|
DisplayChangeListener *dcl;
|
||||||
|
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_gl_cursor_dmabuf) {
|
if (dcl->ops->dpy_gl_cursor_dmabuf) {
|
||||||
@ -1181,7 +1123,7 @@ void dpy_gl_cursor_position(QemuConsole *con,
|
|||||||
DisplayChangeListener *dcl;
|
DisplayChangeListener *dcl;
|
||||||
|
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_gl_cursor_position) {
|
if (dcl->ops->dpy_gl_cursor_position) {
|
||||||
@ -1197,7 +1139,7 @@ void dpy_gl_release_dmabuf(QemuConsole *con,
|
|||||||
DisplayChangeListener *dcl;
|
DisplayChangeListener *dcl;
|
||||||
|
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_gl_release_dmabuf) {
|
if (dcl->ops->dpy_gl_release_dmabuf) {
|
||||||
@ -1216,7 +1158,7 @@ void dpy_gl_update(QemuConsole *con,
|
|||||||
|
|
||||||
graphic_hw_gl_block(con, true);
|
graphic_hw_gl_block(con, true);
|
||||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
if (con != dcl->con) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dcl->ops->dpy_gl_update) {
|
if (dcl->ops->dpy_gl_update) {
|
||||||
@ -1415,30 +1357,21 @@ static QemuConsole *qemu_graphic_console_lookup_unused(void)
|
|||||||
|
|
||||||
QEMUCursor *qemu_console_get_cursor(QemuConsole *con)
|
QEMUCursor *qemu_console_get_cursor(QemuConsole *con)
|
||||||
{
|
{
|
||||||
if (con == NULL) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
return QEMU_IS_GRAPHIC_CONSOLE(con) ? QEMU_GRAPHIC_CONSOLE(con)->cursor : NULL;
|
return QEMU_IS_GRAPHIC_CONSOLE(con) ? QEMU_GRAPHIC_CONSOLE(con)->cursor : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool qemu_console_is_visible(QemuConsole *con)
|
bool qemu_console_is_visible(QemuConsole *con)
|
||||||
{
|
{
|
||||||
return (con == active_console) || (con->dcls > 0);
|
return con->dcls > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool qemu_console_is_graphic(QemuConsole *con)
|
bool qemu_console_is_graphic(QemuConsole *con)
|
||||||
{
|
{
|
||||||
if (con == NULL) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
return con && QEMU_IS_GRAPHIC_CONSOLE(con);
|
return con && QEMU_IS_GRAPHIC_CONSOLE(con);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool qemu_console_is_fixedsize(QemuConsole *con)
|
bool qemu_console_is_fixedsize(QemuConsole *con)
|
||||||
{
|
{
|
||||||
if (con == NULL) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
return con && (QEMU_IS_GRAPHIC_CONSOLE(con) || QEMU_IS_FIXED_TEXT_CONSOLE(con));
|
return con && (QEMU_IS_GRAPHIC_CONSOLE(con) || QEMU_IS_FIXED_TEXT_CONSOLE(con));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1505,17 +1438,11 @@ char *qemu_console_get_label(QemuConsole *con)
|
|||||||
|
|
||||||
int qemu_console_get_index(QemuConsole *con)
|
int qemu_console_get_index(QemuConsole *con)
|
||||||
{
|
{
|
||||||
if (con == NULL) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
return con ? con->index : -1;
|
return con ? con->index : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t qemu_console_get_head(QemuConsole *con)
|
uint32_t qemu_console_get_head(QemuConsole *con)
|
||||||
{
|
{
|
||||||
if (con == NULL) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
if (con == NULL) {
|
if (con == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1527,9 +1454,6 @@ uint32_t qemu_console_get_head(QemuConsole *con)
|
|||||||
|
|
||||||
int qemu_console_get_width(QemuConsole *con, int fallback)
|
int qemu_console_get_width(QemuConsole *con, int fallback)
|
||||||
{
|
{
|
||||||
if (con == NULL) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
if (con == NULL) {
|
if (con == NULL) {
|
||||||
return fallback;
|
return fallback;
|
||||||
}
|
}
|
||||||
@ -1547,9 +1471,6 @@ int qemu_console_get_width(QemuConsole *con, int fallback)
|
|||||||
|
|
||||||
int qemu_console_get_height(QemuConsole *con, int fallback)
|
int qemu_console_get_height(QemuConsole *con, int fallback)
|
||||||
{
|
{
|
||||||
if (con == NULL) {
|
|
||||||
con = active_console;
|
|
||||||
}
|
|
||||||
if (con == NULL) {
|
if (con == NULL) {
|
||||||
return fallback;
|
return fallback;
|
||||||
}
|
}
|
||||||
|
46
ui/curses.c
46
ui/curses.c
@ -98,7 +98,7 @@ static void curses_update(DisplayChangeListener *dcl,
|
|||||||
|
|
||||||
static void curses_calc_pad(void)
|
static void curses_calc_pad(void)
|
||||||
{
|
{
|
||||||
if (qemu_console_is_fixedsize(NULL)) {
|
if (qemu_console_is_fixedsize(dcl->con)) {
|
||||||
width = gwidth;
|
width = gwidth;
|
||||||
height = gheight;
|
height = gheight;
|
||||||
} else {
|
} else {
|
||||||
@ -201,7 +201,7 @@ static void curses_cursor_position(DisplayChangeListener *dcl,
|
|||||||
curs_set(1);
|
curs_set(1);
|
||||||
/* it seems that curs_set(1) must always be called before
|
/* it seems that curs_set(1) must always be called before
|
||||||
* curs_set(2) for the latter to have effect */
|
* curs_set(2) for the latter to have effect */
|
||||||
if (!qemu_console_is_graphic(NULL)) {
|
if (!qemu_console_is_graphic(dcl->con)) {
|
||||||
curs_set(2);
|
curs_set(2);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@ -274,11 +274,11 @@ static void curses_refresh(DisplayChangeListener *dcl)
|
|||||||
clear();
|
clear();
|
||||||
refresh();
|
refresh();
|
||||||
curses_calc_pad();
|
curses_calc_pad();
|
||||||
graphic_hw_invalidate(NULL);
|
graphic_hw_invalidate(dcl->con);
|
||||||
invalidate = 0;
|
invalidate = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
graphic_hw_text_update(NULL, screen);
|
graphic_hw_text_update(dcl->con, screen);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
/* while there are any pending key strokes to process */
|
/* while there are any pending key strokes to process */
|
||||||
@ -318,11 +318,16 @@ static void curses_refresh(DisplayChangeListener *dcl)
|
|||||||
/* process keys reserved for qemu */
|
/* process keys reserved for qemu */
|
||||||
if (keycode >= QEMU_KEY_CONSOLE0 &&
|
if (keycode >= QEMU_KEY_CONSOLE0 &&
|
||||||
keycode < QEMU_KEY_CONSOLE0 + 9) {
|
keycode < QEMU_KEY_CONSOLE0 + 9) {
|
||||||
erase();
|
QemuConsole *con = qemu_console_lookup_by_index(keycode - QEMU_KEY_CONSOLE0);
|
||||||
wnoutrefresh(stdscr);
|
if (con) {
|
||||||
console_select(keycode - QEMU_KEY_CONSOLE0);
|
erase();
|
||||||
|
wnoutrefresh(stdscr);
|
||||||
|
unregister_displaychangelistener(dcl);
|
||||||
|
dcl->con = con;
|
||||||
|
register_displaychangelistener(dcl);
|
||||||
|
|
||||||
invalidate = 1;
|
invalidate = 1;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -354,45 +359,45 @@ static void curses_refresh(DisplayChangeListener *dcl)
|
|||||||
if (keycode == -1)
|
if (keycode == -1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (qemu_console_is_graphic(NULL)) {
|
if (qemu_console_is_graphic(dcl->con)) {
|
||||||
/* since terminals don't know about key press and release
|
/* since terminals don't know about key press and release
|
||||||
* events, we need to emit both for each key received */
|
* events, we need to emit both for each key received */
|
||||||
if (keycode & SHIFT) {
|
if (keycode & SHIFT) {
|
||||||
qemu_input_event_send_key_number(NULL, SHIFT_CODE, true);
|
qemu_input_event_send_key_number(dcl->con, SHIFT_CODE, true);
|
||||||
qemu_input_event_send_key_delay(0);
|
qemu_input_event_send_key_delay(0);
|
||||||
}
|
}
|
||||||
if (keycode & CNTRL) {
|
if (keycode & CNTRL) {
|
||||||
qemu_input_event_send_key_number(NULL, CNTRL_CODE, true);
|
qemu_input_event_send_key_number(dcl->con, CNTRL_CODE, true);
|
||||||
qemu_input_event_send_key_delay(0);
|
qemu_input_event_send_key_delay(0);
|
||||||
}
|
}
|
||||||
if (keycode & ALT) {
|
if (keycode & ALT) {
|
||||||
qemu_input_event_send_key_number(NULL, ALT_CODE, true);
|
qemu_input_event_send_key_number(dcl->con, ALT_CODE, true);
|
||||||
qemu_input_event_send_key_delay(0);
|
qemu_input_event_send_key_delay(0);
|
||||||
}
|
}
|
||||||
if (keycode & ALTGR) {
|
if (keycode & ALTGR) {
|
||||||
qemu_input_event_send_key_number(NULL, GREY | ALT_CODE, true);
|
qemu_input_event_send_key_number(dcl->con, GREY | ALT_CODE, true);
|
||||||
qemu_input_event_send_key_delay(0);
|
qemu_input_event_send_key_delay(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_input_event_send_key_number(NULL, keycode & KEY_MASK, true);
|
qemu_input_event_send_key_number(dcl->con, keycode & KEY_MASK, true);
|
||||||
qemu_input_event_send_key_delay(0);
|
qemu_input_event_send_key_delay(0);
|
||||||
qemu_input_event_send_key_number(NULL, keycode & KEY_MASK, false);
|
qemu_input_event_send_key_number(dcl->con, keycode & KEY_MASK, false);
|
||||||
qemu_input_event_send_key_delay(0);
|
qemu_input_event_send_key_delay(0);
|
||||||
|
|
||||||
if (keycode & ALTGR) {
|
if (keycode & ALTGR) {
|
||||||
qemu_input_event_send_key_number(NULL, GREY | ALT_CODE, false);
|
qemu_input_event_send_key_number(dcl->con, GREY | ALT_CODE, false);
|
||||||
qemu_input_event_send_key_delay(0);
|
qemu_input_event_send_key_delay(0);
|
||||||
}
|
}
|
||||||
if (keycode & ALT) {
|
if (keycode & ALT) {
|
||||||
qemu_input_event_send_key_number(NULL, ALT_CODE, false);
|
qemu_input_event_send_key_number(dcl->con, ALT_CODE, false);
|
||||||
qemu_input_event_send_key_delay(0);
|
qemu_input_event_send_key_delay(0);
|
||||||
}
|
}
|
||||||
if (keycode & CNTRL) {
|
if (keycode & CNTRL) {
|
||||||
qemu_input_event_send_key_number(NULL, CNTRL_CODE, false);
|
qemu_input_event_send_key_number(dcl->con, CNTRL_CODE, false);
|
||||||
qemu_input_event_send_key_delay(0);
|
qemu_input_event_send_key_delay(0);
|
||||||
}
|
}
|
||||||
if (keycode & SHIFT) {
|
if (keycode & SHIFT) {
|
||||||
qemu_input_event_send_key_number(NULL, SHIFT_CODE, false);
|
qemu_input_event_send_key_number(dcl->con, SHIFT_CODE, false);
|
||||||
qemu_input_event_send_key_delay(0);
|
qemu_input_event_send_key_delay(0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -400,7 +405,7 @@ static void curses_refresh(DisplayChangeListener *dcl)
|
|||||||
if (keysym == -1)
|
if (keysym == -1)
|
||||||
keysym = chr;
|
keysym = chr;
|
||||||
|
|
||||||
qemu_text_console_put_keysym(NULL, keysym);
|
qemu_text_console_put_keysym(QEMU_TEXT_CONSOLE(dcl->con), keysym);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -798,6 +803,7 @@ static void curses_display_init(DisplayState *ds, DisplayOptions *opts)
|
|||||||
curses_winch_init();
|
curses_winch_init();
|
||||||
|
|
||||||
dcl = g_new0(DisplayChangeListener, 1);
|
dcl = g_new0(DisplayChangeListener, 1);
|
||||||
|
dcl->con = qemu_console_lookup_default();
|
||||||
dcl->ops = &dcl_ops;
|
dcl->ops = &dcl_ops;
|
||||||
register_displaychangelistener(dcl);
|
register_displaychangelistener(dcl);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user