⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl.c

📁 qemu性能直逼VMware的仿真器QEMU 的模擬速度約為實機的 25%;約為 Bochs 的 60 倍。Plex86、User-Mode-Linux、VMware 和 Virtual PC 則比
💻 C
📖 第 1 页 / 共 2 页
字号:
static void sdl_send_mouse_event(int dz){    int dx, dy, state, buttons;    state = SDL_GetRelativeMouseState(&dx, &dy);    buttons = 0;    if (state & SDL_BUTTON(SDL_BUTTON_LEFT))        buttons |= MOUSE_EVENT_LBUTTON;    if (state & SDL_BUTTON(SDL_BUTTON_RIGHT))        buttons |= MOUSE_EVENT_RBUTTON;    if (state & SDL_BUTTON(SDL_BUTTON_MIDDLE))        buttons |= MOUSE_EVENT_MBUTTON;    if (kbd_mouse_is_absolute()) {	if (!absolute_enabled) {	    sdl_hide_cursor();	    if (gui_grab) {		sdl_grab_end();	    }	    absolute_enabled = 1;	}	SDL_GetMouseState(&dx, &dy);	dx = dx * 0x7FFF / width;	dy = dy * 0x7FFF / height;    } else if (absolute_enabled) {	sdl_show_cursor();	absolute_enabled = 0;    }    kbd_mouse_event(dx, dy, dz, buttons);}static void toggle_full_screen(DisplayState *ds){    gui_fullscreen = !gui_fullscreen;    sdl_resize(ds, screen->w, screen->h);    if (gui_fullscreen) {        gui_saved_grab = gui_grab;        sdl_grab_start();    } else {        if (!gui_saved_grab)            sdl_grab_end();    }    vga_hw_invalidate();    vga_hw_update();}static void sdl_refresh(DisplayState *ds){    SDL_Event ev1, *ev = &ev1;    int mod_state;                         if (last_vm_running != vm_running) {        last_vm_running = vm_running;        sdl_update_caption();    }    vga_hw_update();    while (SDL_PollEvent(ev)) {        switch (ev->type) {        case SDL_VIDEOEXPOSE:            sdl_update(ds, 0, 0, screen->w, screen->h);            break;        case SDL_KEYDOWN:        case SDL_KEYUP:            if (ev->type == SDL_KEYDOWN) {                mod_state = (SDL_GetModState() & gui_grab_code) ==                    gui_grab_code;                gui_key_modifier_pressed = mod_state;                if (gui_key_modifier_pressed) {                    int keycode;                    keycode = sdl_keyevent_to_keycode(&ev->key);                    switch(keycode) {                    case 0x21: /* 'f' key on US keyboard */                        toggle_full_screen(ds);                        gui_keysym = 1;                        break;                    case 0x02 ... 0x0a: /* '1' to '9' keys */                         /* Reset the modifiers sent to the current console */                        reset_keys();                        console_select(keycode - 0x02);                        if (!is_graphic_console()) {                            /* display grab if going to a text console */                            if (gui_grab)                                sdl_grab_end();                        }                        gui_keysym = 1;                        break;                    default:                        break;                    }                } else if (!is_graphic_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 = (ev->key.keysym.mod & gui_grab_code);                if (!mod_state) {                    if (gui_key_modifier_pressed) {                        gui_key_modifier_pressed = 0;                        if (gui_keysym == 0) {                            /* exit/enter grab if pressing Ctrl-Alt */                            if (!gui_grab) {                                /* if the application is not active,                                   do not try to enter grab state. It                                   prevents                                   'SDL_WM_GrabInput(SDL_GRAB_ON)'                                   from blocking all the application                                   (SDL bug). */                                if (SDL_GetAppState() & SDL_APPACTIVE)                                    sdl_grab_start();                            } else {                                sdl_grab_end();                            }                            /* SDL does not send back all the                               modifiers key, so we must correct it */                            reset_keys();                            break;                        }                        gui_keysym = 0;                    }                }            }            if (is_graphic_console() && !gui_keysym)                 sdl_process_key(&ev->key);            break;        case SDL_QUIT:            if (!no_quit) {               qemu_system_shutdown_request();            }            break;        case SDL_MOUSEMOTION:            if (gui_grab || kbd_mouse_is_absolute() ||                absolute_enabled) {                sdl_send_mouse_event(0);            }            break;        case SDL_MOUSEBUTTONDOWN:        case SDL_MOUSEBUTTONUP:            {                SDL_MouseButtonEvent *bev = &ev->button;                if (!gui_grab && !kbd_mouse_is_absolute()) {                    if (ev->type == SDL_MOUSEBUTTONDOWN &&                        (bev->state & SDL_BUTTON_LMASK)) {                        /* start grabbing all events */                        sdl_grab_start();                    }                } else {                    int dz;                    dz = 0;#ifdef SDL_BUTTON_WHEELUP                    if (bev->button == SDL_BUTTON_WHEELUP && ev->type == SDL_MOUSEBUTTONDOWN) {                        dz = -1;                    } else if (bev->button == SDL_BUTTON_WHEELDOWN && ev->type == SDL_MOUSEBUTTONDOWN) {                        dz = 1;                    }#endif                                   sdl_send_mouse_event(dz);                }            }            break;        case SDL_ACTIVEEVENT:            if (gui_grab && ev->active.state == SDL_APPINPUTFOCUS &&                !ev->active.gain && !gui_fullscreen_initial_grab) {                sdl_grab_end();            }            break;        default:            break;        }    }}static void sdl_cleanup(void) {    SDL_Quit();}void sdl_display_init(DisplayState *ds, int full_screen){    int flags;    uint8_t data = 0;#if defined(__APPLE__)    /* always use generic keymaps */    if (!keyboard_layout)        keyboard_layout = "en-us";#endif    if(keyboard_layout) {        kbd_layout = init_keyboard_layout(keyboard_layout);        if (!kbd_layout)            exit(1);    }    flags = SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE;    if (SDL_Init (flags)) {        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);    signal(SIGQUIT, SIG_DFL);#endif    ds->dpy_update = sdl_update;    ds->dpy_resize = sdl_resize;    ds->dpy_refresh = sdl_refresh;    sdl_resize(ds, 640, 400);    sdl_update_caption();    SDL_EnableKeyRepeat(250, 50);    SDL_EnableUNICODE(1);    gui_grab = 0;    sdl_cursor_hidden = SDL_CreateCursor(&data, &data, 8, 1, 0, 0);    sdl_cursor_normal = SDL_GetCursor();    atexit(sdl_cleanup);    if (full_screen) {        gui_fullscreen = 1;        gui_fullscreen_initial_grab = 1;        sdl_grab_start();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -