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

📄 keyboard.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <draw.h>#include <thread.h>#include <keyboard.h>voidclosekeyboard(Keyboardctl *kc){	if(kc == nil)		return;	postnote(PNPROC, kc->pid, "kill");#ifdef BUG	/* Drain the channel */	while(?kc->c)		<-kc->c;#endif	close(kc->ctlfd);	close(kc->consfd);	free(kc->file);	free(kc->c);	free(kc);}staticvoid_ioproc(void *arg){	int m, n;	char buf[20];	Rune r;	Keyboardctl *kc;	kc = arg;	threadsetname("kbdproc");	kc->pid = getpid();	n = 0;	for(;;){		while(n>0 && fullrune(buf, n)){			m = chartorune(&r, buf);			n -= m;			memmove(buf, buf+m, n);			send(kc->c, &r);		}		m = read(kc->consfd, buf+n, sizeof buf-n);		if(m <= 0){			yield();	/* if error is due to exiting, we'll exit here */			fprint(2, "keyboard read error: %r\n");			threadexits("error");		}		n += m;	}}Keyboardctl*initkeyboard(char *file){	Keyboardctl *kc;	char *t;	kc = mallocz(sizeof(Keyboardctl), 1);	if(kc == nil)		return nil;	if(file == nil)		file = "/dev/cons";	kc->file = strdup(file);	kc->consfd = open(file, ORDWR|OCEXEC);	t = malloc(strlen(file)+16);	if(kc->consfd<0 || t==nil){Error1:		free(kc);		return nil;	}	sprint(t, "%sctl", file);	kc->ctlfd = open(t, OWRITE|OCEXEC);	if(kc->ctlfd < 0){		fprint(2, "initkeyboard: can't open %s: %r\n", t);Error2:		close(kc->consfd);		free(t);		goto Error1;	}	if(ctlkeyboard(kc, "rawon") < 0){		fprint(2, "initkeyboard: can't turn on raw mode on %s: %r\n", t);		close(kc->ctlfd);		goto Error2;	}	free(t);	kc->c = chancreate(sizeof(Rune), 20);	proccreate(_ioproc, kc, 4096);	return kc;}intctlkeyboard(Keyboardctl *kc, char *m){	return write(kc->ctlfd, m, strlen(m));}

⌨️ 快捷键说明

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