console: add qemu_console_is_*

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
master
Gerd Hoffmann 2013-03-14 14:27:08 +01:00
parent dea1b0bdd8
commit 81c0d5a662
5 changed files with 56 additions and 46 deletions

View File

@ -282,8 +282,10 @@ void graphic_hw_update(QemuConsole *con);
void graphic_hw_invalidate(QemuConsole *con); 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);
int is_graphic_console(void); bool qemu_console_is_visible(QemuConsole *con);
int is_fixedsize_console(void); bool qemu_console_is_graphic(QemuConsole *con);
bool qemu_console_is_fixedsize(QemuConsole *con);
void text_consoles_set_display(DisplayState *ds); void text_consoles_set_display(DisplayState *ds);
void console_select(unsigned int index); void console_select(unsigned int index);
void console_color_init(DisplayState *ds); void console_color_init(DisplayState *ds);

View File

@ -515,7 +515,7 @@ static void update_xy(QemuConsole *s, int x, int y)
TextCell *c; TextCell *c;
int y1, y2; int y1, y2;
if (s != active_console) { if (!qemu_console_is_visible(s)) {
return; return;
} }
@ -543,7 +543,7 @@ static void console_show_cursor(QemuConsole *s, int show)
int y, y1; int y, y1;
int x = s->x; int x = s->x;
if (s != active_console) { if (!qemu_console_is_visible(s)) {
return; return;
} }
@ -579,8 +579,9 @@ static void console_refresh(QemuConsole *s)
TextCell *c; TextCell *c;
int x, y, y1; int x, y, y1;
if (s != active_console) if (!qemu_console_is_visible(s)) {
return; return;
}
if (s->ds->have_text) { if (s->ds->have_text) {
s->text_x[0] = 0; s->text_x[0] = 0;
@ -611,15 +612,10 @@ static void console_refresh(QemuConsole *s)
} }
} }
static void console_scroll(int ydelta) static void console_scroll(QemuConsole *s, int ydelta)
{ {
QemuConsole *s;
int i, y1; int i, y1;
s = active_console;
if (!s || (s->console_type == GRAPHIC_CONSOLE))
return;
if (ydelta > 0) { if (ydelta > 0) {
for(i = 0; i < ydelta; i++) { for(i = 0; i < ydelta; i++) {
if (s->y_displayed == s->y_base) if (s->y_displayed == s->y_base)
@ -669,7 +665,7 @@ static void console_put_lf(QemuConsole *s)
c->t_attrib = s->t_attrib_default; c->t_attrib = s->t_attrib_default;
c++; c++;
} }
if (s == active_console && s->y_displayed == s->y_base) { if (qemu_console_is_visible(s) && s->y_displayed == s->y_base) {
if (s->ds->have_text) { if (s->ds->have_text) {
s->text_x[0] = 0; s->text_x[0] = 0;
s->text_y[0] = 0; s->text_y[0] = 0;
@ -1112,16 +1108,16 @@ void kbd_put_keysym(int keysym)
switch(keysym) { switch(keysym) {
case QEMU_KEY_CTRL_UP: case QEMU_KEY_CTRL_UP:
console_scroll(-1); console_scroll(s, -1);
break; break;
case QEMU_KEY_CTRL_DOWN: case QEMU_KEY_CTRL_DOWN:
console_scroll(1); console_scroll(s, 1);
break; break;
case QEMU_KEY_CTRL_PAGEUP: case QEMU_KEY_CTRL_PAGEUP:
console_scroll(-10); console_scroll(s, -10);
break; break;
case QEMU_KEY_CTRL_PAGEDOWN: case QEMU_KEY_CTRL_PAGEDOWN:
console_scroll(10); console_scroll(s, 10);
break; break;
default: default:
/* convert the QEMU keysym to VT100 key string */ /* convert the QEMU keysym to VT100 key string */
@ -1338,7 +1334,7 @@ void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h)
w = MIN(w, width - x); w = MIN(w, width - x);
h = MIN(h, height - y); h = MIN(h, height - y);
if (con != active_console) { if (!qemu_console_is_visible(con)) {
return; return;
} }
QLIST_FOREACH(dcl, &s->listeners, next) { QLIST_FOREACH(dcl, &s->listeners, next) {
@ -1367,7 +1363,7 @@ void dpy_gfx_replace_surface(QemuConsole *con,
DisplaySurface *old_surface = con->surface; DisplaySurface *old_surface = con->surface;
con->surface = surface; con->surface = surface;
if (con == active_console) { if (qemu_console_is_visible(con)) {
dpy_gfx_switch_surface(s, surface); dpy_gfx_switch_surface(s, surface);
} }
qemu_free_displaysurface(old_surface); qemu_free_displaysurface(old_surface);
@ -1389,7 +1385,7 @@ void dpy_gfx_copy(QemuConsole *con, int src_x, int src_y,
DisplayState *s = con->ds; DisplayState *s = con->ds;
struct DisplayChangeListener *dcl; struct DisplayChangeListener *dcl;
if (con != active_console) { if (!qemu_console_is_visible(con)) {
return; return;
} }
QLIST_FOREACH(dcl, &s->listeners, next) { QLIST_FOREACH(dcl, &s->listeners, next) {
@ -1406,7 +1402,7 @@ void dpy_text_cursor(QemuConsole *con, int x, int y)
DisplayState *s = con->ds; DisplayState *s = con->ds;
struct DisplayChangeListener *dcl; struct DisplayChangeListener *dcl;
if (con != active_console) { if (!qemu_console_is_visible(con)) {
return; return;
} }
QLIST_FOREACH(dcl, &s->listeners, next) { QLIST_FOREACH(dcl, &s->listeners, next) {
@ -1421,7 +1417,7 @@ void dpy_text_update(QemuConsole *con, int x, int y, int w, int h)
DisplayState *s = con->ds; DisplayState *s = con->ds;
struct DisplayChangeListener *dcl; struct DisplayChangeListener *dcl;
if (con != active_console) { if (!qemu_console_is_visible(con)) {
return; return;
} }
QLIST_FOREACH(dcl, &s->listeners, next) { QLIST_FOREACH(dcl, &s->listeners, next) {
@ -1436,7 +1432,7 @@ void dpy_text_resize(QemuConsole *con, int w, int h)
DisplayState *s = con->ds; DisplayState *s = con->ds;
struct DisplayChangeListener *dcl; struct DisplayChangeListener *dcl;
if (con != active_console) { if (!qemu_console_is_visible(con)) {
return; return;
} }
QLIST_FOREACH(dcl, &s->listeners, next) { QLIST_FOREACH(dcl, &s->listeners, next) {
@ -1451,7 +1447,7 @@ void dpy_mouse_set(QemuConsole *con, int x, int y, int on)
DisplayState *s = con->ds; DisplayState *s = con->ds;
struct DisplayChangeListener *dcl; struct DisplayChangeListener *dcl;
if (con != active_console) { if (!qemu_console_is_visible(con)) {
return; return;
} }
QLIST_FOREACH(dcl, &s->listeners, next) { QLIST_FOREACH(dcl, &s->listeners, next) {
@ -1466,7 +1462,7 @@ void dpy_cursor_define(QemuConsole *con, QEMUCursor *cursor)
DisplayState *s = con->ds; DisplayState *s = con->ds;
struct DisplayChangeListener *dcl; struct DisplayChangeListener *dcl;
if (con != active_console) { if (!qemu_console_is_visible(con)) {
return; return;
} }
QLIST_FOREACH(dcl, &s->listeners, next) { QLIST_FOREACH(dcl, &s->listeners, next) {
@ -1540,14 +1536,25 @@ QemuConsole *graphic_console_init(const GraphicHwOps *hw_ops,
return s; return s;
} }
int is_graphic_console(void) bool qemu_console_is_visible(QemuConsole *con)
{ {
return active_console && active_console->console_type == GRAPHIC_CONSOLE; return con == active_console;
} }
int is_fixedsize_console(void) bool qemu_console_is_graphic(QemuConsole *con)
{ {
return active_console && active_console->console_type != TEXT_CONSOLE; if (con == NULL) {
con = active_console;
}
return con && (con->console_type == GRAPHIC_CONSOLE);
}
bool qemu_console_is_fixedsize(QemuConsole *con)
{
if (con == NULL) {
con = active_console;
}
return con && (con->console_type != TEXT_CONSOLE);
} }
static void text_console_set_echo(CharDriverState *chr, bool echo) static void text_console_set_echo(CharDriverState *chr, bool echo)

View File

@ -56,7 +56,7 @@ static void curses_update(DisplayChangeListener *dcl,
static void curses_calc_pad(void) static void curses_calc_pad(void)
{ {
if (is_fixedsize_console()) { if (qemu_console_is_fixedsize(NULL)) {
width = gwidth; width = gwidth;
height = gheight; height = gheight;
} else { } else {
@ -143,8 +143,9 @@ 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 (!is_graphic_console()) if (!qemu_console_is_graphic(NULL)) {
curs_set(2); curs_set(2);
}
return; return;
} }
} }
@ -252,7 +253,7 @@ static void curses_refresh(DisplayChangeListener *dcl)
if (keycode == -1) if (keycode == -1)
continue; continue;
if (is_graphic_console()) { if (qemu_console_is_graphic(NULL)) {
/* 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)

View File

@ -358,7 +358,7 @@ static void sdl_show_cursor(void)
if (!cursor_hide) if (!cursor_hide)
return; return;
if (!kbd_mouse_is_absolute() || !is_graphic_console()) { if (!kbd_mouse_is_absolute() || !qemu_console_is_graphic(NULL)) {
SDL_ShowCursor(1); SDL_ShowCursor(1);
if (guest_cursor && if (guest_cursor &&
(gui_grab || kbd_mouse_is_absolute() || absolute_enabled)) (gui_grab || kbd_mouse_is_absolute() || absolute_enabled))
@ -413,7 +413,7 @@ static void sdl_mouse_mode_change(Notifier *notify, void *data)
if (kbd_mouse_is_absolute()) { if (kbd_mouse_is_absolute()) {
if (!absolute_enabled) { if (!absolute_enabled) {
absolute_enabled = 1; absolute_enabled = 1;
if (is_graphic_console()) { if (qemu_console_is_graphic(NULL)) {
absolute_mouse_grab(); absolute_mouse_grab();
} }
} }
@ -488,7 +488,7 @@ static void toggle_full_screen(void)
} else { } else {
do_sdl_resize(width, height, 0); do_sdl_resize(width, height, 0);
} }
if (!gui_saved_grab || !is_graphic_console()) { if (!gui_saved_grab || !qemu_console_is_graphic(NULL)) {
sdl_grab_end(); sdl_grab_end();
} }
} }
@ -535,7 +535,7 @@ static void handle_keydown(SDL_Event *ev)
if (gui_fullscreen) { if (gui_fullscreen) {
break; break;
} }
if (!is_graphic_console()) { if (!qemu_console_is_graphic(NULL)) {
/* release grab if going to a text console */ /* release grab if going to a text console */
if (gui_grab) { if (gui_grab) {
sdl_grab_end(); sdl_grab_end();
@ -563,7 +563,7 @@ static void handle_keydown(SDL_Event *ev)
default: default:
break; break;
} }
} else if (!is_graphic_console()) { } else if (!qemu_console_is_graphic(NULL)) {
int keysym = 0; int keysym = 0;
if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) { if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) {
@ -637,7 +637,7 @@ static void handle_keydown(SDL_Event *ev)
kbd_put_keysym(ev->key.keysym.unicode); kbd_put_keysym(ev->key.keysym.unicode);
} }
} }
if (is_graphic_console() && !gui_keysym) { if (qemu_console_is_graphic(NULL) && !gui_keysym) {
sdl_process_key(&ev->key); sdl_process_key(&ev->key);
} }
} }
@ -656,7 +656,7 @@ static void handle_keyup(SDL_Event *ev)
if (gui_keysym == 0) { if (gui_keysym == 0) {
/* exit/enter grab if pressing Ctrl-Alt */ /* exit/enter grab if pressing Ctrl-Alt */
if (!gui_grab) { if (!gui_grab) {
if (is_graphic_console()) { if (qemu_console_is_graphic(NULL)) {
sdl_grab_start(); sdl_grab_start();
} }
} else if (!gui_fullscreen) { } else if (!gui_fullscreen) {
@ -669,7 +669,7 @@ static void handle_keyup(SDL_Event *ev)
} }
gui_keysym = 0; gui_keysym = 0;
} }
if (is_graphic_console() && !gui_keysym) { if (qemu_console_is_graphic(NULL) && !gui_keysym) {
sdl_process_key(&ev->key); sdl_process_key(&ev->key);
} }
} }
@ -678,7 +678,7 @@ static void handle_mousemotion(SDL_Event *ev)
{ {
int max_x, max_y; int max_x, max_y;
if (is_graphic_console() && if (qemu_console_is_graphic(NULL) &&
(kbd_mouse_is_absolute() || absolute_enabled)) { (kbd_mouse_is_absolute() || absolute_enabled)) {
max_x = real_screen->w - 1; max_x = real_screen->w - 1;
max_y = real_screen->h - 1; max_y = real_screen->h - 1;
@ -704,7 +704,7 @@ static void handle_mousebutton(SDL_Event *ev)
SDL_MouseButtonEvent *bev; SDL_MouseButtonEvent *bev;
int dz; int dz;
if (!is_graphic_console()) { if (!qemu_console_is_graphic(NULL)) {
return; return;
} }
@ -744,7 +744,7 @@ static void handle_activation(SDL_Event *ev)
sdl_grab_end(); sdl_grab_end();
} }
#endif #endif
if (!gui_grab && ev->active.gain && is_graphic_console() && if (!gui_grab && ev->active.gain && qemu_console_is_graphic(NULL) &&
(kbd_mouse_is_absolute() || absolute_enabled)) { (kbd_mouse_is_absolute() || absolute_enabled)) {
absolute_mouse_grab(); absolute_mouse_grab();
} }
@ -771,7 +771,7 @@ static void sdl_refresh(DisplayChangeListener *dcl)
} }
graphic_hw_update(NULL); graphic_hw_update(NULL);
SDL_EnableUNICODE(!is_graphic_console()); SDL_EnableUNICODE(!qemu_console_is_graphic(NULL));
while (SDL_PollEvent(ev)) { while (SDL_PollEvent(ev)) {
switch (ev->type) { switch (ev->type) {

View File

@ -1609,7 +1609,7 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
} }
} }
if (is_graphic_console()) { if (qemu_console_is_graphic(NULL)) {
if (keycode & SCANCODE_GREY) if (keycode & SCANCODE_GREY)
kbd_put_keycode(SCANCODE_EMUL0); kbd_put_keycode(SCANCODE_EMUL0);
if (down) if (down)
@ -1728,7 +1728,7 @@ static void vnc_release_modifiers(VncState *vs)
}; };
int i, keycode; int i, keycode;
if (!is_graphic_console()) { if (!qemu_console_is_graphic(NULL)) {
return; return;
} }
for (i = 0; i < ARRAY_SIZE(keycodes); i++) { for (i = 0; i < ARRAY_SIZE(keycodes); i++) {
@ -1748,7 +1748,7 @@ static void key_event(VncState *vs, int down, uint32_t sym)
int keycode; int keycode;
int lsym = sym; int lsym = sym;
if (lsym >= 'A' && lsym <= 'Z' && is_graphic_console()) { if (lsym >= 'A' && lsym <= 'Z' && qemu_console_is_graphic(NULL)) {
lsym = lsym - 'A' + 'a'; lsym = lsym - 'A' + 'a';
} }