aboutsummaryrefslogtreecommitdiffstats
path: root/console.c
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@android.com>2011-05-11 01:34:40 +0200
committerDavid 'Digit' Turner <digit@android.com>2011-06-01 17:08:19 +0200
commit3b2846ad9f156e62574a0abc5ec489f8f13f1121 (patch)
tree5b824f60deb9697c002cd4b957ee12b6a0ecea97 /console.c
parentf645f7d6fd841e39524e5df8c1a7fd8347f92ac1 (diff)
downloadexternal_qemu-3b2846ad9f156e62574a0abc5ec489f8f13f1121.zip
external_qemu-3b2846ad9f156e62574a0abc5ec489f8f13f1121.tar.gz
external_qemu-3b2846ad9f156e62574a0abc5ec489f8f13f1121.tar.bz2
qemu-char-android.c: rename to qemu-char.c
+ convert to QemuOpts* initialization functions. Change-Id: I5a245ed2de068af49fdc92de8e3e834d0f49aa27
Diffstat (limited to 'console.c')
-rw-r--r--console.c121
1 files changed, 66 insertions, 55 deletions
diff --git a/console.c b/console.c
index 18d1dc2..a94aecd 100644
--- a/console.c
+++ b/console.c
@@ -32,6 +32,39 @@
#define QEMU_RGBA(r, g, b, a) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
#define QEMU_RGB(r, g, b) QEMU_RGBA(r, g, b, 0xff)
+#ifdef CONFIG_SKINNING
+// Skinning overwrites these functions to put the skin in between
+DisplayState *qemu_graphic_console_init(vga_hw_update_ptr update,
+ vga_hw_invalidate_ptr invalidate,
+ vga_hw_screen_dump_ptr screen_dump,
+ vga_hw_text_update_ptr text_update,
+ void *opaque);
+#undef graphic_console_init
+#define graphic_console_init qemu_graphic_console_init
+
+void original_qemu_console_resize(DisplayState *ds, int width, int height);
+#undef qemu_console_resize
+#define qemu_console_resize original_qemu_console_resize
+#endif
+
+int multitouch_enabled = 0;
+static QEMUDisplayCloseCallback *qemu_display_close_callback = NULL;
+static void *qemu_display_close_callback_opaque = NULL;
+
+void qemu_set_display_close_handler(QEMUDisplayCloseCallback *cb, void *opaque)
+{
+ qemu_display_close_callback = cb;
+ qemu_display_close_callback_opaque = opaque;
+}
+
+int qemu_run_display_close_handler(void)
+{
+ if (qemu_display_close_callback != NULL) {
+ return qemu_display_close_callback(qemu_display_close_callback_opaque);
+ }
+ return 1;
+}
+
typedef struct TextAttributes {
uint8_t fgcol:4;
uint8_t bgcol:4;
@@ -236,8 +269,8 @@ static unsigned int vga_get_color(DisplayState *ds, unsigned int rgba)
return color;
}
-static void vga_fill_rect (DisplayState *ds,
- int posx, int posy, int width, int height, uint32_t color)
+void vga_fill_rect(DisplayState *ds, int posx, int posy,
+ int width, int height, uint32_t color)
{
uint8_t *d, *d1;
int x, y, bpp;
@@ -1287,38 +1320,40 @@ static DisplaySurface* defaultallocator_create_displaysurface(int width, int hei
{
DisplaySurface *surface = (DisplaySurface*) qemu_mallocz(sizeof(DisplaySurface));
- surface->width = width;
- surface->height = height;
- surface->linesize = width * 4;
- surface->pf = qemu_default_pixelformat(32);
-#ifdef HOST_WORDS_BIGENDIAN
- surface->flags = QEMU_ALLOCATED_FLAG | QEMU_BIG_ENDIAN_FLAG;
-#else
- surface->flags = QEMU_ALLOCATED_FLAG;
-#endif
- surface->data = (uint8_t*) qemu_mallocz(surface->linesize * surface->height);
-
+ int linesize = width * 4;
+ qemu_alloc_display(surface, width, height, linesize,
+ qemu_default_pixelformat(32), 0);
return surface;
}
static DisplaySurface* defaultallocator_resize_displaysurface(DisplaySurface *surface,
int width, int height)
{
+ int linesize = width * 4;
+ qemu_alloc_display(surface, width, height, linesize,
+ qemu_default_pixelformat(32), 0);
+ return surface;
+}
+
+void qemu_alloc_display(DisplaySurface *surface, int width, int height,
+ int linesize, PixelFormat pf, int newflags)
+{
+ void *data;
surface->width = width;
surface->height = height;
- surface->linesize = width * 4;
- surface->pf = qemu_default_pixelformat(32);
- if (surface->flags & QEMU_ALLOCATED_FLAG)
- surface->data = (uint8_t*) qemu_realloc(surface->data, surface->linesize * surface->height);
- else
- surface->data = (uint8_t*) qemu_malloc(surface->linesize * surface->height);
+ surface->linesize = linesize;
+ surface->pf = pf;
+ if (surface->flags & QEMU_ALLOCATED_FLAG) {
+ data = qemu_realloc(surface->data,
+ surface->linesize * surface->height);
+ } else {
+ data = qemu_malloc(surface->linesize * surface->height);
+ }
+ surface->data = (uint8_t *)data;
+ surface->flags = newflags | QEMU_ALLOCATED_FLAG;
#ifdef HOST_WORDS_BIGENDIAN
- surface->flags = QEMU_ALLOCATED_FLAG | QEMU_BIG_ENDIAN_FLAG;
-#else
- surface->flags = QEMU_ALLOCATED_FLAG;
+ surface->flags |= QEMU_BIG_ENDIAN_FLAG;
#endif
-
- return surface;
}
DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp,
@@ -1450,7 +1485,6 @@ void console_color_init(DisplayState *ds)
static int n_text_consoles;
static CharDriverState *text_consoles[128];
-static QemuOpts *text_console_opts[128];
static void text_console_set_echo(CharDriverState *chr, bool echo)
{
@@ -1459,38 +1493,16 @@ static void text_console_set_echo(CharDriverState *chr, bool echo)
s->echo = echo;
}
-static void text_console_do_init(CharDriverState *chr, DisplayState *ds, QemuOpts *opts)
+static void text_console_do_init(CharDriverState *chr, DisplayState *ds)
{
TextConsole *s;
- unsigned width;
- unsigned height;
static int color_inited;
- width = qemu_opt_get_number(opts, "width", 0);
- if (width == 0)
- width = qemu_opt_get_number(opts, "cols", 0) * FONT_WIDTH;
+ s = chr->opaque;
- height = qemu_opt_get_number(opts, "height", 0);
- if (height == 0)
- height = qemu_opt_get_number(opts, "rows", 0) * FONT_HEIGHT;
-
- if (width == 0 || height == 0) {
- s = new_console(ds, TEXT_CONSOLE);
- width = ds_get_width(s->ds);
- height = ds_get_height(s->ds);
- } else {
- s = new_console(ds, TEXT_CONSOLE_FIXED_SIZE);
- }
-
- if (!s) {
- free(chr);
- return;
- }
- chr->opaque = s;
chr->chr_write = console_puts;
chr->chr_send_event = console_send_event;
- s->chr = chr;
s->out_fifo.buf = s->out_fifo_buf;
s->out_fifo.buf_size = sizeof(s->out_fifo_buf);
s->kbd_timer = qemu_new_timer_ms(rt_clock, kbd_send_chars, s);
@@ -1505,8 +1517,10 @@ static void text_console_do_init(CharDriverState *chr, DisplayState *ds, QemuOpt
s->total_height = DEFAULT_BACKSCROLL;
s->x = 0;
s->y = 0;
- s->g_width = width;
- s->g_height = height;
+ if (s->console_type == TEXT_CONSOLE) {
+ s->g_width = ds_get_width(s->ds);
+ s->g_height = ds_get_height(s->ds);
+ }
s->hw_invalidate = text_console_invalidate;
s->hw_text_update = text_console_update;
@@ -1553,7 +1567,6 @@ CharDriverState *text_console_init(QemuOpts *opts)
exit(1);
}
text_consoles[n_text_consoles] = chr;
- text_console_opts[n_text_consoles] = opts;
n_text_consoles++;
width = qemu_opt_get_number(opts, "width", 0);
@@ -1620,9 +1633,7 @@ void text_consoles_set_display(DisplayState *ds)
int i;
for (i = 0; i < n_text_consoles; i++) {
- text_console_do_init(text_consoles[i], ds, text_console_opts[i]);
- qemu_opts_del(text_console_opts[i]);
- text_console_opts[i] = NULL;
+ text_console_do_init(text_consoles[i], ds);
}
n_text_consoles = 0;