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

📄 io.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <draw.h>#include <thread.h>#include <mouse.h>#include <keyboard.h>#include <frame.h>#include "flayer.h"#include "samterm.h"int	cursorfd;int	plumbfd = -1;int	input;int	got;int	block;int	kbdc;int	resized;uchar	*hostp;uchar	*hoststop;uchar	*plumbbase;uchar	*plumbp;uchar	*plumbstop;Channel	*plumbc;Channel	*hostc;Mousectl	*mousectl;Mouse	*mousep;Keyboardctl *keyboardctl;void	panic(char*);voidinitio(void){	threadsetname("main");	mousectl = initmouse(nil, display->image);	if(mousectl == nil){		fprint(2, "samterm: mouse init failed: %r\n");		threadexitsall("mouse");	}	mousep = mousectl;	keyboardctl = initkeyboard(nil);	if(keyboardctl == nil){		fprint(2, "samterm: keyboard init failed: %r\n");		threadexitsall("kbd");	}	hoststart();	if(plumbstart() < 0)		extstart();}voidgetmouse(void){	if(readmouse(mousectl) < 0)		panic("mouse");}voidmouseunblock(void){	got &= ~(1<<RMouse);}voidkbdblock(void){		/* ca suffit */	block = (1<<RKeyboard)|(1<<RPlumb);}intbutton(int but){	getmouse();	return mousep->buttons&(1<<(but-1));}voidexternload(int i){	plumbbase = malloc(plumbbuf[i].n);	if(plumbbase == 0)		return;	memmove(plumbbase, plumbbuf[i].data, plumbbuf[i].n);	plumbp = plumbbase;	plumbstop = plumbbase + plumbbuf[i].n;	got |= 1<<RPlumb;}intwaitforio(void){	Alt alts[NRes+1];	Rune r;	int i;	ulong type;again:	alts[RPlumb].c = plumbc;	alts[RPlumb].v = &i;	alts[RPlumb].op = CHANRCV;	if((block & (1<<RPlumb)) || plumbc == nil)		alts[RPlumb].op = CHANNOP;	alts[RHost].c = hostc;	alts[RHost].v = &i;	alts[RHost].op = CHANRCV;	if(block & (1<<RHost))		alts[RHost].op = CHANNOP;	alts[RKeyboard].c = keyboardctl->c;	alts[RKeyboard].v = &r;	alts[RKeyboard].op = CHANRCV;	if(block & (1<<RKeyboard))		alts[RKeyboard].op = CHANNOP;	alts[RMouse].c = mousectl->c;	alts[RMouse].v = &mousectl->Mouse;	alts[RMouse].op = CHANRCV;	if(block & (1<<RMouse))		alts[RMouse].op = CHANNOP;	alts[RResize].c = mousectl->resizec;	alts[RResize].v = nil;	alts[RResize].op = CHANRCV;	if(block & (1<<RResize))		alts[RResize].op = CHANNOP;	alts[NRes].op = CHANEND;	if(got & ~block)		return got & ~block;	flushimage(display, 1);	type = alt(alts);	switch(type){	case RHost:		hostp = hostbuf[i].data;		hoststop = hostbuf[i].data + hostbuf[i].n;		block = 0;		break;	case RPlumb:		externload(i);		break;	case RKeyboard:		kbdc = r;		break;	case RMouse:		break;	case RResize:		resized = 1;		/* do the resize in line if we've finished initializing and we're not in a blocking state */		if(hasunlocked && block==0 && RESIZED())			resize();		goto again;	}	got |= 1<<type;	return got; }intrcvchar(void){	int c;	if(!(got & (1<<RHost)))		return -1;	c = *hostp++;	if(hostp == hoststop)		got &= ~(1<<RHost);	return c;}char*rcvstring(void){	*hoststop = 0;	got &= ~(1<<RHost);	return (char*)hostp;}intgetch(void){	int c;	while((c = rcvchar()) == -1){		block = ~(1<<RHost);		waitforio();		block = 0;	}	return c;}intexternchar(void){	Rune r;    loop:	if(got & ((1<<RPlumb) & ~block)){		plumbp += chartorune(&r, (char*)plumbp);		if(plumbp >= plumbstop){			got &= ~(1<<RPlumb);			free(plumbbase);		}		if(r == 0)			goto loop;		return r;	}	return -1;}int kpeekc = -1;intecankbd(void){	Rune r;	if(kpeekc >= 0)		return 1;	if(nbrecv(keyboardctl->c, &r) > 0){		kpeekc = r;		return 1;	}	return 0;}intekbd(void){	int c;	Rune r;	if(kpeekc >= 0){		c = kpeekc;		kpeekc = -1;		return c;	}	if(recv(keyboardctl->c, &r) < 0){		fprint(2, "samterm: keybard recv error: %r\n");		panic("kbd");	}	return r;}intkbdchar(void){	int c, i;	c = externchar();	if(c > 0)		return c;	if(got & (1<<RKeyboard)){		c = kbdc;		kbdc = -1;		got &= ~(1<<RKeyboard);		return c;	}	while(plumbc!=nil && nbrecv(plumbc, &i)>0){		externload(i);		c = externchar();		if(c > 0)			return c;	}	if(!ecankbd())		return -1;	return ekbd();}intqpeekc(void){	return kbdc;}intRESIZED(void){	if(resized){		if(getwindow(display, Refnone) < 0)			panic("can't reattach to window");		resized = 0;		return 1;	}	return 0;}

⌨️ 快捷键说明

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