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

📄 sdl.c.svn-base

📁 我们自己开发的一个OSEK操作系统!不知道可不可以?
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
        dy -= guest_y;        guest_x += dx;        guest_y += dy;    }    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) {                if (!alt_grab) {                    mod_state = (SDL_GetModState() & gui_grab_code) ==                                gui_grab_code;                } else {                    mod_state = (SDL_GetModState() & (gui_grab_code | KMOD_LSHIFT)) ==                                (gui_grab_code | KMOD_LSHIFT);                }                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) {                if (!alt_grab) {                    mod_state = (ev->key.keysym.mod & gui_grab_code);                } else {                    mod_state = (ev->key.keysym.mod &                                 (gui_grab_code | KMOD_LSHIFT));                }                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();                vm_start();	/* In case we're paused */            }            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_fill(DisplayState *ds, int x, int y, int w, int h, uint32_t c){    SDL_Rect dst = { x, y, w, h };    SDL_FillRect(screen, &dst, c);}static void sdl_mouse_warp(int x, int y, int on){    if (on) {        if (!guest_cursor)            sdl_show_cursor();        if (gui_grab || kbd_mouse_is_absolute() || absolute_enabled) {            SDL_SetCursor(guest_sprite);            SDL_WarpMouse(x, y);        }    } else if (gui_grab)        sdl_hide_cursor();    guest_cursor = on;    guest_x = x, guest_y = y;}static void sdl_mouse_define(int width, int height, int bpp,                             int hot_x, int hot_y,                             uint8_t *image, uint8_t *mask){    uint8_t sprite[256], *line;    int x, y, dst, bypl, src = 0;    if (guest_sprite)        SDL_FreeCursor(guest_sprite);    memset(sprite, 0, 256);    bypl = ((width * bpp + 31) >> 5) << 2;    for (y = 0, dst = 0; y < height; y ++, image += bypl) {        line = image;        for (x = 0; x < width; x ++, dst ++) {            switch (bpp) {            case 24:                src = *(line ++); src |= *(line ++); src |= *(line ++);                break;            case 16:            case 15:                src = *(line ++); src |= *(line ++);                break;            case 8:                src = *(line ++);                break;            case 4:                src = 0xf & (line[x >> 1] >> ((x & 1)) << 2);                break;            case 2:                src = 3 & (line[x >> 2] >> ((x & 3)) << 1);                break;            case 1:                src = 1 & (line[x >> 3] >> (x & 7));                break;            }            if (!src)                sprite[dst >> 3] |= (1 << (~dst & 7)) & mask[dst >> 3];        }    }    guest_sprite = SDL_CreateCursor(sprite, mask, width, height, hot_x, hot_y);    if (guest_cursor &&            (gui_grab || kbd_mouse_is_absolute() || absolute_enabled))        SDL_SetCursor(guest_sprite);}static void sdl_cleanup(void){    if (guest_sprite)        SDL_FreeCursor(guest_sprite);    SDL_Quit();}void sdl_display_init(DisplayState *ds, int full_screen, int no_frame){    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);    }    if (no_frame)        gui_noframe = 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;    ds->dpy_fill = sdl_fill;    ds->mouse_set = sdl_mouse_warp;    ds->cursor_define = sdl_mouse_define;    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 + -