diff options
author | David 'Digit' Turner <digit@android.com> | 2010-07-27 11:34:16 -0700 |
---|---|---|
committer | David 'Digit' Turner <digit@android.com> | 2010-07-27 12:25:52 -0700 |
commit | 055ae42d36d9d78a7920f66ee2df485d81d24264 (patch) | |
tree | a1d84474063ea614199ab6a31602711b88d02175 /android/main.c | |
parent | 657a3521a1f4d354b57f0e524b1cd57bed177bb0 (diff) | |
download | external_qemu-055ae42d36d9d78a7920f66ee2df485d81d24264.zip external_qemu-055ae42d36d9d78a7920f66ee2df485d81d24264.tar.gz external_qemu-055ae42d36d9d78a7920f66ee2df485d81d24264.tar.bz2 |
Better separation of UI and Core sources for framebuffer emulation.
+ new document under docs/DISPLAY-STATE.TXT to explain what's happening.
Change-Id: Ia0d233377266212da49af932c7528f46f5feb92d
Diffstat (limited to 'android/main.c')
-rw-r--r-- | android/main.c | 316 |
1 files changed, 5 insertions, 311 deletions
diff --git a/android/main.c b/android/main.c index 88ce36b..99720f5 100644 --- a/android/main.c +++ b/android/main.c @@ -70,11 +70,13 @@ #include "tcpdump.h" #include "android/qemulator.h" +#include "android/display.h" /* in vl.c */ extern void qemu_help(int code); #include "framebuffer.h" + AndroidRotation android_framebuffer_rotation; #define STRINGIFY(x) _STRINGIFY(x) @@ -103,8 +105,6 @@ extern int qemu_milli_needed; static int opts->flashkeys; /* forward */ #endif -static void handle_key_command( void* opaque, SkinKeyCommand command, int param ); - #ifdef CONFIG_TRACE extern void start_tracing(void); extern void stop_tracing(void); @@ -247,298 +247,6 @@ uint64_t convertMBToBytes( unsigned megaBytes ) /***** *****/ /***********************************************************************/ /***********************************************************************/ - -/* called by the emulated framebuffer device each time the content of the - * framebuffer has changed. the rectangle is the bounding box of all changes - */ -static void -sdl_update(DisplayState *ds, int x, int y, int w, int h) -{ - /* this function is being called from the console code that is currently inactive - ** simple totally ignore it... - */ - (void)ds; - (void)x; - (void)y; - (void)w; - (void)h; -} - - - - -/* called by the emulated framebuffer device each time the framebuffer - * is resized or rotated */ -static void -sdl_resize(DisplayState *ds) -{ - //fprintf(stderr, "weird, sdl_resize being called with framebuffer interface\n"); - //exit(1); -} - - -/* called periodically to poll for user input events */ -static void sdl_refresh(DisplayState *ds) -{ - QEmulator* emulator = ds->opaque; - SDL_Event ev; - SkinWindow* window = emulator->window; - SkinKeyboard* keyboard = emulator->keyboard; - - /* this will eventually call sdl_update if the content of the VGA framebuffer - * has changed */ - qframebuffer_check_updates(); - - if (window == NULL) - return; - - while(SDL_PollEvent(&ev)){ - switch(ev.type){ - case SDL_VIDEOEXPOSE: - skin_window_redraw( window, NULL ); - break; - - case SDL_KEYDOWN: -#ifdef _WIN32 - /* special code to deal with Alt-F4 properly */ - if (ev.key.keysym.sym == SDLK_F4 && - ev.key.keysym.mod & KMOD_ALT) { - goto CleanExit; - } -#endif -#ifdef __APPLE__ - /* special code to deal with Command-Q properly */ - if (ev.key.keysym.sym == SDLK_q && - ev.key.keysym.mod & KMOD_META) { - goto CleanExit; - } -#endif - skin_keyboard_process_event( keyboard, &ev, 1 ); - break; - - case SDL_KEYUP: - skin_keyboard_process_event( keyboard, &ev, 0 ); - break; - - case SDL_MOUSEMOTION: - skin_window_process_event( window, &ev ); - break; - - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - { - int down = (ev.type == SDL_MOUSEBUTTONDOWN); - if (ev.button.button == 4) - { - /* scroll-wheel simulates DPad up */ - AndroidKeyCode kcode; - - kcode = // qemulator_rotate_keycode(kKeyCodeDpadUp); - android_keycode_rotate(kKeyCodeDpadUp, - skin_layout_get_dpad_rotation(qemulator_get_layout(qemulator_get()))); - user_event_key( kcode, down ); - } - else if (ev.button.button == 5) - { - /* scroll-wheel simulates DPad down */ - AndroidKeyCode kcode; - - kcode = // qemulator_rotate_keycode(kKeyCodeDpadDown); - android_keycode_rotate(kKeyCodeDpadDown, - skin_layout_get_dpad_rotation(qemulator_get_layout(qemulator_get()))); - user_event_key( kcode, down ); - } - else if (ev.button.button == SDL_BUTTON_LEFT) { - skin_window_process_event( window, &ev ); - } -#if 0 - else { - fprintf(stderr, "... mouse button %s: button=%d state=%04x x=%d y=%d\n", - down ? "down" : "up ", - ev.button.button, ev.button.state, ev.button.x, ev.button.y); - } -#endif - } - break; - - case SDL_QUIT: -#if defined _WIN32 || defined __APPLE__ - CleanExit: -#endif - /* only save emulator config through clean exit */ - qemulator_done(qemulator_get()); - qemu_system_shutdown_request(); - return; - } - } - - skin_keyboard_flush( keyboard ); -} - - -/* used to respond to a given keyboard command shortcut - */ -static void -handle_key_command( void* opaque, SkinKeyCommand command, int down ) -{ - static const struct { SkinKeyCommand cmd; AndroidKeyCode kcode; } keycodes[] = - { - { SKIN_KEY_COMMAND_BUTTON_CALL, kKeyCodeCall }, - { SKIN_KEY_COMMAND_BUTTON_HOME, kKeyCodeHome }, - { SKIN_KEY_COMMAND_BUTTON_BACK, kKeyCodeBack }, - { SKIN_KEY_COMMAND_BUTTON_HANGUP, kKeyCodeEndCall }, - { SKIN_KEY_COMMAND_BUTTON_POWER, kKeyCodePower }, - { SKIN_KEY_COMMAND_BUTTON_SEARCH, kKeyCodeSearch }, - { SKIN_KEY_COMMAND_BUTTON_MENU, kKeyCodeMenu }, - { SKIN_KEY_COMMAND_BUTTON_DPAD_UP, kKeyCodeDpadUp }, - { SKIN_KEY_COMMAND_BUTTON_DPAD_LEFT, kKeyCodeDpadLeft }, - { SKIN_KEY_COMMAND_BUTTON_DPAD_RIGHT, kKeyCodeDpadRight }, - { SKIN_KEY_COMMAND_BUTTON_DPAD_DOWN, kKeyCodeDpadDown }, - { SKIN_KEY_COMMAND_BUTTON_DPAD_CENTER, kKeyCodeDpadCenter }, - { SKIN_KEY_COMMAND_BUTTON_VOLUME_UP, kKeyCodeVolumeUp }, - { SKIN_KEY_COMMAND_BUTTON_VOLUME_DOWN, kKeyCodeVolumeDown }, - { SKIN_KEY_COMMAND_BUTTON_CAMERA, kKeyCodeCamera }, - { SKIN_KEY_COMMAND_NONE, 0 } - }; - int nn; -#ifdef CONFIG_TRACE - static int tracing = 0; -#endif - QEmulator* emulator = opaque; - - - for (nn = 0; keycodes[nn].kcode != 0; nn++) { - if (command == keycodes[nn].cmd) { - unsigned code = keycodes[nn].kcode; - if (down) - code |= 0x200; - kbd_put_keycode( code ); - return; - } - } - - // for the show-trackball command, handle down events to enable, and - // up events to disable - if (command == SKIN_KEY_COMMAND_SHOW_TRACKBALL) { - emulator->show_trackball = (down != 0); - skin_window_show_trackball( emulator->window, emulator->show_trackball ); - //qemulator_set_title( emulator ); - return; - } - - // only handle down events for the rest - if (down == 0) - return; - - switch (command) - { - case SKIN_KEY_COMMAND_TOGGLE_NETWORK: - { - qemu_net_disable = !qemu_net_disable; - if (android_modem) { - amodem_set_data_registration( - android_modem, - qemu_net_disable ? A_REGISTRATION_UNREGISTERED - : A_REGISTRATION_HOME); - } - D( "network is now %s", qemu_net_disable ? "disconnected" : "connected" ); - } - break; - - case SKIN_KEY_COMMAND_TOGGLE_FULLSCREEN: - if (emulator->window) { - skin_window_toggle_fullscreen(emulator->window); - } - break; - - case SKIN_KEY_COMMAND_TOGGLE_TRACING: - { -#ifdef CONFIG_TRACE - tracing = !tracing; - if (tracing) - start_tracing(); - else - stop_tracing(); -#endif - } - break; - - case SKIN_KEY_COMMAND_TOGGLE_TRACKBALL: - emulator->show_trackball = !emulator->show_trackball; - skin_window_show_trackball( emulator->window, emulator->show_trackball ); - qemulator_set_title(emulator); - break; - - case SKIN_KEY_COMMAND_ONION_ALPHA_UP: - case SKIN_KEY_COMMAND_ONION_ALPHA_DOWN: - if (emulator->onion) - { - int alpha = emulator->onion_alpha; - - if (command == SKIN_KEY_COMMAND_ONION_ALPHA_UP) - alpha += 16; - else - alpha -= 16; - - if (alpha > 256) - alpha = 256; - else if (alpha < 0) - alpha = 0; - - emulator->onion_alpha = alpha; - skin_window_set_onion( emulator->window, emulator->onion, emulator->onion_rotation, alpha ); - skin_window_redraw( emulator->window, NULL ); - //dprint( "onion alpha set to %d (%.f %%)", alpha, alpha/2.56 ); - } - break; - - case SKIN_KEY_COMMAND_CHANGE_LAYOUT_PREV: - case SKIN_KEY_COMMAND_CHANGE_LAYOUT_NEXT: - { - SkinLayout* layout = NULL; - - if (command == SKIN_KEY_COMMAND_CHANGE_LAYOUT_NEXT) { - layout = emulator->layout->next; - if (layout == NULL) - layout = emulator->layout_file->layouts; - } - else if (command == SKIN_KEY_COMMAND_CHANGE_LAYOUT_PREV) { - layout = emulator->layout_file->layouts; - while (layout->next && layout->next != emulator->layout) - layout = layout->next; - } - if (layout != NULL) { - SkinRotation rotation; - - emulator->layout = layout; - skin_window_reset( emulator->window, layout ); - - rotation = skin_layout_get_dpad_rotation( layout ); - - if (emulator->keyboard) - skin_keyboard_set_rotation( emulator->keyboard, rotation ); - - if (emulator->trackball) { - skin_trackball_set_rotation( emulator->trackball, rotation ); - skin_window_set_trackball( emulator->window, emulator->trackball ); - skin_window_show_trackball( emulator->window, emulator->show_trackball ); - } - - skin_window_set_lcd_brightness( emulator->window, emulator->lcd_brightness ); - - qframebuffer_invalidate_all(); - qframebuffer_check_updates(); - } - } - break; - - default: - /* XXX: TODO ? */ - ; - } -} - - static void sdl_at_exit(void) { emulator_config_done(); @@ -551,8 +259,8 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame) { QEmulator* emulator = qemulator_get(); SkinDisplay* disp = skin_layout_get_display(emulator->layout); - DisplayChangeListener* dcl; int width, height; + char buf[128]; if (disp->rotation & 1) { width = disp->rect.size.h; @@ -562,22 +270,8 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame) height = disp->rect.size.h; } - /* Register a display state object for the emulated framebuffer */ - ds->allocator = &default_allocator; - ds->opaque = emulator; - ds->surface = qemu_create_displaysurface(ds, width, height); - register_displaystate(ds); - - /* Register a change listener for it */ - dcl = (DisplayChangeListener *) qemu_mallocz(sizeof(DisplayChangeListener)); - dcl->dpy_update = sdl_update; - dcl->dpy_resize = sdl_resize; - dcl->dpy_refresh = sdl_refresh; - dcl->dpy_text_cursor = NULL; - register_displaychangelistener(ds, dcl); - - skin_keyboard_enable( emulator->keyboard, 1 ); - skin_keyboard_on_command( emulator->keyboard, handle_key_command, emulator ); + snprintf(buf, sizeof buf, "width=%d,height=%d", width, height); + android_display_init(ds, qframebuffer_fifo_get()); } |