Пример #1
0
void XBoxStartup()
{
	freopen("stdout.txt", "a", stdout);
	freopen("stderr.txt", "a" ,stderr);

#else
int main(int argc, char *argv[])
{
#endif /* ENABLE_XBOX */

	if (! xdashy_init()) 
#ifndef ENABLE_XBOX
			return -1;
#else
			return;
#endif /* ndef ENABLE_XBOX */
		
	while (process_input())
	{		
		/* render */
		xdashy_render();
		
		gfx_flip();
	}

	xdashy_close();

#ifndef ENABLE_XBOX
	return 0;
#endif /* ndef ENABLE_XBOX */
}
Пример #2
0
static void gfx_check_refresh_rate(void)
{
    float delta;

    timer_get_time();

    for (int i = 0; i < REFRESH_RATE_TEST_CYCLES; i++)
        gfx_flip();

    delta = timer_get_time_delta();

    if (delta > REFRESH_RATE_TEST_CYCLES / MAX_REFRESH_RATE) {
        gfx_mode_info.refresh_rate = REFRESH_RATE_TEST_CYCLES / delta;
        gfx_mode_info.vsync_supported = true;
        gfx_mode_info.vsync_requires_vga_wait = false;
        return;
    }

    timer_get_time();

    for (int i = 0; i < REFRESH_RATE_TEST_CYCLES; i++) {
        vga_wait_for_retrace();
        gfx_flip();
    }

    delta = timer_get_time_delta();

    if (delta > REFRESH_RATE_TEST_CYCLES / MAX_REFRESH_RATE) {
        gfx_mode_info.refresh_rate = REFRESH_RATE_TEST_CYCLES / delta;
        gfx_mode_info.vsync_supported = true;
        gfx_mode_info.vsync_requires_vga_wait = true;
    } else {
        gfx_mode_info.refresh_rate = -1;
        gfx_mode_info.vsync_supported = false;
        gfx_mode_info.vsync_requires_vga_wait = false;
    }
}
Пример #3
0
int input(struct inp_event *inp, int wait)
{
    int rc;
    SDL_Event event;
    SDL_Event peek;
    memset(&event, 0, sizeof(event));
    memset(&peek, 0, sizeof(peek));
    if (wait) {
        rc = SDL_WaitEvent(&event);
    } else
        rc = SDL_PollEvent(&event);
    if (!rc)
        return 0;
    inp->sym[0] = 0;
    inp->type = 0;
    inp->count = 1;
    switch(event.type) {
#if SDL_VERSION_ATLEAST(2,0,0)
    case SDL_MULTIGESTURE:
    case SDL_FINGERMOTION:
        if (DIRECT_MODE && !game_paused())
            return AGAIN;
        if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, event.type, event.type) > 0)
            return AGAIN; /* to avoid flickering */
        break;
    case SDL_FINGERUP:
#ifdef IOS
        touch_num = 0;
#endif
    case SDL_FINGERDOWN:
#ifdef IOS
        if (event.type == SDL_FINGERDOWN) {
            if (gfx_ticks() - touch_stamp > 100) {
                touch_num = 0;
                touch_stamp = gfx_ticks();
            }
            touch_num ++;
            if (touch_num >= 3) {
                inp->type = KEY_DOWN;
                inp->code = 0;
                strncpy(inp->sym, "escape", sizeof(inp->sym));
                break;
            }
        }
#endif
        gfx_finger_pos_scale(event.tfinger.x, event.tfinger.y, &inp->x, &inp->y);
        inp->type = (event.type == SDL_FINGERDOWN) ? FINGER_DOWN : FINGER_UP;
#ifndef PRIx64
        snprintf(inp->sym, sizeof(inp->sym), "%llx:%llx",
                 event.tfinger.fingerId,
                 event.tfinger.touchId);
#else
        snprintf(inp->sym, sizeof(inp->sym), "%"PRIx64":%"PRIx64,
                 event.tfinger.fingerId,
                 event.tfinger.touchId);
#endif
        break;
    case SDL_WINDOWEVENT:
        switch (event.window.event) {
        /*		case SDL_WINDOWEVENT_SHOWN: */
        case SDL_WINDOWEVENT_EXPOSED:
            gfx_flip();
            gfx_commit();
            break;
        case SDL_WINDOWEVENT_MINIMIZED:
        case SDL_WINDOWEVENT_RESTORED:
            m_minimized = (event.window.event == SDL_WINDOWEVENT_MINIMIZED && !opt_fs);
            snd_pause(!nopause_sw && m_minimized);
            break;
        case SDL_WINDOWEVENT_ENTER:
        case SDL_WINDOWEVENT_FOCUS_GAINED:
            m_focus = 1;
            if (opt_fs)
                mouse_cursor(0);
            break;
        case SDL_WINDOWEVENT_LEAVE:
            m_focus = 0;
            if (opt_fs)
                mouse_cursor(1); /* is it hack?*/
            break;
        default:
            break;
        }
        if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_WINDOWEVENT, SDL_WINDOWEVENT) > 0)
            return AGAIN; /* to avoid flickering */
        return 0;
#else
    case SDL_ACTIVEEVENT:
        if (event.active.state & SDL_APPACTIVE) {
            m_minimized = !event.active.gain;
            snd_pause(!nopause_sw && m_minimized);
        }
        if (event.active.state & (SDL_APPMOUSEFOCUS | SDL_APPINPUTFOCUS)) {
            if (event.active.gain) {
                m_focus = 1;
                if (opt_fs)
                    mouse_cursor(0);
            } else if (event.active.state & SDL_APPMOUSEFOCUS) {
                m_focus = 0;
                if (opt_fs)
                    mouse_cursor(1); /* is it hack?*/
            }
        }
#if SDL_VERSION_ATLEAST(1,3,0)
        if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_ACTIVEEVENT, SDL_ACTIVEEVENT) > 0)
#else
        if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_EVENTMASK(SDL_ACTIVEEVENT)) > 0)
#endif
            return AGAIN; /* to avoid flickering */
        return 0;
#endif
    case SDL_USEREVENT: {
        void (*p) (void*) = (void (*)(void*))event.user.data1;
        p(event.user.data2);
        return AGAIN;
    }
    case SDL_QUIT:
        game_running = 0;
        return -1;
    case SDL_KEYDOWN:	/* A key has been pressed */
#if SDL_VERSION_ATLEAST(2,0,0)
        if (event.key.repeat) {
            if (DIRECT_MODE && !game_paused()) /* do not send key repeats */
                return AGAIN;
            if (gfx_ticks() - last_press_ms < INPUT_REP_DELAY_MS)
                return AGAIN;
            if ((gfx_ticks() - last_repeat_ms) < INPUT_REP_INTERVAL_MS)
                return AGAIN;
            last_repeat_ms = gfx_ticks();
        } else {
            last_press_ms = gfx_ticks();
            last_repeat_ms = gfx_ticks();
        }
#endif
        inp->type = KEY_DOWN;
        inp->code = event.key.keysym.scancode;
#if SDL_VERSION_ATLEAST(1,3,0)
        strncpy(inp->sym, SDL_GetScancodeName(inp->code), sizeof(inp->sym));
#else
        strncpy(inp->sym, SDL_GetKeyName(event.key.keysym.sym), sizeof(inp->sym));
#endif
        inp->sym[sizeof(inp->sym) - 1] = 0;
        tolow(inp->sym);
#if SDL_VERSION_ATLEAST(1,3,0)
        key_compat(inp);
#endif
#if SDL_VERSION_ATLEAST(1,3,0) /* strange bug in some SDL2 env, with up/down events storm */
        if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_KEYDOWN, SDL_KEYUP) > 0) {
            if (peek.key.keysym.scancode == event.key.keysym.scancode &&
                    peek.key.repeat == 0)
                return AGAIN;
        }
#endif
        break;
    case SDL_KEYUP:
        inp->type = KEY_UP;
        inp->code = event.key.keysym.scancode;
#if SDL_VERSION_ATLEAST(1,3,0)
        strncpy(inp->sym, SDL_GetScancodeName(inp->code), sizeof(inp->sym));
#else
        strncpy(inp->sym, SDL_GetKeyName(event.key.keysym.sym), sizeof(inp->sym));
#endif
        inp->sym[sizeof(inp->sym) - 1] = 0;
        tolow(inp->sym);
#if SDL_VERSION_ATLEAST(1,3,0)
        key_compat(inp);
#endif
#if SDL_VERSION_ATLEAST(1,3,0) /* strange bug in some SDL2 env, with up/down events storm */
        if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_KEYDOWN, SDL_KEYUP) > 0) {
            if (event.key.keysym.scancode == peek.key.keysym.scancode &&
                    peek.key.repeat == 0)
                return AGAIN;
        }
#endif
        break;
    case SDL_MOUSEMOTION:
        m_focus = 1; /* ahhh */
        if (DIRECT_MODE && !game_paused())
            return AGAIN;
        inp->type = MOUSE_MOTION;
        inp->x = event.button.x;
        inp->y = event.button.y;
#if SDL_VERSION_ATLEAST(1,3,0)
        while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION) > 0) {
#else
        while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION)) > 0) {
#endif
            inp->x = peek.button.x;
            inp->y = peek.button.y;
        }
        break;
    case SDL_MOUSEBUTTONUP:
        inp->type = MOUSE_UP;
        inp->x = event.button.x;
        inp->y = event.button.y;
        inp->code = event.button.button;
        if (event.button.button == 4)
            inp->type = 0;
        else if (event.button.button == 5)
            inp->type = 0;
        break;
#if SDL_VERSION_ATLEAST(2,0,0)
    case SDL_MOUSEWHEEL:
        if (DIRECT_MODE && !game_paused())
            return AGAIN;

        inp->type = (event.wheel.y > 0) ? MOUSE_WHEEL_UP : MOUSE_WHEEL_DOWN;

        while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_MOUSEWHEEL, SDL_MOUSEWHEEL) > 0) {
            if (!((event.wheel.y > 0 &&
                    inp->type == MOUSE_WHEEL_UP) ||
                    (event.wheel.y < 0 &&
                     inp->type == MOUSE_WHEEL_DOWN)))
                break;
            inp->count ++;
        }
        break;
#endif
    case SDL_MOUSEBUTTONDOWN:
        m_focus = 1; /* ahhh */
        inp->type = MOUSE_DOWN;
        inp->x = event.button.x;
        inp->y = event.button.y;
        inp->code = event.button.button;
        if (event.button.button == 4)
            inp->type = MOUSE_WHEEL_UP;
        else if (event.button.button == 5)
            inp->type = MOUSE_WHEEL_DOWN;
#if SDL_VERSION_ATLEAST(1,3,0)
        while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONDOWN) > 0) {
#else
        while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEBUTTONDOWN)) > 0) {
#endif
            if (!((event.button.button == 4 &&
                    inp->type == MOUSE_WHEEL_UP) ||
                    (event.button.button == 5 &&
                     inp->type == MOUSE_WHEEL_DOWN)))
                break;
            inp->count ++;
        }
        break;
    default:
        break;
    }
    return 1;
}