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

📄 kb.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
字号:
#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/time.h>#include <linux/kd.h>#include <sys/signal.h>#include <sys/ioctl.h>#include <sys/fcntl.h>#include <sys/vt.h>#include <termios.h>#undef K_NUMLOCK#include "defs.h"#include "rc.h"#include "fb.h"#include "input.h"#define TTY_DEVICE "/dev/tty"static int kbfd = -1;static int initial_kbmode;static struct termios initial_term, term;#define SCAN_ALT 56#define SCAN_FBASE 58static int alt;static struct vt_mode vtm, initial_vtm;extern int keymap[][2];rcvar_t kb_exports[] ={	RCV_END};static void vcrelease(int s){	signal(s, vcrelease);	ioctl(kbfd, VT_RELDISP, VT_ACKACQ);}static void vcacquire(int s){	signal(s, vcacquire);	ioctl(kbfd, VT_RELDISP, VT_ACKACQ);	fb.enabled = 1;}void kb_init(){	kbfd = open(TTY_DEVICE, O_RDWR);	if (!kbfd) die("no controlling terminal\n");	fcntl(kbfd, F_SETFL, O_NONBLOCK);	if (ioctl(kbfd, KDSETMODE, KD_GRAPHICS) < 0)		die("controlling terminal is not the graphics console\n");		ioctl(kbfd, KDGKBMODE, &initial_kbmode);	tcgetattr(kbfd, &initial_term);		term = initial_term;	term.c_lflag &= ~(ICANON | ECHO | ISIG);	term.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON);	term.c_cc[VMIN] = 0;	term.c_cc[VTIME] = 0;	tcsetattr(kbfd, TCSAFLUSH, &term);	ioctl(kbfd, KDSKBMODE, K_MEDIUMRAW);	ioctl(kbfd, VT_GETMODE, &initial_vtm);	signal(SIGUSR1, vcrelease);	signal(SIGUSR2, vcacquire);	vtm = initial_vtm;	vtm.mode = VT_PROCESS;	vtm.relsig = SIGUSR1;	vtm.acqsig = SIGUSR2;	ioctl(kbfd, VT_SETMODE, &vtm);}void kb_close(){	ioctl(kbfd, VT_SETMODE, &initial_vtm);	ioctl(kbfd, KDSKBMODE, initial_kbmode);	tcsetattr(kbfd, TCSAFLUSH, &initial_term);	ioctl(kbfd, KDSETMODE, KD_TEXT);}static void vcswitch(int c){	struct vt_stat vts;	ioctl(kbfd, VT_GETSTATE, &vts);	if (c != vts.v_active)	{		ioctl(kbfd, VT_ACTIVATE, c);		fb.enabled = 0;		fb.dirty = 1;	}}void kb_poll(){	int i;	event_t ev;	byte k;	int st;		while (read(kbfd, &k, 1) > 0)	{		st = !(k & 0x80);		k &= 0x7f;				if (k == SCAN_ALT) alt = st;		if (alt && k > SCAN_FBASE && k < SCAN_FBASE + 10)			vcswitch(k - SCAN_FBASE);		ev.type = st ? EV_PRESS : EV_RELEASE;		for (i = 0; keymap[i][0]; i++)			if (keymap[i][0] == k)				break;		if (!keymap[i][0]) continue;		ev.code = keymap[i][1];		ev_postevent(&ev);	}}

⌨️ 快捷键说明

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