📄 sdl_ph_events.c
字号:
{ SDL_keysym keysym; posted = 0; keyEvent = PhGetData( event ); if (Pk_KF_Key_Down & keyEvent->key_flags) { posted = SDL_PrivateKeyboard(SDL_PRESSED, ph_TranslateKey(keyEvent, &keysym)); } else /* must be key release */ { /* Ignore repeated key release events */ /* if (! Pk_KF_Key_Repeat & keyEvent->key_flags ) */ posted = SDL_PrivateKeyboard(SDL_RELEASED, ph_TranslateKey( keyEvent, &keysym)); } } break; } return(posted);}/* perform a blocking read if no events available */int ph_Pending(_THIS){ /* Flush the display connection and look to see if events are queued */ PgFlush(); while( 1 ) { //note this is a non-blocking call switch( PhEventPeek( event, EVENT_SIZE ) ) { case Ph_EVENT_MSG: return 1; break; case -1: perror( "PhEventNext failed" ); break; default: return 0; } } /* Oh well, nothing is ready .. */ return(0);}/*SAMPLE EVENT PUMP=================static void update( int block ){ int ch,fl; PhKeyEvent_t *key; for( ;; ){ if( block ){ do{ fl=PhEventNext( event,EVENT_SIZE ); }while( fl!=Ph_EVENT_MSG ); block=0; }else{ do{ fl=PhEventPeek( event,EVENT_SIZE ); if( !fl ) return; }while( fl!=Ph_EVENT_MSG ); } switch( event->type ){ case Ph_EV_KEY: key=PhGetData( event ); ch=key->key_cap; // & 127; fl=key->key_flags; if( ch<32 || ch>127 ) break; if( fl & Pk_KF_Key_Down ){ if( !(fl & Pk_KF_Key_Repeat) ){ if( queput-queget<QUE_SIZE ) keyque[ queput++ & QUE_MASK ]=ch; keyMatrix[ch]=1; } }else{ keyMatrix[ch]=0; } break; default: PtEventHandler( event ); } }}*/void ph_PumpEvents(_THIS){ int pending; /* Keep processing pending events */ pending = 0; while ( ph_Pending(this) ) { ph_DispatchEvent(this); ++pending; } if ( switch_waiting ) { Uint32 now; now = SDL_GetTicks();#if 0 if ( pending || !SDL_VideoSurface ) { /* Try again later... */ if ( switch_waiting & SDL_FULLSCREEN ) { switch_time = now + 1500; } else { switch_time = now + 200; } } else if ( now >= switch_time ) { Uint32 go_fullscreen; go_fullscreen = switch_waiting & SDL_FULLSCREEN; switch_waiting = 0; if ( SDL_VideoSurface->flags & SDL_FULLSCREEN ) { if ( go_fullscreen ) { ph_EnterFullScreen(this); } else { ph_LeaveFullScreen(this); } } /* Handle focus in/out when grabbed *//* if ( go_fullscreen ) { ph_GrabInputNoLock(this, this->input_grab); } else { ph_GrabInputNoLock(this, SDL_GRAB_OFF); }*/ }#endif }}void ph_InitKeymap(void){ int i; /* Odd keys used in international keyboards */ for ( i=0; i<SDL_TABLESIZE(ODD_keymap); ++i ) ODD_keymap[i] = SDLK_UNKNOWN; /* Map the miscellaneous keys */ for ( i=0; i<SDL_TABLESIZE(MISC_keymap); ++i ) MISC_keymap[i] = SDLK_UNKNOWN; MISC_keymap[Pk_BackSpace&0xFF] = SDLK_BACKSPACE; MISC_keymap[Pk_Tab&0xFF] = SDLK_TAB; MISC_keymap[Pk_Clear&0xFF] = SDLK_CLEAR; MISC_keymap[Pk_Return&0xFF] = SDLK_RETURN; MISC_keymap[Pk_Pause&0xFF] = SDLK_PAUSE; MISC_keymap[Pk_Escape&0xFF] = SDLK_ESCAPE; MISC_keymap[Pk_Delete&0xFF] = SDLK_DELETE; MISC_keymap[Pk_KP_0&0xFF] = SDLK_KP0; MISC_keymap[Pk_KP_1&0xFF] = SDLK_KP1; MISC_keymap[Pk_KP_2&0xFF] = SDLK_KP2; MISC_keymap[Pk_KP_3&0xFF] = SDLK_KP3; MISC_keymap[Pk_KP_4&0xFF] = SDLK_KP4; MISC_keymap[Pk_KP_5&0xFF] = SDLK_KP5; MISC_keymap[Pk_KP_6&0xFF] = SDLK_KP6; MISC_keymap[Pk_KP_7&0xFF] = SDLK_KP7; MISC_keymap[Pk_KP_8&0xFF] = SDLK_KP8; MISC_keymap[Pk_KP_9&0xFF] = SDLK_KP9; MISC_keymap[Pk_KP_Decimal&0xFF] = SDLK_KP_PERIOD; MISC_keymap[Pk_KP_Divide&0xFF] = SDLK_KP_DIVIDE; MISC_keymap[Pk_KP_Multiply&0xFF] = SDLK_KP_MULTIPLY; MISC_keymap[Pk_KP_Subtract&0xFF] = SDLK_KP_MINUS; MISC_keymap[Pk_KP_Add&0xFF] = SDLK_KP_PLUS; MISC_keymap[Pk_KP_Enter&0xFF] = SDLK_KP_ENTER; MISC_keymap[Pk_KP_Equal&0xFF] = SDLK_KP_EQUALS; MISC_keymap[Pk_Up&0xFF] = SDLK_UP; MISC_keymap[Pk_Down&0xFF] = SDLK_DOWN; MISC_keymap[Pk_Right&0xFF] = SDLK_RIGHT; MISC_keymap[Pk_Left&0xFF] = SDLK_LEFT; MISC_keymap[Pk_Insert&0xFF] = SDLK_INSERT; MISC_keymap[Pk_Home&0xFF] = SDLK_HOME; MISC_keymap[Pk_End&0xFF] = SDLK_END; MISC_keymap[Pk_Pg_Up&0xFF] = SDLK_PAGEUP; MISC_keymap[Pk_Pg_Down&0xFF] = SDLK_PAGEDOWN; MISC_keymap[Pk_F1&0xFF] = SDLK_F1; MISC_keymap[Pk_F2&0xFF] = SDLK_F2; MISC_keymap[Pk_F3&0xFF] = SDLK_F3; MISC_keymap[Pk_F4&0xFF] = SDLK_F4; MISC_keymap[Pk_F5&0xFF] = SDLK_F5; MISC_keymap[Pk_F6&0xFF] = SDLK_F6; MISC_keymap[Pk_F7&0xFF] = SDLK_F7; MISC_keymap[Pk_F8&0xFF] = SDLK_F8; MISC_keymap[Pk_F9&0xFF] = SDLK_F9; MISC_keymap[Pk_F10&0xFF] = SDLK_F10; MISC_keymap[Pk_F11&0xFF] = SDLK_F11; MISC_keymap[Pk_F12&0xFF] = SDLK_F12; MISC_keymap[Pk_F13&0xFF] = SDLK_F13; MISC_keymap[Pk_F14&0xFF] = SDLK_F14; MISC_keymap[Pk_F15&0xFF] = SDLK_F15; MISC_keymap[Pk_Num_Lock&0xFF] = SDLK_NUMLOCK; MISC_keymap[Pk_Caps_Lock&0xFF] = SDLK_CAPSLOCK; MISC_keymap[Pk_Scroll_Lock&0xFF] = SDLK_SCROLLOCK; MISC_keymap[Pk_Shift_R&0xFF] = SDLK_RSHIFT; MISC_keymap[Pk_Shift_L&0xFF] = SDLK_LSHIFT; MISC_keymap[Pk_Control_R&0xFF] = SDLK_RCTRL; MISC_keymap[Pk_Control_L&0xFF] = SDLK_LCTRL; MISC_keymap[Pk_Alt_R&0xFF] = SDLK_RALT; MISC_keymap[Pk_Alt_L&0xFF] = SDLK_LALT; MISC_keymap[Pk_Meta_R&0xFF] = SDLK_RMETA; MISC_keymap[Pk_Meta_L&0xFF] = SDLK_LMETA; MISC_keymap[Pk_Super_L&0xFF] = SDLK_LSUPER; /* Left "Windows" */ MISC_keymap[Pk_Super_R&0xFF] = SDLK_RSUPER; /* Right "Windows */ MISC_keymap[Pk_Mode_switch&0xFF] = SDLK_MODE; /* "Alt Gr" key */ MISC_keymap[Pk_Help&0xFF] = SDLK_HELP; MISC_keymap[Pk_Print&0xFF] = SDLK_PRINT;// MISC_keymap[Pk_Sys_Req] = SDLK_SYSREQ; MISC_keymap[Pk_Break&0xFF] = SDLK_BREAK; MISC_keymap[Pk_Menu&0xFF] = SDLK_MENU; MISC_keymap[Pk_Hyper_R&0xFF] = SDLK_MENU; /* Windows "Menu" key */}static unsigned long cap;SDL_keysym *ph_TranslateKey(PhKeyEvent_t *key, SDL_keysym *keysym){/* 'sym' is set to the value of the key with modifiers applied to it. This member is valid only if Pk_KF_Sym_Valid is set in the key_flags. We will assume it is valid.*/ /* FIXME: This needs to check whether the cap & scancode is valid */ cap = key->key_cap; switch (cap>>8) { case 0x00: /* Latin 1 */ case 0x01: /* Latin 2 */ case 0x02: /* Latin 3 */ case 0x03: /* Latin 4 */ case 0x04: /* Katakana */ case 0x05: /* Arabic */ case 0x06: /* Cyrillic */ case 0x07: /* Greek */ case 0x08: /* Technical */ case 0x0A: /* Publishing */ case 0x0C: /* Hebrew */ case 0x0D: /* Thai */ keysym->sym = (SDLKey)(cap&0xFF); /* Map capital letter syms to lowercase */ if ((keysym->sym >= 'A')&&(keysym->sym <= 'Z')) keysym->sym += ('a'-'A'); break;// case 0xFE:// keysym->sym = ODD_keymap[sym&0xFF];// break; case 0xF0: keysym->sym = MISC_keymap[cap&0xFF]; break; default:/* fprintf(stderr,"Photon: Unknown key_cap, cap = 0x%.4x\n", (unsigned int)cap); */ keysym->sym = SDLK_UNKNOWN; break; } keysym->scancode = key->key_scan; keysym->unicode = 0; if( SDL_TranslateUNICODE ) { char utf8[MB_CUR_MAX]; int utf8len; wchar_t unicode; utf8len = PhKeyToMb( utf8, key ); if( utf8len > 0 ) { utf8len = mbtowc( &unicode, utf8, utf8len ); if( utf8len > 0) keysym->unicode = unicode; } } return (keysym);}void ph_InitOSKeymap(_THIS){ ph_InitKeymap();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -