⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_fbevents.c

📁 linux下面的一个开源的多媒体中间件
💻 C
📖 第 1 页 / 共 3 页
字号:
				       (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 + -