📄 sdl_fbevents.c
字号:
(signed char)(mousebuf[i+3]); dy = -((signed char)(mousebuf[i+2]) + (signed char)(mousebuf[i+4])); break; case MOUSE_PS2: /* PS/2 protocol has nothing in high byte */ if ( (mousebuf[i] & 0xC0) != 0 ) { /* Go to next byte */ i -= (packetsize-1); continue; } /* Get current mouse state */ button = (mousebuf[i] & 0x04) >> 1 | /*Middle*/ (mousebuf[i] & 0x02) >> 1 | /*Right*/ (mousebuf[i] & 0x01) << 2; /*Left*/ dx = (mousebuf[i] & 0x10) ? mousebuf[i+1] - 256 : mousebuf[i+1]; dy = (mousebuf[i] & 0x20) ? -(mousebuf[i+2] - 256) : -mousebuf[i+2]; break; case MOUSE_IMPS2: /* Get current mouse state */ button = (mousebuf[i] & 0x04) >> 1 | /*Middle*/ (mousebuf[i] & 0x02) >> 1 | /*Right*/ (mousebuf[i] & 0x01) << 2 | /*Left*/ (mousebuf[i] & 0x40) >> 3 | /* 4 */ (mousebuf[i] & 0x80) >> 3; /* 5 */ dx = (mousebuf[i] & 0x10) ? mousebuf[i+1] - 256 : mousebuf[i+1]; dy = (mousebuf[i] & 0x20) ? -(mousebuf[i+2] - 256) : -mousebuf[i+2]; switch (mousebuf[i+3]&0x0F) { case 0x0E: /* DX = +1 */ case 0x02: /* DX = -1 */ break; case 0x0F: /* DY = +1 (map button 4) */ FB_vgamousecallback(button | (1<<3), 1, 0, 0); break; case 0x01: /* DY = -1 (map button 5) */ FB_vgamousecallback(button | (1<<4), 1, 0, 0); break; } break; case MOUSE_MS: /* Microsoft protocol has 0x40 in high byte */ if ( (mousebuf[i] & 0x40) != 0x40 ) { /* Go to next byte */ i -= (packetsize-1); continue; } /* Get current mouse state */ button = ((mousebuf[i] & 0x20) >> 3) | ((mousebuf[i] & 0x10) >> 4); dx = (signed char)(((mousebuf[i] & 0x03) << 6) | (mousebuf[i + 1] & 0x3F)); dy = (signed char)(((mousebuf[i] & 0x0C) << 4) | (mousebuf[i + 2] & 0x3F)); break; case MOUSE_BM: /* BusMouse protocol has 0xF8 in high byte */ if ( (mousebuf[i] & 0xF8) != 0x80 ) { /* Go to next byte */ i -= (packetsize-1); continue; } /* Get current mouse state */ button = (~mousebuf[i]) & 0x07; dx = (signed char)mousebuf[i+1]; dy = -(signed char)mousebuf[i+2]; break; default: /* Uh oh.. */ dx = 0; dy = 0; break; } FB_vgamousecallback(button, relative, dx, dy); } if ( i < nread ) { SDL_memcpy(mousebuf, &mousebuf[i], (nread-i)); start = (nread-i); } else { start = 0; } return;}/* Handle switching to another VC, returns when our VC is back */static void switch_vt_prep(_THIS){ SDL_Surface *screen = SDL_VideoSurface; SDL_PrivateAppActive(0, (SDL_APPACTIVE|SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS)); /* Save the contents of the screen, and go to text mode */ wait_idle(this); screen_arealen = ((screen->h + (2*this->offset_y)) * screen->pitch); screen_contents = (Uint8 *)SDL_malloc(screen_arealen); if ( screen_contents ) { SDL_memcpy(screen_contents, screen->pixels, screen_arealen); } FB_SavePaletteTo(this, 256, screen_palette); ioctl(console_fd, FBIOGET_VSCREENINFO, &screen_vinfo); ioctl(keyboard_fd, KDSETMODE, KD_TEXT); ioctl(keyboard_fd, VT_UNLOCKSWITCH, 1);}static void switch_vt_done(_THIS){ SDL_Surface *screen = SDL_VideoSurface; /* Restore graphics mode and the contents of the screen */ ioctl(keyboard_fd, VT_LOCKSWITCH, 1); ioctl(keyboard_fd, KDSETMODE, KD_GRAPHICS); ioctl(console_fd, FBIOPUT_VSCREENINFO, &screen_vinfo); FB_RestorePaletteFrom(this, 256, screen_palette); if ( screen_contents ) { SDL_memcpy(screen->pixels, screen_contents, screen_arealen); SDL_free(screen_contents); screen_contents = NULL; } /* Get updates to the shadow surface while switched away */ if ( SDL_ShadowSurface ) { SDL_UpdateRect(SDL_ShadowSurface, 0, 0, 0, 0); } SDL_PrivateAppActive(1, (SDL_APPACTIVE|SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS));}static void switch_vt(_THIS, unsigned short which){ struct vt_stat vtstate; /* Figure out whether or not we're switching to a new console */ if ( (ioctl(keyboard_fd, VT_GETSTATE, &vtstate) < 0) || (which == vtstate.v_active) ) { return; } /* New console, switch to it */ SDL_mutexP(hw_lock); switch_vt_prep(this); if ( ioctl(keyboard_fd, VT_ACTIVATE, which) == 0 ) { ioctl(keyboard_fd, VT_WAITACTIVE, which); switched_away = 1; } else { switch_vt_done(this); } SDL_mutexV(hw_lock);}static void handle_keyboard(_THIS){ unsigned char keybuf[BUFSIZ]; int i, nread; int pressed; int scancode; SDL_keysym keysym; nread = read(keyboard_fd, keybuf, BUFSIZ); for ( i=0; i<nread; ++i ) { scancode = keybuf[i] & 0x7F; if ( keybuf[i] & 0x80 ) { pressed = SDL_RELEASED; } else { pressed = SDL_PRESSED; } TranslateKey(scancode, &keysym); /* Handle Ctrl-Alt-FN for vt switch */ switch (keysym.sym) { case SDLK_F1: case SDLK_F2: case SDLK_F3: case SDLK_F4: case SDLK_F5: case SDLK_F6: case SDLK_F7: case SDLK_F8: case SDLK_F9: case SDLK_F10: case SDLK_F11: case SDLK_F12: if ( (SDL_GetModState() & KMOD_CTRL) && (SDL_GetModState() & KMOD_ALT) ) { if ( pressed ) { switch_vt(this, (keysym.sym-SDLK_F1)+1); } break; } /* Fall through to normal processing */ default: posted += SDL_PrivateKeyboard(pressed, &keysym); break; } }}void FB_PumpEvents(_THIS){ fd_set fdset; int max_fd; static struct timeval zero; do { if ( switched_away ) { struct vt_stat vtstate; SDL_mutexP(hw_lock); if ( (ioctl(keyboard_fd, VT_GETSTATE, &vtstate) == 0) && vtstate.v_active == current_vt ) { switched_away = 0; switch_vt_done(this); } SDL_mutexV(hw_lock); } posted = 0; FD_ZERO(&fdset); max_fd = 0; if ( keyboard_fd >= 0 ) { FD_SET(keyboard_fd, &fdset); if ( max_fd < keyboard_fd ) { max_fd = keyboard_fd; } } if ( mouse_fd >= 0 ) { FD_SET(mouse_fd, &fdset); if ( max_fd < mouse_fd ) { max_fd = mouse_fd; } } if ( select(max_fd+1, &fdset, NULL, NULL, &zero) > 0 ) { if ( keyboard_fd >= 0 ) { if ( FD_ISSET(keyboard_fd, &fdset) ) { handle_keyboard(this); } } if ( mouse_fd >= 0 ) { if ( FD_ISSET(mouse_fd, &fdset) ) { handle_mouse(this); } } } } while ( posted );}void FB_InitOSKeymap(_THIS){ int i; /* Initialize the Linux key translation table */ /* First get the ascii keys and others not well handled */ for (i=0; i<SDL_arraysize(keymap); ++i) { switch(i) { /* These aren't handled by the x86 kernel keymapping (?) */ case SCANCODE_PRINTSCREEN: keymap[i] = SDLK_PRINT; break; case SCANCODE_BREAK: keymap[i] = SDLK_BREAK; break; case SCANCODE_BREAK_ALTERNATIVE: keymap[i] = SDLK_PAUSE; break; case SCANCODE_LEFTSHIFT: keymap[i] = SDLK_LSHIFT; break; case SCANCODE_RIGHTSHIFT: keymap[i] = SDLK_RSHIFT; break; case SCANCODE_LEFTCONTROL: keymap[i] = SDLK_LCTRL; break; case SCANCODE_RIGHTCONTROL: keymap[i] = SDLK_RCTRL; break; case SCANCODE_RIGHTWIN: keymap[i] = SDLK_RSUPER; break; case SCANCODE_LEFTWIN: keymap[i] = SDLK_LSUPER; break; case SCANCODE_LEFTALT: keymap[i] = SDLK_LALT; break; case SCANCODE_RIGHTALT: keymap[i] = SDLK_RALT; break; case 127: keymap[i] = SDLK_MENU; break; /* this should take care of all standard ascii keys */ default: keymap[i] = KVAL(vga_keymap[0][i]); break; } } for (i=0; i<SDL_arraysize(keymap); ++i) { switch(keymap_temp[i]) { case K_F1: keymap[i] = SDLK_F1; break; case K_F2: keymap[i] = SDLK_F2; break; case K_F3: keymap[i] = SDLK_F3; break; case K_F4: keymap[i] = SDLK_F4; break; case K_F5: keymap[i] = SDLK_F5; break; case K_F6: keymap[i] = SDLK_F6; break; case K_F7: keymap[i] = SDLK_F7; break; case K_F8: keymap[i] = SDLK_F8; break; case K_F9: keymap[i] = SDLK_F9; break; case K_F10: keymap[i] = SDLK_F10; break; case K_F11: keymap[i] = SDLK_F11; break; case K_F12: keymap[i] = SDLK_F12; break; case K_DOWN: keymap[i] = SDLK_DOWN; break; case K_LEFT: keymap[i] = SDLK_LEFT; break; case K_RIGHT: keymap[i] = SDLK_RIGHT; break; case K_UP: keymap[i] = SDLK_UP; break; case K_P0: keymap[i] = SDLK_KP0; break; case K_P1: keymap[i] = SDLK_KP1; break; case K_P2: keymap[i] = SDLK_KP2; break; case K_P3: keymap[i] = SDLK_KP3; break; case K_P4: keymap[i] = SDLK_KP4; break; case K_P5: keymap[i] = SDLK_KP5; break; case K_P6: keymap[i] = SDLK_KP6; break; case K_P7: keymap[i] = SDLK_KP7; break; case K_P8: keymap[i] = SDLK_KP8; break; case K_P9: keymap[i] = SDLK_KP9; break; case K_PPLUS: keymap[i] = SDLK_KP_PLUS; break; case K_PMINUS: keymap[i] = SDLK_KP_MINUS; break; case K_PSTAR: keymap[i] = SDLK_KP_MULTIPLY; break; case K_PSLASH: keymap[i] = SDLK_KP_DIVIDE; break; case K_PENTER: keymap[i] = SDLK_KP_ENTER; break; case K_PDOT: keymap[i] = SDLK_KP_PERIOD; break; case K_SHIFT: if ( keymap[i] != SDLK_RSHIFT ) keymap[i] = SDLK_LSHIFT; break; case K_SHIFTL: keymap[i] = SDLK_LSHIFT; break; case K_SHIFTR: keymap[i] = SDLK_RSHIFT; break; case K_CTRL: if ( keymap[i] != SDLK_RCTRL ) keymap[i] = SDLK_LCTRL; break; case K_CTRLL: keymap[i] = SDLK_LCTRL; break; case K_CTRLR: keymap[i] = SDLK_RCTRL; break; case K_ALT: keymap[i] = SDLK_LALT; break; case K_ALTGR: keymap[i] = SDLK_RALT; break; case K_INSERT: keymap[i] = SDLK_INSERT; break; case K_REMOVE: keymap[i] = SDLK_DELETE; break; case K_PGUP: keymap[i] = SDLK_PAGEUP; break; case K_PGDN: keymap[i] = SDLK_PAGEDOWN; break; case K_FIND: keymap[i] = SDLK_HOME; break; case K_SELECT: keymap[i] = SDLK_END; break; case K_NUM: keymap[i] = SDLK_NUMLOCK; break; case K_CAPS: keymap[i] = SDLK_CAPSLOCK; break; case K_F13: keymap[i] = SDLK_PRINT; break; case K_HOLD: keymap[i] = SDLK_SCROLLOCK; break; case K_PAUSE: keymap[i] = SDLK_PAUSE; break; case 127: keymap[i] = SDLK_BACKSPACE; break; default: break; } }}static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym){ /* Set the keysym information */ keysym->scancode = scancode; keysym->sym = keymap[scancode]; keysym->mod = KMOD_NONE; /* If UNICODE is on, get the UNICODE value for the key */ keysym->unicode = 0; if ( SDL_TranslateUNICODE ) { int map; SDLMod modstate; modstate = SDL_GetModState(); map = 0; if ( modstate & KMOD_SHIFT ) { map |= (1<<KG_SHIFT); } if ( modstate & KMOD_CTRL ) { map |= (1<<KG_CTRL); } if ( modstate & KMOD_LALT ) { map |= (1<<KG_ALT); } if ( modstate & KMOD_RALT ) { map |= (1<<KG_ALTGR); } if ( KTYP(vga_keymap[map][scancode]) == KT_LETTER ) { if ( modstate & KMOD_CAPS ) { map ^= (1<<KG_SHIFT); } } if ( KTYP(vga_keymap[map][scancode]) == KT_PAD ) { if ( modstate & KMOD_NUM ) { keysym->unicode=KVAL(vga_keymap[map][scancode]); } } else { keysym->unicode = KVAL(vga_keymap[map][scancode]); } } return(keysym);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -