📄 sdl_keyboard.c
字号:
keynames[SDLK_F8] = "f8";
keynames[SDLK_F9] = "f9";
keynames[SDLK_F10] = "f10";
keynames[SDLK_F11] = "f11";
keynames[SDLK_F12] = "f12";
keynames[SDLK_F13] = "f13";
keynames[SDLK_F14] = "f14";
keynames[SDLK_F15] = "f15";
keynames[SDLK_NUMLOCK] = "numlock";
keynames[SDLK_CAPSLOCK] = "caps lock";
keynames[SDLK_SCROLLOCK] = "scroll lock";
keynames[SDLK_RSHIFT] = "right shift";
keynames[SDLK_LSHIFT] = "left shift";
keynames[SDLK_RCTRL] = "right ctrl";
keynames[SDLK_LCTRL] = "left ctrl";
keynames[SDLK_RALT] = "right alt";
keynames[SDLK_LALT] = "left alt";
keynames[SDLK_RMETA] = "right meta";
keynames[SDLK_LMETA] = "left meta";
keynames[SDLK_LSUPER] = "left super"; /* "Windows" keys */
keynames[SDLK_RSUPER] = "right super";
keynames[SDLK_MODE] = "alt gr";
keynames[SDLK_COMPOSE] = "compose";
keynames[SDLK_HELP] = "help";
keynames[SDLK_PRINT] = "print screen";
keynames[SDLK_SYSREQ] = "sys req";
keynames[SDLK_BREAK] = "break";
keynames[SDLK_MENU] = "menu";
keynames[SDLK_POWER] = "power";
keynames[SDLK_EURO] = "euro";
keynames[SDLK_UNDO] = "undo";
/* Done. Whew. */
return(0);
}
/* We lost the keyboard, so post key up messages for all pressed keys */
void SDL_ResetKeyboard(void)
{
SDL_keysym keysym;
SDLKey key;
memset(&keysym, 0, (sizeof keysym));
for ( key=SDLK_FIRST; key<SDLK_LAST; ++key ) {
if ( SDL_KeyState[key] == SDL_PRESSED ) {
keysym.sym = key;
SDL_PrivateKeyboard(SDL_RELEASED, &keysym);
}
}
SDL_KeyRepeat.timestamp = 0;
}
int SDL_EnableUNICODE(int enable)
{
int old_mode;
old_mode = SDL_TranslateUNICODE;
if ( enable >= 0 ) {
SDL_TranslateUNICODE = enable;
}
return(old_mode);
}
Uint8 * SDL_GetKeyState (int *numkeys)
{
if ( numkeys != (int *)0 )
*numkeys = SDLK_LAST;
return(SDL_KeyState);
}
SDLMod SDL_GetModState (void)
{
return(SDL_ModState);
}
void SDL_SetModState (SDLMod modstate)
{
SDL_ModState = modstate;
}
char *SDL_GetKeyName(SDLKey key)
{
char *keyname;
keyname = NULL;
if ( key < SDLK_LAST ) {
keyname = keynames[key];
}
if ( keyname == NULL ) {
keyname = "unknown key";
}
return(keyname);
}
/* These are global for SDL_eventloop.c */
int SDL_PrivateKeyboard(Uint8 state, SDL_keysym *keysym)
{
SDL_Event event;
int posted, repeatable;
Uint16 modstate;
memset(&event, 0, sizeof(event));
#if 0
printf("The '%s' key has been %s\n", SDL_GetKeyName(keysym->sym),
state == SDL_PRESSED ? "pressed" : "released");
#endif
/* Set up the keysym */
modstate = (Uint16)SDL_ModState;
repeatable = 0;
if ( state == SDL_PRESSED ) {
keysym->mod = (SDLMod)modstate;
switch (keysym->sym) {
case SDLK_NUMLOCK:
modstate ^= KMOD_NUM;
if ( ! (modstate&KMOD_NUM) )
state = SDL_RELEASED;
keysym->mod = (SDLMod)modstate;
break;
case SDLK_CAPSLOCK:
modstate ^= KMOD_CAPS;
if ( ! (modstate&KMOD_CAPS) )
state = SDL_RELEASED;
keysym->mod = (SDLMod)modstate;
break;
case SDLK_LCTRL:
modstate |= KMOD_LCTRL;
break;
case SDLK_RCTRL:
modstate |= KMOD_RCTRL;
break;
case SDLK_LSHIFT:
modstate |= KMOD_LSHIFT;
break;
case SDLK_RSHIFT:
modstate |= KMOD_RSHIFT;
break;
case SDLK_LALT:
modstate |= KMOD_LALT;
break;
case SDLK_RALT:
modstate |= KMOD_RALT;
break;
case SDLK_LMETA:
modstate |= KMOD_LMETA;
break;
case SDLK_RMETA:
modstate |= KMOD_RMETA;
break;
case SDLK_MODE:
modstate |= KMOD_MODE;
break;
default:
repeatable = 1;
break;
}
} else {
switch (keysym->sym) {
case SDLK_NUMLOCK:
case SDLK_CAPSLOCK:
/* Only send keydown events */
return(0);
case SDLK_LCTRL:
modstate &= ~KMOD_LCTRL;
break;
case SDLK_RCTRL:
modstate &= ~KMOD_RCTRL;
break;
case SDLK_LSHIFT:
modstate &= ~KMOD_LSHIFT;
break;
case SDLK_RSHIFT:
modstate &= ~KMOD_RSHIFT;
break;
case SDLK_LALT:
modstate &= ~KMOD_LALT;
break;
case SDLK_RALT:
modstate &= ~KMOD_RALT;
break;
case SDLK_LMETA:
modstate &= ~KMOD_LMETA;
break;
case SDLK_RMETA:
modstate &= ~KMOD_RMETA;
break;
case SDLK_MODE:
modstate &= ~KMOD_MODE;
break;
default:
break;
}
keysym->mod = (SDLMod)modstate;
}
/* Figure out what type of event this is */
switch (state) {
case SDL_PRESSED:
event.type = SDL_KEYDOWN;
break;
case SDL_RELEASED:
event.type = SDL_KEYUP;
/*
* jk 991215 - Added
*/
if ( SDL_KeyRepeat.timestamp ) {
SDL_KeyRepeat.timestamp = 0;
}
break;
default:
/* Invalid state -- bail */
return(0);
}
/* Drop events that don't change state */
if ( SDL_KeyState[keysym->sym] == state ) {
return(0);
}
/* Update internal keyboard state */
SDL_ModState = (SDLMod)modstate;
SDL_KeyState[keysym->sym] = state;
/* Post the event, if desired */
posted = 0;
if ( SDL_ProcessEvents[event.type] == SDL_ENABLE ) {
event.key.state = state;
event.key.keysym = *keysym;
/*
* jk 991215 - Added
*/
if (repeatable && (SDL_KeyRepeat.delay != 0)) {
SDL_KeyRepeat.evt = event;
SDL_KeyRepeat.firsttime = 1;
SDL_KeyRepeat.timestamp=SDL_GetTicks();
}
if ( (SDL_EventOK == NULL) || SDL_EventOK(&event) ) {
posted = 1;
SDL_PushEvent(&event);
}
}
return(posted);
}
/*
* jk 991215 - Added
*/
void SDL_CheckKeyRepeat(void)
{
if ( SDL_KeyRepeat.timestamp ) {
Uint32 now, interval;
now = SDL_GetTicks();
interval = (now - SDL_KeyRepeat.timestamp);
if ( SDL_KeyRepeat.firsttime ) {
if ( interval > (Uint32)SDL_KeyRepeat.delay ) {
SDL_KeyRepeat.timestamp = now;
SDL_KeyRepeat.firsttime = 0;
}
} else {
if ( interval > (Uint32)SDL_KeyRepeat.interval ) {
SDL_KeyRepeat.timestamp = now;
if ( (SDL_EventOK == NULL) || SDL_EventOK(&SDL_KeyRepeat.evt) ) {
SDL_PushEvent(&SDL_KeyRepeat.evt);
}
}
}
}
}
int SDL_EnableKeyRepeat(int delay, int interval)
{
if ( (delay < 0) || (interval < 0) ) {
SDL_SetError("keyboard repeat value less than zero");
return(-1);
}
SDL_KeyRepeat.firsttime = 0;
SDL_KeyRepeat.delay = delay;
SDL_KeyRepeat.interval = interval;
SDL_KeyRepeat.timestamp = 0;
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -