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

📄 solkbd.c

📁 早期freebsd实现
💻 C
字号:
/* *  solKbd.c --	 * *	remade by A.Fujita, DEC-16-1992 */#include "sol.h"#include "solKbd.h"static Bool solDevInit();static void solDevGiveUp();static void solBell();static void solKbdCtrl();static void solCrossScreen();static void solWarpCursor();static void solMouseControl();static Bool solCursorOffScreen();static solDevPrv private;static BoolsolDevInit(prv)solDevPrvPtr prv;{	static Bool initFlag = FALSE;	int arg = 1;#ifdef	DEBUG	fprintf(stderr, "solDevInit\t[solKbd.c]\tStart\n");#endif	if (initFlag == FALSE) {		if((prv->fd = open("/dev/kbd",O_RDWR,0)) < 0) {			Error("Can't open /dev/kbd");			return FALSE;		}		if ((prv->flags = fcntl(prv->fd, F_GETFL, NULL)) < 0) {			Error("Keyboard fcntl F_GETFL fault.");			return FALSE;		}		prv->flags |= O_NONBLOCK;		if (fcntl(prv->fd, F_SETFL, prv->flags) < 0) {			Error("Keyboard fcntl F_SETFL fault.");			return FALSE;		}		initFlag = TRUE;	}	prv->kbd_type = 0;	prv->num++;#ifdef	DEBUG	fprintf(stderr, "solDevInit\t[solKbd.c]\tprv->num = %d\n", prv->num);	fprintf(stderr, "solDevInit\t[solKbd.c]\tEnd\n");#endif	return TRUE;}static voidsolDevGiveUp(prv)solDevPrvPtr prv;{#ifdef	DEBUG	fprintf(stderr, "solDevGiveUp\t[solKbd.c]\tStart\n");#endif	prv->num--;	if (prv->num == 0) {		close(prv->fd);	}#ifdef	DEBUG	fprintf(stderr, "solDevGiveUp\t[solKbd.c]\tEnd\n");#endif}unsigned char	codebuf[MAXEVENTS];intsolDevGetEvents(evp)	register solDevEvtPtr evp;{        solDevPrvPtr prv = &private;	register unsigned char *p = codebuf;	register int size, numEvt = 0;	static unsigned char	ms_queue[3];	static int ms_byte = 0;	size = read(prv->fd, codebuf, MAXEVENTS);	if (size > 0) {		while(p < (codebuf + size)) {			switch (ms_byte) {			case 0:				if ((*p >= 0x80) && (*p <= 0x87)) {					ms_queue[ms_byte] = *p++;					ms_byte++;				} else {					evp->type     = EvtKey;					evp->key_code = (*p++);					numEvt++;					evp++;				}				break;			case 1:				ms_queue[ms_byte] = *p++;				ms_byte++;				break;			case 2:				ms_queue[ms_byte] = *p++;				evp->type       = EvtMouse;				evp->ms_state   = (~ms_queue[0] & 0x7);				evp->ms_x_delta = (char) ms_queue[1];				evp->ms_y_delta = -((char) ms_queue[2]);				numEvt++;				evp++;				ms_byte = 0;				break;			}		}	}	return(numEvt);}intsolKbdProc(pKeyboard,what)DevicePtr     pKeyboard;int           what;{	static Bool initFlag = FALSE;        solDevPrvPtr prv = &private;#ifdef	DEBUG	fprintf(stderr, "solKbdProc\t[solKbd.c]\tStart\n");#endif	switch(what) {	case DEVICE_INIT:#ifdef	DEBUG		fprintf(stderr, "solKbdProc\t[solKbd.c]\tDEVICE_INIT\n");#endif		pKeyboard->devicePrivate = (pointer)prv;		if (initFlag == FALSE) {			prv->offset = 0;			if (!solDevInit(prv))				return (!Success);			initFlag = TRUE;		}		prv->keybdCtrl = defaultKeyboardControl;		prv->key_state = 0;		InitKeyboardDeviceStruct(pKeyboard,					 &(solKeySyms[prv->kbd_type]),					 (solKeyModMap[prv->kbd_type]),					 solBell, solKbdCtrl);		break;	case DEVICE_ON:#ifdef	DEBUG		fprintf(stderr, "solKbdProc\t[solKbd.c]\tDEVICE_ON\n");#endif		AddEnabledDevice(prv->fd);		pKeyboard->on = TRUE;		break;	case DEVICE_OFF:	case DEVICE_CLOSE:#ifdef	DEBUG		fprintf(stderr, "solKbdProc\t[solKbd.c]\tDEVICE_OFF or DEVICE_CLOSE\n");#endif		RemoveEnabledDevice(prv->fd);		pKeyboard->on = FALSE;		break;	}#ifdef	DEBUG	fprintf(stderr, "solKbdProc\t[solKbd.c]\tEnd\n");#endif	return (Success);}		voidsolKbdGiveUp(){        solDevPrvPtr prv = &private;#ifdef	DEBUG	fprintf(stderr, "solKbdGiveUp\t[solKbd.c]\tStart\n");#endif	solDevGiveUp(prv);#ifdef	DEBUG	fprintf(stderr, "solKbdGiveUp\t[solKbd.c]\tEnd\n");#endif}	static voidsolBell(loudness, pKeyboard)int           loudness;DevicePtr     pKeyboard;{#ifdef	DEBUG	fprintf(stderr, "solBell\t[solKbd.c]\tStart\n");	fprintf(stderr, "solBell\t[solKbd.c]\tEnd\n");#endif}static voidsolKbdCtrl(pKeyboard, ctrl)DevicePtr     pKeyboard;KeybdCtrl     *ctrl;{}BoolLegalModifier(key)BYTE key;{#ifdef	DEBUG	fprintf(stderr, "LegalModifier\t[solKbd.c]\tStart\n");	fprintf(stderr, "LegalModifier\t[solKbd.c]\tEnd\n");#endif	return(TRUE);}voidsolKbdEnqueueEvent(pKeyboard, evp)DevicePtr     pKeyboard;solDevEvtPtr	evp;{	xEvent xE;	CARD8 keyModifiers;	register unsigned char key = (evp->key_code & 0x7F);	solDevPrvPtr prv = (solDevPrvPtr)(pKeyboard->devicePrivate);	lastEventTime = GetTimeInMillis();	xE.u.keyButtonPointer.time = lastEventTime;	if ((evp->key_code & 0x80)) {		xE.u.u.type = KeyRelease;	} else {		xE.u.u.type = KeyPress;	}	xE.u.u.detail = key;	mieqEnqueue(&xE);}/*** for Mouse ***/miPointerScreenFuncRec solPointerScreenFuncs = {	solCursorOffScreen,	solCrossScreen,	solWarpCursor,};intsolMouseProc(pMouse,what)DevicePtr 	pMouse;int		what;{	static Bool initFlag = FALSE;        solDevPrvPtr prv = &private;	BYTE    map[5];	int mouse_mode;#ifdef	DEBUG	fprintf(stderr, "solMouseProc\t[solKbd.c]\tStart\n");#endif	switch(what) {	case DEVICE_INIT:#ifdef	DEBUG		fprintf(stderr, "solMouseProc\t[solKbd.c]\tDEVICE_INIT\n");#endif		pMouse->devicePrivate = (pointer)prv;		if (initFlag == FALSE) {			if (!solDevInit(prv))				return (!Success);			initFlag = TRUE;		}		map[1] = Button1;		map[2] = Button2;		map[3] = Button3;		InitPointerDeviceStruct( pMouse,map, 3, miPointerGetMotionEvents,				solMouseControl, miPointerGetMotionBufferSize());		break;	case DEVICE_ON:#ifdef	DEBUG		fprintf(stderr, "solMouseProc\t[solKbd.c]\tDEVICE_ON\n");#endif		mouse_mode = TRUE;		if (ioctl(prv->fd, KIOCMOUSE, &mouse_mode) < 0) {			Error("Mouse  ioctl KIOCMOUSE fault.");			return (!Success);		}		AddEnabledDevice (prv->fd);		pMouse->on = TRUE;		break;	case DEVICE_OFF:	case DEVICE_CLOSE:#ifdef	DEBUG		fprintf(stderr, "solMouseProc\t[solKbd.c]\tDEVICE_OFF or DEVICE_CLOSE\n");#endif		RemoveEnabledDevice(prv->fd);		pMouse->on = FALSE;		mouse_mode = FALSE;		if (ioctl(prv->fd, KIOCMOUSE, &mouse_mode) < 0) {			Error("Mouse  ioctl KIOCMOUSE fault.");			return (!Success);		}		break;	}#ifdef	DEBUG	fprintf(stderr, "solMouseProc\t[solKbd.c]\tEnd\n");#endif	return (Success);}voidsolMouseGiveUp(){        solDevPrvPtr prv = &private;#ifdef	DEBUG	fprintf(stderr, "solMouseGiveUp\t[solMouse.c]\tStart\n");#endif	solDevGiveUp(prv);#ifdef	DEBUG	fprintf(stderr, "solMouseGiveUp\t[solMouse.c]\tEnd\n");#endif}static BoolsolCursorOffScreen(pScreen, x, y)    ScreenPtr	*pScreen;    int		*x, *y;{	return FALSE;}static voidsolCrossScreen(pScreen,x,y)ScreenPtr	pScreen;int		x;int		y;{}staticsolMouseAccelerate (pMouse, delta)	DevicePtr pMouse;	int	  delta;{	register PtrCtrl *p;	register int  s;	p = &((DeviceIntPtr)pMouse)->ptrfeed->ctrl;  	if(delta > 0) {		s = 1;	} else {		s = -1;		delta = -delta;	}		if (delta > p->threshold) {		return ((s * (p->threshold +			      ((delta - p->threshold) * p->num) / p->den)));	} else {		return ((s * delta));	}}static voidsolMouseControl(){}static voidsolWarpCursor (pScreen, x, y)	ScreenPtr   pScreen;	int         x, y;{	int oldmask;	oldmask = sigblock (sigmask(SIGABRT));	miPointerWarpCursor (pScreen, x, y);	sigsetmask (oldmask);}voidsolMouseEnqueueEvent(pMouse, evp)DevicePtr	pMouse;solDevEvtPtr	evp;{	solDevPrvPtr prv = (solDevPrvPtr) (pMouse->devicePrivate);	xEvent xE;	int delta_X,delta_Y;	register int state, mask;	state = prv->mouse_state ^ ((int) evp->ms_state);	lastEventTime = GetTimeInMillis();	xE.u.keyButtonPointer.time = lastEventTime;	if (state != 0) {		if ((mask = state & BUTTON_L)) {			if ((int) evp->ms_state & mask)				xE.u.u.type = ButtonPress;			else				xE.u.u.type = ButtonRelease;			xE.u.u.detail = Button1;			mieqEnqueue(&xE);		}		if ((mask = state & BUTTON_M)) {			if ((int) evp->ms_state & mask)				xE.u.u.type = ButtonPress;			else				xE.u.u.type = ButtonRelease;			xE.u.u.detail = Button2;			mieqEnqueue(&xE);		}		if ((mask = state & BUTTON_R)) {			if ((int) evp->ms_state & mask)				xE.u.u.type = ButtonPress;			else				xE.u.u.type = ButtonRelease;			xE.u.u.detail = Button3;			mieqEnqueue(&xE);		}	}	xE.u.u.type = MotionNotify;	delta_X = solMouseAccelerate (pMouse, (int) evp->ms_x_delta);	delta_Y = solMouseAccelerate (pMouse, (int) evp->ms_y_delta);	miPointerDeltaCursor (delta_X, delta_Y, lastEventTime);	prv->mouse_state = (int) evp->ms_state;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -