Commit 457831f4bcf20d1fd5d80d7a0b946bdaf6f56059
1 parent
2571929a
virtual console support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1022 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
65 additions
and
11 deletions
sdl.c
... | ... | @@ -65,6 +65,8 @@ static void sdl_resize(DisplayState *ds, int w, int h) |
65 | 65 | ds->data = screen->pixels; |
66 | 66 | ds->linesize = screen->pitch; |
67 | 67 | ds->depth = screen->format->BitsPerPixel; |
68 | + ds->width = w; | |
69 | + ds->height = h; | |
68 | 70 | } |
69 | 71 | |
70 | 72 | #ifdef CONFIG_SDL_GENERIC_KBD |
... | ... | @@ -408,7 +410,9 @@ static void sdl_refresh(DisplayState *ds) |
408 | 410 | sdl_update_caption(); |
409 | 411 | } |
410 | 412 | |
411 | - vga_update_display(); | |
413 | + if (is_active_console(vga_console)) | |
414 | + vga_update_display(); | |
415 | + | |
412 | 416 | while (SDL_PollEvent(ev)) { |
413 | 417 | switch (ev->type) { |
414 | 418 | case SDL_VIDEOEXPOSE: |
... | ... | @@ -420,19 +424,68 @@ static void sdl_refresh(DisplayState *ds) |
420 | 424 | mod_state = (SDL_GetModState() & (KMOD_LSHIFT | KMOD_LCTRL)) == |
421 | 425 | (KMOD_LSHIFT | KMOD_LCTRL); |
422 | 426 | gui_key_modifier_pressed = mod_state; |
423 | - if (gui_key_modifier_pressed && | |
424 | - ev->key.keysym.sym == SDLK_f) { | |
425 | - gui_keysym = ev->key.keysym.sym; | |
427 | + if (gui_key_modifier_pressed) { | |
428 | + switch(ev->key.keysym.sym) { | |
429 | + case SDLK_f: | |
430 | + toggle_full_screen(ds); | |
431 | + gui_keysym = 1; | |
432 | + break; | |
433 | + case SDLK_F1 ... SDLK_F12: | |
434 | + console_select(ev->key.keysym.sym - SDLK_F1); | |
435 | + if (is_active_console(vga_console)) { | |
436 | + /* tell the vga console to redisplay itself */ | |
437 | + vga_invalidate_display(); | |
438 | + } else { | |
439 | + /* display grab if going to a text console */ | |
440 | + if (gui_grab) | |
441 | + sdl_grab_end(); | |
442 | + } | |
443 | + gui_keysym = 1; | |
444 | + break; | |
445 | + default: | |
446 | + break; | |
447 | + } | |
448 | + } | |
449 | + if (!is_active_console(vga_console)) { | |
450 | + int keysym; | |
451 | + keysym = 0; | |
452 | + if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) { | |
453 | + switch(ev->key.keysym.sym) { | |
454 | + case SDLK_UP: keysym = QEMU_KEY_CTRL_UP; break; | |
455 | + case SDLK_DOWN: keysym = QEMU_KEY_CTRL_DOWN; break; | |
456 | + case SDLK_LEFT: keysym = QEMU_KEY_CTRL_LEFT; break; | |
457 | + case SDLK_RIGHT: keysym = QEMU_KEY_CTRL_RIGHT; break; | |
458 | + case SDLK_HOME: keysym = QEMU_KEY_CTRL_HOME; break; | |
459 | + case SDLK_END: keysym = QEMU_KEY_CTRL_END; break; | |
460 | + case SDLK_PAGEUP: keysym = QEMU_KEY_CTRL_PAGEUP; break; | |
461 | + case SDLK_PAGEDOWN: keysym = QEMU_KEY_CTRL_PAGEDOWN; break; | |
462 | + default: break; | |
463 | + } | |
464 | + } else { | |
465 | + switch(ev->key.keysym.sym) { | |
466 | + case SDLK_UP: keysym = QEMU_KEY_UP; break; | |
467 | + case SDLK_DOWN: keysym = QEMU_KEY_DOWN; break; | |
468 | + case SDLK_LEFT: keysym = QEMU_KEY_LEFT; break; | |
469 | + case SDLK_RIGHT: keysym = QEMU_KEY_RIGHT; break; | |
470 | + case SDLK_HOME: keysym = QEMU_KEY_HOME; break; | |
471 | + case SDLK_END: keysym = QEMU_KEY_END; break; | |
472 | + case SDLK_PAGEUP: keysym = QEMU_KEY_PAGEUP; break; | |
473 | + case SDLK_PAGEDOWN: keysym = QEMU_KEY_PAGEDOWN; break; | |
474 | + case SDLK_BACKSPACE: keysym = QEMU_KEY_BACKSPACE; break; case SDLK_DELETE: keysym = QEMU_KEY_DELETE; break; | |
475 | + default: break; | |
476 | + } | |
477 | + } | |
478 | + if (keysym) { | |
479 | + kbd_put_keysym(keysym); | |
480 | + } else if (ev->key.keysym.unicode != 0) { | |
481 | + kbd_put_keysym(ev->key.keysym.unicode); | |
482 | + } | |
426 | 483 | } |
427 | 484 | } else if (ev->type == SDL_KEYUP) { |
428 | 485 | mod_state = (SDL_GetModState() & (KMOD_LSHIFT | KMOD_LCTRL)); |
429 | 486 | if (!mod_state) { |
430 | 487 | if (gui_key_modifier_pressed) { |
431 | - switch(gui_keysym) { | |
432 | - case SDLK_f: | |
433 | - toggle_full_screen(ds); | |
434 | - break; | |
435 | - case 0: | |
488 | + if (gui_keysym == 0) { | |
436 | 489 | /* exit/enter grab if pressing Ctrl-Shift */ |
437 | 490 | if (!gui_grab) |
438 | 491 | sdl_grab_start(); |
... | ... | @@ -445,7 +498,8 @@ static void sdl_refresh(DisplayState *ds) |
445 | 498 | } |
446 | 499 | } |
447 | 500 | } |
448 | - sdl_process_key(&ev->key); | |
501 | + if (is_active_console(vga_console)) | |
502 | + sdl_process_key(&ev->key); | |
449 | 503 | break; |
450 | 504 | case SDL_QUIT: |
451 | 505 | qemu_system_shutdown_request(); |
... | ... | @@ -495,7 +549,6 @@ void sdl_display_init(DisplayState *ds) |
495 | 549 | fprintf(stderr, "Could not initialize SDL - exiting\n"); |
496 | 550 | exit(1); |
497 | 551 | } |
498 | - | |
499 | 552 | #ifndef _WIN32 |
500 | 553 | /* NOTE: we still want Ctrl-C to work, so we undo the SDL redirections */ |
501 | 554 | signal(SIGINT, SIG_DFL); |
... | ... | @@ -509,6 +562,7 @@ void sdl_display_init(DisplayState *ds) |
509 | 562 | sdl_resize(ds, 640, 400); |
510 | 563 | sdl_update_caption(); |
511 | 564 | SDL_EnableKeyRepeat(250, 50); |
565 | + SDL_EnableUNICODE(1); | |
512 | 566 | gui_grab = 0; |
513 | 567 | |
514 | 568 | atexit(sdl_cleanup); | ... | ... |