📄 video.c
字号:
/* * GPAC - Multimedia Framework C SDK * * Copyright (c) Jean Le Feuvre 2000-2005 * All rights reserved * * This file is part of GPAC / SDL audio and video module * * GPAC is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GPAC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */#include "sdl_out.h"#include <gpac/user.h>#ifdef WIN32#include <windows.h>#endif/*cursors data*/static char hand_data[] = { 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,2,2,1,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,2,2,1,2,2,1,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,2,2,1,2,2,1,2,2,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,0,1,2,2,1,2,2,1,2,2,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,1,1,2,2,2,2,2,2,2,2,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,2,2,1,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,2,1,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};static char collide_data[] ={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};#define SDLVID() SDLVidCtx *ctx = (SDLVidCtx *)dr->opaque#if defined(__linux__)#define HAVE_X11#endif#ifdef HAVE_X11#include <X11/Xlib.h>#endifstatic u32 video_modes[] = { 320, 200, 320, 240, 400, 300, 600, 400, 800, 600, 1024, 768, 1152, 864, 1280, 1024};static u32 nb_video_modes = 8;void SDLVid_SetCaption(){ char szName[100]; if (SDL_VideoDriverName(szName, 100)) { char szCap[1024]; sprintf(szCap, "SDL Video Output (%s)", szName); SDL_WM_SetCaption(szCap, NULL); } else { SDL_WM_SetCaption("SDL Video Output", NULL); }}SDL_Cursor *SDLVid_LoadCursor(char *maskdata){ s32 ind, i, j; u8 data[4*32]; u8 mask[4*32]; ind = -1; for (i=0; i<32; i++) { for (j=0; j<32; j++) { if (j%8) { data[ind] <<= 1; mask[ind] <<= 1; } else { ind++; data[ind] = mask[ind] = 0; } switch (maskdata[j+32*i]) { /*black*/ case 1: data[ind] |= 0x01; /*white*/ case 2: mask[ind] |= 0x01; break; } } } return SDL_CreateCursor(data, mask, 32, 32, 0, 0);}static void sdl_translate_key(u32 SDLkey, GF_EventKey *evt) { evt->flags = 0; evt->hw_code = SDLkey; switch (SDLkey) { case SDLK_BACKSPACE: evt->key_code = GF_KEY_BACKSPACE; break; case SDLK_TAB: evt->key_code = GF_KEY_TAB; break; case SDLK_CLEAR: evt->key_code = GF_KEY_CLEAR; break; case SDLK_PAUSE: evt->key_code = GF_KEY_PAUSE; break; case SDLK_ESCAPE: evt->key_code = GF_KEY_ESCAPE; break; case SDLK_SPACE: evt->key_code = GF_KEY_SPACE; break; case SDLK_KP_ENTER: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_RETURN: evt->key_code = GF_KEY_ENTER; break; case SDLK_KP_MULTIPLY: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_ASTERISK: evt->key_code = GF_KEY_STAR; break; case SDLK_KP_PLUS: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_PLUS: evt->key_code = GF_KEY_PLUS; break; case SDLK_KP_MINUS: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_MINUS: evt->key_code = GF_KEY_HYPHEN; break; case SDLK_KP_DIVIDE: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_SLASH: evt->key_code = GF_KEY_SLASH; break; case SDLK_KP0: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_0: evt->key_code = GF_KEY_0; break; case SDLK_KP1: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_1: evt->key_code = GF_KEY_1; break; case SDLK_KP2: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_2: evt->key_code = GF_KEY_2; break; case SDLK_KP3: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_3: evt->key_code = GF_KEY_3; break; case SDLK_KP4: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_4: evt->key_code = GF_KEY_4; break; case SDLK_KP5: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_5: evt->key_code = GF_KEY_5; break; case SDLK_KP6: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_6: evt->key_code = GF_KEY_6; break; case SDLK_KP7: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_7: evt->key_code = GF_KEY_7; break; case SDLK_KP8: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_8: evt->key_code = GF_KEY_8; break; case SDLK_KP9: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_9: evt->key_code = GF_KEY_9; break; case SDLK_KP_PERIOD: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_PERIOD: evt->key_code = GF_KEY_FULLSTOP; break; case SDLK_KP_EQUALS: evt->flags = GF_KEY_EXT_NUMPAD; case SDLK_EQUALS: evt->key_code = GF_KEY_EQUALS; break; case SDLK_EXCLAIM: evt->key_code = GF_KEY_EXCLAMATION; break; case SDLK_QUOTEDBL: evt->key_code = GF_KEY_QUOTATION; break; case SDLK_HASH: evt->key_code = GF_KEY_NUMBER; break; case SDLK_DOLLAR: evt->key_code = GF_KEY_DOLLAR; break; case SDLK_AMPERSAND: evt->key_code = GF_KEY_AMPERSAND; break; case SDLK_QUOTE: evt->key_code = GF_KEY_APOSTROPHE; break; case SDLK_LEFTPAREN: evt->key_code = GF_KEY_LEFTPARENTHESIS; break; case SDLK_RIGHTPAREN: evt->key_code = GF_KEY_RIGHTPARENTHESIS; break; case SDLK_COMMA: evt->key_code = GF_KEY_COMMA; break; case SDLK_COLON: evt->key_code = GF_KEY_COLON; break; case SDLK_SEMICOLON: evt->key_code = GF_KEY_SEMICOLON; break; case SDLK_LESS: evt->key_code = GF_KEY_LESSTHAN; break; case SDLK_GREATER: evt->key_code = GF_KEY_GREATERTHAN; break; case SDLK_QUESTION: evt->key_code = GF_KEY_QUESTION; break; case SDLK_AT: evt->key_code = GF_KEY_AT; break; case SDLK_LEFTBRACKET: evt->key_code = GF_KEY_LEFTSQUAREBRACKET; break; case SDLK_RIGHTBRACKET: evt->key_code = GF_KEY_RIGHTSQUAREBRACKET; break; case SDLK_BACKSLASH: evt->key_code = GF_KEY_BACKSLASH; break; case SDLK_UNDERSCORE: evt->key_code = GF_KEY_UNDERSCORE; break; case SDLK_BACKQUOTE: evt->key_code = GF_KEY_GRAVEACCENT; break; case SDLK_DELETE: evt->key_code = GF_KEY_DEL; break; case SDLK_EURO: evt->key_code = GF_KEY_EURO; break; case SDLK_UNDO: evt->key_code = GF_KEY_UNDO; break; case SDLK_UP: evt->key_code = GF_KEY_UP; break; case SDLK_DOWN: evt->key_code = GF_KEY_DOWN; break; case SDLK_RIGHT: evt->key_code = GF_KEY_RIGHT; break; case SDLK_LEFT: evt->key_code = GF_KEY_LEFT; break; case SDLK_INSERT: evt->key_code = GF_KEY_INSERT; break; case SDLK_HOME: evt->key_code = GF_KEY_HOME; break; case SDLK_END: evt->key_code = GF_KEY_END; break; case SDLK_PAGEUP: evt->key_code = GF_KEY_PAGEUP; break; case SDLK_PAGEDOWN: evt->key_code = GF_KEY_PAGEDOWN; break; case SDLK_F1: evt->key_code = GF_KEY_F1; break; case SDLK_F2: evt->key_code = GF_KEY_F2; break; case SDLK_F3: evt->key_code = GF_KEY_F3; break; case SDLK_F4: evt->key_code = GF_KEY_F4; break; case SDLK_F5: evt->key_code = GF_KEY_F5; break; case SDLK_F6: evt->key_code = GF_KEY_F6; break; case SDLK_F7: evt->key_code = GF_KEY_F7; break; case SDLK_F8: evt->key_code = GF_KEY_F8; break; case SDLK_F9: evt->key_code = GF_KEY_F9; break; case SDLK_F10: evt->key_code = GF_KEY_F10; break; case SDLK_F11: evt->key_code = GF_KEY_F11; break; case SDLK_F12: evt->key_code = GF_KEY_F12; break; case SDLK_F13: evt->key_code = GF_KEY_F13; break; case SDLK_F14: evt->key_code = GF_KEY_F14; break; case SDLK_F15: evt->key_code = GF_KEY_F15; break; case SDLK_NUMLOCK: evt->key_code = GF_KEY_NUMLOCK; break; case SDLK_CAPSLOCK: evt->key_code = GF_KEY_CAPSLOCK; break; case SDLK_SCROLLOCK: evt->key_code = GF_KEY_SCROLL; break; case SDLK_RSHIFT: evt->key_code = GF_KEY_SHIFT; evt->flags = GF_KEY_EXT_RIGHT; break; case SDLK_LSHIFT: evt->key_code = GF_KEY_SHIFT; evt->flags = GF_KEY_EXT_LEFT; break; case SDLK_LCTRL: evt->key_code = GF_KEY_CONTROL; evt->flags = GF_KEY_EXT_LEFT; break; case SDLK_RCTRL: evt->key_code = GF_KEY_CONTROL; evt->flags = GF_KEY_EXT_RIGHT; break; case SDLK_LALT: evt->key_code = GF_KEY_ALT; evt->flags = GF_KEY_EXT_LEFT; break; case SDLK_RALT: evt->key_code = GF_KEY_ALT; evt->flags = GF_KEY_EXT_RIGHT; break; case SDLK_LSUPER: evt->key_code = GF_KEY_META; evt->flags = GF_KEY_EXT_LEFT; break; case SDLK_RSUPER: evt->key_code = GF_KEY_META; evt->flags = GF_KEY_EXT_RIGHT; break; case SDLK_MODE: evt->key_code = GF_KEY_MODECHANGE; break; case SDLK_COMPOSE: evt->key_code = GF_KEY_COMPOSE; break; case SDLK_HELP: evt->key_code = GF_KEY_HELP; break; case SDLK_PRINT: evt->key_code = GF_KEY_PRINTSCREEN; break;/* SDLK_CARET = 94, SDLK_a = 97, SDLK_b = 98, SDLK_c = 99, SDLK_d = 100, SDLK_e = 101, SDLK_f = 102, SDLK_g = 103, SDLK_h = 104, SDLK_i = 105, SDLK_j = 106, SDLK_k = 107, SDLK_l = 108, SDLK_m = 109, SDLK_n = 110, SDLK_o = 111, SDLK_p = 112, SDLK_q = 113, SDLK_r = 114, SDLK_s = 115, SDLK_t = 116, SDLK_u = 117, SDLK_v = 118, SDLK_w = 119, SDLK_x = 120, SDLK_y = 121, SDLK_z = 122, SDLK_DELETE = 127, SDLK_SYSREQ = 317, SDLK_POWER = 320,*/ default: if ((SDLkey>=0x30) && (SDLkey<=0x39)) evt->key_code = GF_KEY_0 + SDLkey-0x30; else if ((SDLkey>=0x41) && (SDLkey<=0x5A)) evt->key_code = GF_KEY_A + SDLkey-0x51; else evt->key_code = GF_KEY_UNIDENTIFIED; break; }}#if 0void SDLVid_SetHack(void *os_handle, Bool set_on){ unsetenv("SDL_WINDOWID="); if (!os_handle) return; if (set_on) { char buf[16]; snprintf(buf, sizeof(buf), "%u", (u32) os_handle); setenv("SDL_WINDOWID", buf, 1); sprintf(buf, "SDL_WINDOWID=%u", (u32) os_handle); putenv(buf); }}#endifstatic void SDLVid_DestroyObjects(SDLVidCtx *ctx){ if (ctx->back_buffer) SDL_FreeSurface(ctx->back_buffer); ctx->back_buffer = NULL;}#define SDL_WINDOW_FLAGS SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL | SDL_RESIZABLE#define SDL_FULLSCREEN_FLAGS SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL | SDL_FULLSCREEN#define SDL_GL_WINDOW_FLAGS SDL_HWSURFACE | SDL_OPENGL | SDL_HWACCEL | SDL_RESIZABLE#define SDL_GL_FULLSCREEN_FLAGS SDL_HWSURFACE | SDL_OPENGL | SDL_HWACCEL | SDL_FULLSCREENvoid SDLVid_ResizeWindow(GF_VideoOutput *dr, u32 width, u32 height) { SDLVID(); GF_Event evt; /*lock X mutex to make sure the event queue is not being processed*/ gf_mx_p(ctx->evt_mx); if (ctx->is_3D_out) { u32 flags; if ((ctx->width==width) && (ctx->height==height) ) { gf_mx_v(ctx->evt_mx); return; } flags = SDL_GL_WINDOW_FLAGS; if (ctx->os_handle) flags &= ~SDL_RESIZABLE; if (!ctx->screen) ctx->screen = SDL_SetVideoMode(width, height, 0, flags); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, ctx->screen->format->BitsPerPixel); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 0); SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, 0); SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, 0); SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, 0); SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, 0); assert(width); assert(height); ctx->screen = SDL_SetVideoMode(width, height, 0, flags); assert(ctx->screen); ctx->width = width; ctx->height = height; evt.type = GF_EVENT_VIDEO_SETUP; dr->on_event(dr->evt_cbk_hdl, &evt); } else { u32 flags = SDL_WINDOW_FLAGS; if (ctx->os_handle) flags &= ~SDL_RESIZABLE; ctx->screen = SDL_SetVideoMode(width, height, 0, flags); assert(ctx->screen); } gf_mx_v(ctx->evt_mx);}u32 SDLVid_EventProc(void *par){ u32 flags, last_mouse_move; Bool cursor_on; SDL_Event sdl_evt;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -