virtual console support
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Wed, 14 Jul 2004 17:22:33 +0000 (17:22 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Wed, 14 Jul 2004 17:22:33 +0000 (17:22 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1022 c046a42c-6fe2-441c-8c8c-71466251a162

sdl.c

diff --git a/sdl.c b/sdl.c
index e4e6bc4..fc23ea9 100644 (file)
--- a/sdl.c
+++ b/sdl.c
@@ -65,6 +65,8 @@ static void sdl_resize(DisplayState *ds, int w, int h)
     ds->data = screen->pixels;
     ds->linesize = screen->pitch;
     ds->depth = screen->format->BitsPerPixel;
+    ds->width = w;
+    ds->height = h;
 }
 
 #ifdef CONFIG_SDL_GENERIC_KBD
@@ -408,7 +410,9 @@ static void sdl_refresh(DisplayState *ds)
         sdl_update_caption();
     }
 
-    vga_update_display();
+    if (is_active_console(vga_console)) 
+        vga_update_display();
+
     while (SDL_PollEvent(ev)) {
         switch (ev->type) {
         case SDL_VIDEOEXPOSE:
@@ -420,19 +424,68 @@ static void sdl_refresh(DisplayState *ds)
                 mod_state = (SDL_GetModState() & (KMOD_LSHIFT | KMOD_LCTRL)) ==
                     (KMOD_LSHIFT | KMOD_LCTRL);
                 gui_key_modifier_pressed = mod_state;
-                if (gui_key_modifier_pressed && 
-                    ev->key.keysym.sym == SDLK_f) {
-                    gui_keysym = ev->key.keysym.sym;
+                if (gui_key_modifier_pressed) {
+                    switch(ev->key.keysym.sym) {
+                    case SDLK_f:
+                        toggle_full_screen(ds);
+                        gui_keysym = 1;
+                        break;
+                    case SDLK_F1 ... SDLK_F12:
+                        console_select(ev->key.keysym.sym - SDLK_F1);
+                        if (is_active_console(vga_console)) {
+                            /* tell the vga console to redisplay itself */
+                            vga_invalidate_display();
+                        } else {
+                            /* display grab if going to a text console */
+                            if (gui_grab)
+                                sdl_grab_end();
+                        }
+                        gui_keysym = 1;
+                        break;
+                    default:
+                        break;
+                    }
+                }
+                if (!is_active_console(vga_console)) {
+                    int keysym;
+                    keysym = 0;
+                    if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) {
+                        switch(ev->key.keysym.sym) {
+                        case SDLK_UP: keysym = QEMU_KEY_CTRL_UP; break;
+                        case SDLK_DOWN: keysym = QEMU_KEY_CTRL_DOWN; break;
+                        case SDLK_LEFT: keysym = QEMU_KEY_CTRL_LEFT; break;
+                        case SDLK_RIGHT: keysym = QEMU_KEY_CTRL_RIGHT; break;
+                        case SDLK_HOME: keysym = QEMU_KEY_CTRL_HOME; break;
+                        case SDLK_END: keysym = QEMU_KEY_CTRL_END; break;
+                        case SDLK_PAGEUP: keysym = QEMU_KEY_CTRL_PAGEUP; break;
+                        case SDLK_PAGEDOWN: keysym = QEMU_KEY_CTRL_PAGEDOWN; break;
+                        default: break;
+                        }
+                    } else {
+                        switch(ev->key.keysym.sym) {
+                        case SDLK_UP: keysym = QEMU_KEY_UP; break;
+                        case SDLK_DOWN: keysym = QEMU_KEY_DOWN; break;
+                        case SDLK_LEFT: keysym = QEMU_KEY_LEFT; break;
+                        case SDLK_RIGHT: keysym = QEMU_KEY_RIGHT; break;
+                        case SDLK_HOME: keysym = QEMU_KEY_HOME; break;
+                        case SDLK_END: keysym = QEMU_KEY_END; break;
+                        case SDLK_PAGEUP: keysym = QEMU_KEY_PAGEUP; break;
+                        case SDLK_PAGEDOWN: keysym = QEMU_KEY_PAGEDOWN; break;
+                        case SDLK_BACKSPACE: keysym = QEMU_KEY_BACKSPACE; break;                        case SDLK_DELETE: keysym = QEMU_KEY_DELETE; break;
+                        default: break;
+                        }
+                    }
+                    if (keysym) {
+                        kbd_put_keysym(keysym);
+                    } else if (ev->key.keysym.unicode != 0) {
+                        kbd_put_keysym(ev->key.keysym.unicode);
+                    }
                 }
             } else if (ev->type == SDL_KEYUP) {
                 mod_state = (SDL_GetModState() & (KMOD_LSHIFT | KMOD_LCTRL));
                 if (!mod_state) {
                     if (gui_key_modifier_pressed) {
-                        switch(gui_keysym) {
-                        case SDLK_f:
-                            toggle_full_screen(ds);
-                            break;
-                        case 0:
+                        if (gui_keysym == 0) {
                             /* exit/enter grab if pressing Ctrl-Shift */
                             if (!gui_grab)
                                 sdl_grab_start();
@@ -445,7 +498,8 @@ static void sdl_refresh(DisplayState *ds)
                     }
                 }
             }
-            sdl_process_key(&ev->key);
+            if (is_active_console(vga_console)) 
+                sdl_process_key(&ev->key);
             break;
         case SDL_QUIT:
             qemu_system_shutdown_request();
@@ -495,7 +549,6 @@ void sdl_display_init(DisplayState *ds)
         fprintf(stderr, "Could not initialize SDL - exiting\n");
         exit(1);
     }
-
 #ifndef _WIN32
     /* NOTE: we still want Ctrl-C to work, so we undo the SDL redirections */
     signal(SIGINT, SIG_DFL);
@@ -509,6 +562,7 @@ void sdl_display_init(DisplayState *ds)
     sdl_resize(ds, 640, 400);
     sdl_update_caption();
     SDL_EnableKeyRepeat(250, 50);
+    SDL_EnableUNICODE(1);
     gui_grab = 0;
 
     atexit(sdl_cleanup);