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

📄 gpm-xterm.c

📁 aumix-2.8 源碼下載
💻 C
字号:
/* $Aumix: aumix/src/gpm-xterm.c,v 1.2 2002/03/28 09:37:26 trevor Exp $ * gpm-xterm.c - pseudo client for non-Linux xterm-only mouse support. *               This code has been extracted from libgpm-0.18 and then *               took its own way. * * Copyright (C) 1994, 1995  rubini@linux.it (Alessandro Rubini) * Copyright (C) 1994        Janne Kukonlehto * * This file is part of aumix. * * Aumix is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * Aumix is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE.  See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * aumix; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307, USA. */#include "common.h"#if defined(HAVE_CURSES) && !defined(HAVE_LIBGPM)#include "gpm-xterm.h"#ifdef HAVE_USEKEYPADint             gpm_keypad(WINDOW * win, int new){	int             old;	old = win->_use_keypad;	win->_use_keypad = new;	return old;}#endif				/* HAVE_USEKEYPAD *//* This is from liblow.c (libgpm). */int             gpm_flag = 0, gpm_tried = 0, gpm_fd = -1, gpm_hflag = 0, gpm_zerobased = 0, gpm_visiblepointer = 0, gpm_morekeys = 0;struct timeval  gpm_timeout = {10, 0};Gpm_Handler    *gpm_handler = NULL;void           *gpm_data = NULL;static int      gpm_convert_event(unsigned char *mdata, Gpm_Event * ePtr);/* This is from libcurses.c (libgpm). */int             Gpm_Wgetch(WINDOW * win){	int             flag, result;	int             fd = STDIN_FILENO;	static Gpm_Event ev;	static fd_set   selSet;/* patched by JD 11/08/1998 */	static int      nbprevchar = 0, prevchar[MAXNBPREVCHAR];	static unsigned char mdata[4];	int             c;#ifdef HAVE_USEKEYPAD	int             keypad;#endif				/* HAVE_USEKEYPAD */	if (gpm_flag == 0)		return wgetch(win);	if (gpm_morekeys && gpm_handler)		return (*gpm_handler) (&ev, gpm_data);	gpm_hflag = 0;		/* not generated by handler (default) *//* JD patch 11/08/1998 */	if (nbprevchar)		/* if there are some consumed chars */		return prevchar[--nbprevchar];	while (1) {		do {			FD_ZERO(&selSet);			FD_SET(fd, &selSet);			gpm_timeout.tv_sec = SELECT_TIME;			flag = select(fd + 1, &selSet, (fd_set *) NULL, (fd_set *) NULL, (struct timeval *) NULL);		}		while (flag == 0);		if ((c = wgetch(win)) != 0x1b)			return c;		/* escape: go on */		FD_ZERO(&selSet);		FD_SET(fd, &selSet);		if ((flag = select(fd + 1, &selSet, (fd_set *) NULL, (fd_set *) NULL, (struct timeval *) NULL)) == 0)			return c;		if ((c = wgetch(win)) != '[') {			prevchar[nbprevchar++] = c;			return 0x1B;		}		/* patched by JD 11/08/1998 */		/* '[': go on */		FD_ZERO(&selSet);		FD_SET(fd, &selSet);		if ((flag = select(fd + 1, &selSet, (fd_set *) NULL, (fd_set *) NULL, (struct timeval *) NULL)) == 0) {			prevchar[nbprevchar++] = c;			return 0x1B;		}		/* patched by JD 11/08/1998 */		if ((c = wgetch(win)) != 'M')/* patched by JD 11/08/1998 Note: prevchar is a LIFO! */		{			prevchar[nbprevchar++] = c;			prevchar[nbprevchar++] = '[';			return 0x1B;		}		/* Now, it surely is a mouse event. */#ifdef HAVE_USEKEYPAD		keypad = gpm_keypad(win, FALSE);#endif				/* HAVE_USEKEYPAD */		for (c = 0; c < 3; c++)			mdata[c] = wgetch(win);#ifdef HAVE_USEKEYPAD		(void) gpm_keypad(win, keypad);#endif				/* HAVE_USEKEYPAD */		gpm_convert_event(mdata, &ev);		if (gpm_handler && (result = (*gpm_handler) (&ev, gpm_data))) {			gpm_hflag = 1;			return result;		}	}			/* while(1) */}/******* This is from liblow.c (libgpm). */int             Gpm_Open(Gpm_Connect * conn, int flag){	char           *tty;	if ((tty = (char *) getenv("TERM")) && !strncmp(tty, "xterm", 5)) {		if (gpm_tried)			return gpm_fd;	/* already open */		gpm_fd = -2;		GPM_XTERM_ON;		gpm_flag = 1;		return gpm_fd;	}	return -1;}int             Gpm_Close(void){	if (gpm_fd == -2)	/* xterm */		GPM_XTERM_OFF;	gpm_tried = 0;	gpm_fd = -1;	return 0;}int             Gpm_Getc(FILE * f){	int             flag, result;	static Gpm_Event ev;	int             fd = fileno(f);	static int      count;	static struct timeval to = {0, DELAY_MS * 1000};	static fd_set   selSet;/* patched by JD 11/08/1998 */	static int      nbprevchar = 0, prevchar[MAXNBPREVCHAR];	static unsigned char mdata[4];	int             c;	/* Hmm... I must be sure it is unbuffered. */	if (!(count++))		setvbuf(f, NULL, _IONBF, 0);	if (!gpm_flag)		return fgetc(f);	/* If the handler asked to provide more keys, give them back. */	if (gpm_morekeys && gpm_handler)		return (*gpm_handler) (&ev, gpm_data);	gpm_hflag = 0;/* patched by JD 11/08/1998 */	if (nbprevchar)		/* if there are some consumed chars */		return prevchar[--nbprevchar];	while (1) {		do {			FD_ZERO(&selSet);			FD_SET(fd, &selSet);			gpm_timeout.tv_sec = SELECT_TIME;			flag = select(fd + 1, &selSet, (fd_set *) NULL, (fd_set *) NULL, &to);		}		while (flag == 0);		if ((c = fgetc(f)) != 0x1b)			return c;		/* escape: go on */		FD_ZERO(&selSet);		FD_SET(fd, &selSet);		to.tv_usec = DELAY_MS * 1000;		if ((flag = select(fd + 1, &selSet, (fd_set *) NULL, (fd_set *) NULL, &to)) == 0)			return c;		if ((c = fgetc(f)) != '[')/* patched by JD 11/08/1998 */		{			prevchar[nbprevchar++] = c;			return 0x1B;		}/*      {ungetc(c,stdin); return 0x1B;} */		/* '[': go on */		FD_ZERO(&selSet);		FD_SET(fd, &selSet);		to.tv_usec = DELAY_MS * 1000;		if ((flag = select(fd + 1, &selSet, (fd_set *) NULL, (fd_set *) NULL, &to)) == 0)/* patched by JD 11/08/1998 */		{			prevchar[nbprevchar++] = c;			return 0x1B;		}/*	{ungetc(c,f); return 0x1B;}	*/		if ((c = fgetc(f)) != 'M')/* patched by JD 11/08/1998 Note: prevchar is a LIFO! */		{			prevchar[nbprevchar++] = c;			prevchar[nbprevchar++] = '[';			return 0x1B;		}		/* Now, it surely is a mouse event. */		for (c = 0; c < 3; c++)			mdata[c] = fgetc(f);		gpm_convert_event(mdata, &ev);		if (gpm_handler && (result = (*gpm_handler) (&ev, gpm_data))) {			gpm_hflag = 1;			return result;		}	}			/* while(1) */}int             Gpm_Repeat(int msec){	struct timeval  to = {0, 0};	fd_set          selSet;	int             fd = STDIN_FILENO;	to.tv_usec = msec * 1000;	FD_ZERO(&selSet);	FD_SET(fd, &selSet);	return (select(fd + 1, &selSet, (fd_set *) NULL, (fd_set *) NULL, &to) == 0);}/* This is the real protocol conversion. */static int      gpm_convert_event(unsigned char *mdata, Gpm_Event * ePtr){	static struct timeval tv1 = {0, 0}, tv2;	/*	 * The clicks variable has the following meaning: 0 means button 1 is down; 1 means button 2 is down; 2 means button 3 is down; 3 means all buttons are up.	 */	static int      clicks = 0;	int             c;	c = mdata[0] - 32;	if (c == 3) {		ePtr->type = GPM_UP | (GPM_SINGLE << clicks);		ePtr->buttons = 0;		GET_TIME(tv1);		clicks = 0;	} else {		ePtr->type = GPM_DOWN;		GET_TIME(tv2);		if (tv1.tv_sec && (DIF_TIME(tv1, tv2) < 250)) {	/* 250 ms for double click */			clicks++;			clicks %= 3;		} else			clicks = 0;		switch (c) {		case 0:			ePtr->buttons |= GPM_B_LEFT;			break;		case 1:			ePtr->buttons |= GPM_B_MIDDLE;			break;		case 2:			ePtr->buttons |= GPM_B_RIGHT;		default:			break;		}	}	/* Coordinates are 33-based.  Transform them to 1-based. */	ePtr->x = mdata[1] - 32;	ePtr->y = mdata[2] - 32;	return 0;}#endif				/* defined(HAVE_CURSES) && !defined(HAVE_LIBGPM) */

⌨️ 快捷键说明

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