/* The guest OS has started discussing with us, finish initializing BrlAPI */ static int baum_deferred_init(BaumDriverState *baum) { int tty = BRLAPI_TTY_DEFAULT; QemuConsole *con; if (baum->deferred_init) { return 1; } if (brlapi__getDisplaySize(baum->brlapi, &baum->x, &baum->y) == -1) { brlapi_perror("baum: brlapi__getDisplaySize"); return 0; } con = qemu_console_lookup_by_index(0); if (con && qemu_console_is_graphic(con)) { tty = qemu_console_get_window_id(con); if (tty == -1) tty = BRLAPI_TTY_DEFAULT; } if (brlapi__enterTtyMode(baum->brlapi, tty, NULL) == -1) { brlapi_perror("baum: brlapi__enterTtyMode"); return 0; } baum->deferred_init = 1; return 1; }
static QemuConsole* find_graphic_console() { // find the first graphic console (Android emulator has only one usually) for (int i = 0;; i++) { QemuConsole* const c = qemu_console_lookup_by_index(i); if (!c) { break; } if (qemu_console_is_graphic(c)) { return c; } } return NULL; }
static void egl_headless_init(DisplayState *ds, DisplayOptions *opts) { QemuConsole *con; egl_dpy *edpy; int idx; if (egl_rendernode_init(NULL) < 0) { error_report("egl: render node init failed"); exit(1); } for (idx = 0;; idx++) { con = qemu_console_lookup_by_index(idx); if (!con || !qemu_console_is_graphic(con)) { break; } edpy = g_new0(egl_dpy, 1); edpy->dcl.con = con; edpy->dcl.ops = &egl_ops; edpy->gls = qemu_gl_init_shader(); register_displaychangelistener(&edpy->dcl); } }
/* * Send a mouse event from the client to the guest OS * * The QEMU mouse can be in either relative, or absolute mode. * Movement is sent separately from button state, which has to * be encoded as virtual key events. We also don't actually get * given any button up/down events, so have to track changes in * the button state. */ static void xenfb_mouse_event(DeviceState *dev, QemuConsole *src, InputEvent *evt) { struct XenInput *xenfb = (struct XenInput *)dev; InputBtnEvent *btn; InputMoveEvent *move; QemuConsole *con; DisplaySurface *surface; int scale; switch (evt->type) { case INPUT_EVENT_KIND_BTN: btn = evt->u.btn.data; switch (btn->button) { case INPUT_BUTTON_LEFT: xenfb_send_key(xenfb, btn->down, BTN_LEFT); break; case INPUT_BUTTON_RIGHT: xenfb_send_key(xenfb, btn->down, BTN_LEFT + 1); break; case INPUT_BUTTON_MIDDLE: xenfb_send_key(xenfb, btn->down, BTN_LEFT + 2); break; case INPUT_BUTTON_WHEEL_UP: if (btn->down) { xenfb->wheel--; } break; case INPUT_BUTTON_WHEEL_DOWN: if (btn->down) { xenfb->wheel++; } break; default: break; } break; case INPUT_EVENT_KIND_ABS: move = evt->u.abs.data; if (xenfb->raw_pointer_wanted) { xenfb->axis[move->axis] = move->value; } else { con = qemu_console_lookup_by_index(0); if (!con) { xen_pv_printf(&xenfb->c.xendev, 0, "No QEMU console available"); return; } surface = qemu_console_surface(con); switch (move->axis) { case INPUT_AXIS_X: scale = surface_width(surface) - 1; break; case INPUT_AXIS_Y: scale = surface_height(surface) - 1; break; default: scale = 0x8000; break; } xenfb->axis[move->axis] = move->value * scale / 0x7fff; } break; case INPUT_EVENT_KIND_REL: move = evt->u.rel.data; xenfb->axis[move->axis] += move->value; break; default: break; } }