plan 9 kernel history: overview | file list | diff list

1991/1108/ss/screen.c (diff list | history)

1991/1108/sys/src/9/ss/screen.c:1,3651991/1211/sys/src/9/ss/screen.c:1,383 (short | long | prev | next)
1990/1223    
#include	"u.h" 
#include	"lib.h" 
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
#include	"io.h" 
#include	"ureg.h" 
#include	"errno.h" 
 
#include	<libg.h> 
#include	<gnot.h> 
1991/0708    
#include	"screen.h" 
1990/1223    
 
#define	MINX	8 
 
extern	GFont	defont0; 
GFont		*defont; 
 
struct{ 
	Point	pos; 
	int	bwid; 
}out; 
 
void	(*kprofp)(ulong); 
 
GBitmap	gscreen = 
{ 
1990/1226    
	(ulong*)SCREENSEGM, 
1990/1223    
	0, 
1991/0112    
	1152/32, 
1990/1223    
	0, 
1991/0112    
	{0, 0, 1152, 900}, 
1990/1223    
	0 
}; 
 
void 
screeninit(void) 
{ 
1990/1226    
	defont = &defont0; 
1990/1223    
	gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, 0); 
	out.pos.x = MINX; 
	out.pos.y = 0; 
	out.bwid = defont0.info[' '].width; 
} 
 
void 
screenputc(int c) 
{ 
	char buf[2]; 
	int nx; 
 
	if(c == '\n'){ 
		out.pos.x = MINX; 
		out.pos.y += defont0.height; 
		if(out.pos.y > gscreen.r.max.y-defont0.height) 
			out.pos.y = gscreen.r.min.y; 
		gbitblt(&gscreen, Pt(0, out.pos.y), &gscreen, 
		    Rect(0, out.pos.y, gscreen.r.max.x, out.pos.y+2*defont0.height), 0); 
	}else if(c == '\t'){ 
		out.pos.x += (8-((out.pos.x-MINX)/out.bwid&7))*out.bwid; 
		if(out.pos.x >= gscreen.r.max.x) 
			screenputc('\n'); 
	}else if(c == '\b'){ 
		if(out.pos.x >= out.bwid+MINX){ 
			out.pos.x -= out.bwid; 
			screenputc(' '); 
			out.pos.x -= out.bwid; 
		} 
	}else{ 
		if(out.pos.x >= gscreen.r.max.x-out.bwid) 
			screenputc('\n'); 
		buf[0] = c&0x7F; 
		buf[1] = 0; 
1990/1226    
		out.pos = gstring(&gscreen, out.pos, defont, buf, S); 
1990/1223    
	} 
} 
 
void 
1991/0604    
screenputs(char *s, int n) 
1990/1223    
{ 
1991/0604    
	while(n-- > 0) 
		screenputc(*s++); 
1990/1223    
} 
 
1990/1231    
/* 
1991/0112    
 * Map is indexed by keyboard char, output is ASCII. 
 * Gnotisms: Return sends newline and Line Feed sends carriage return. 
 * Delete and Backspace both send backspace. 
 * Num Lock sends delete (rubout). 
 * Alt Graph is VIEW (scroll). 
 * Compose builds Latin-1 characters. 
1990/1231    
 */ 
uchar keymap[128] = { 
/*	00    L1    02    L2    04    F1    F2    07	*/ 
	0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF, 
1991/0112    
/*	F3    09    F4    0b    F5    altgr F6    0f  	*/ 
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, 
1990/1231    
/*	F7    F8    F9    Alt   14    R1    R2    R3	*/ 
	0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e, 
/*	18    L3    L4    1b    1c    Esc   1     2	*/ 
	0xFF, 0x8f, 0x90, 0xFF, 0xFF, 0x1b, '1',  '2', 
/*	3     4     5     6     7     8     9     0	*/ 
	'3',  '4',  '5',  '6',  '7',  '8',  '9',  '0', 
/*	-     =     `     bs    2c    R4    R5    R6	*/ 
	'-',  '=',  '`',  '\b', 0xFF, 0x91, 0x92, 0x93, 
1991/0112    
/*	30    L5    del   L6   34    tab   q     w  	*/ 
	0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 'q',  'w', 
1990/1231    
/*	e     r     t     y     u     i     o     p    	*/ 
	'e',  'r',  't',  'y',  'u',  'i',  'o',  'p', 
1991/0112    
/*	[     ]     dele  comp  R7    R8    R9    r -	*/ 
	'[',  ']',  '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, 
1990/1231    
/*	L7    L8    4a    4b    ctrl  a     s     d	*/ 
	0x99, 0x9a, 0xFF, 0xFF, 0xF0, 'a',  's',  'd', 
/*	f     g     h     j     k     l     ;     '   	*/ 
	'f',  'g',  'h',  'j',  'k',  'l',  ';',  '\'', 
1991/0112    
/*	\     ret   enter R10   R11   R12   ins   L9	*/ 
1990/1231    
	'\\', '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e,  
1991/0112    
/*	60    L10   numlk shift z     x     c     v	*/ 
	0xFF, 0x9f, 0x7F, 0xF1, 'z',  'x',  'c', 'v', 
1990/1231    
/*	b     n     m     ,     .     /     shift lf	*/ 
	'b',  'n',  'm',  ',',  '.',  '/',  0xF1, '\r', 
1991/0112    
/*	R13   R14   R15   73    74    75    help  caps	*/ 
1990/1231    
	0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 
1991/0112    
/*	lloz  79    rloz  7b    7c    r +   7e    7f	*/ 
1990/1231    
	0xA3, ' ',  0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
}; 
 
uchar keymapshift[128] = { 
/*	00    L1    02    L2    04    F1    F2    07	*/ 
	0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF, 
1991/0112    
/*	F3    09    F4    0b    F5    altgr F6    0f  	*/ 
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, 
1990/1231    
/*	F7    F8    F9    Alt   14    R1    R2    R3	*/ 
	0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e, 
/*	18    L3    L4    1b    1c    Esc   1     2	*/ 
	0xFF, 0x8f, 0x90, 0xFF, 0xFF, 0x1b, '!',  '@', 
/*	3     4     5     6     7     8     9     0	*/ 
	'#',  '$',  '%',  '^',  '&',  '*',  '(',  ')', 
/*	-     =     `     bs    2c    R4    R5    R6	*/ 
	'_',  '+',  '~',  '\b', 0xFF, 0x91, 0x92, 0x93, 
1991/0112    
/*	30    L5    del   L6    34    tab   q     w  	*/ 
	0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 'Q',  'W', 
1990/1231    
/*	e     r     t     y     u     i     o     p    	*/ 
	'E',  'R',  'T',  'Y',  'U',  'I',  'O',  'P', 
1991/0112    
/*	[     ]     dele  comp  R7    R8    R9    r -	*/ 
	'{',  '}',  '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, 
1990/1231    
/*	L7    L8    4a    4b    ctrl  a     s     d	*/ 
	0x99, 0x9a, 0xFF, 0xFF, 0xF0, 'A',  'S',  'D', 
/*	f     g     h     j     k     l     ;     '   	*/ 
	'F',  'G',  'H',  'J',  'K',  'L',  ':',  '"', 
1991/0112    
/*	\     ret   enter R10   R11   R12   ins   L9	*/ 
1990/1231    
	'|', '\n',  0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e,  
1991/0112    
/*	60    L10   numlk shift z     x     c     v	*/ 
	0xFF, 0x9f, 0x7F, 0xF1, 'Z',  'X',  'C', 'V', 
1990/1231    
/*	b     n     m     ,     .     /     shift lf	*/ 
	'B',  'N',  'M',  '<',  '>',  '?',  0xF1, '\r', 
1991/0112    
/*	R13   R14   R15   73    74    75    help  caps	*/ 
1990/1231    
	0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 
1991/0112    
/*	lloz  79    rloz  7b    7c    r +  7e    7f	*/ 
1990/1231    
	0xA3, ' ',  0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
}; 
 
uchar keymapctrl[128] = { 
/*	00    L1    02    L2    04    F1    F2    07	*/ 
	0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF, 
1991/0112    
/*	F3    09    F4    0b    F5    altgr F6    0f  	*/ 
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, 
1990/1231    
/*	F7    F8    F9    Alt   14    R1    R2    R3	*/ 
	0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e, 
/*	18    L3    L4    1b    1c    Esc   1     2	*/ 
	0xFF, 0x8f, 0x90, 0xFF, 0xFF, 0x1b, '!',  '@', 
/*	3     4     5     6     7     8     9     0	*/ 
	'#',  '$',  '%',  '^',  '&',  '*',  '(',  ')', 
/*	-     =     `     bs    2c    R4    R5    R6	*/ 
	'_',  '+',  '~', '\b', 0xFF, 0x91, 0x92, 0x93, 
1991/0112    
/*	30    L5    del   L6    34    tab   q     w  	*/ 
	0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 0x11, 0x17, 
1990/1231    
/*	e     r     t     y     u     i     o     p    	*/ 
	0x05, 0x12, 0x14, 0x19, 0x15, 0x09, 0x0F, 0x10, 
1991/0112    
/*	[     ]     dele  comp  R7    R8    R9    r -	*/ 
	0x1B, 0x1D, '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, 
1990/1231    
/*	L7    L8    4a    4b    ctrl  a     s     d	*/ 
	0x99, 0x9a, 0xFF, 0xFF, 0xF0, 0x01, 0x13, 0x04, 
/*	f     g     h     j     k     l     ;     '   	*/ 
	0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C,':',  '"', 
1991/0112    
/*	\     ret   enter R10   R11   R12   ins   L9	*/ 
1990/1231    
	0x1C, '\n',  0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e,  
1991/0112    
/*	60    L10   numlk shift z     x     c     v	*/ 
	0xFF, 0x9f, 0x7F, 0xF1, 0x1A, 0x18, 0x03, 0x16, 
1990/1231    
/*	b     n     m     ,     .     /     shift lf	*/ 
	0x02, 0x0E, 0x0D, '<',  '>',  '?',  0xF1, '\r', 
1991/0112    
/*	R13   R14   R15   73    74    75    help  caps	*/ 
1990/1231    
	0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 
1991/0112    
/*	lloz  79    rloz  7b    7c    r +  7e    7f	*/ 
1990/1231    
	0xA3, ' ',  0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
}; 
 
uchar keymapshiftctrl[128] = { 
/*	00    L1    02    L2    04    F1    F2    07	*/ 
	0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF, 
1991/0112    
/*	F3    09    F4    0b    F5    altgr F6    0f  	*/ 
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, 
1990/1231    
/*	F7    F8    F9    Alt   14    R1    R2    R3	*/ 
	0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e, 
/*	18    L3    L4    1b    1c    Esc   1     2	*/ 
	0xFF, 0x8f, 0x90, 0xFF, 0xFF, 0x1b, '!',  0x00, 
/*	3     4     5     6     7     8     9     0	*/ 
	'#',  '$',  '%',  0x1E, '&',  '*',  '(',  ')', 
/*	-     =     `     bs    2c    R4    R5    R6	*/ 
	0x1F, '+',  '~', '\b', 0xFF, 0x91, 0x92, 0x93, 
1991/0112    
/*	30    L5    del   L6     34    tab   q     w  	*/ 
	0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 0x11, 0x17, 
1990/1231    
/*	e     r     t     y     u     i     o     p    	*/ 
	0x05, 0x12, 0x14, 0x19, 0x15, 0x09, 0x0F, 0x10, 
1991/0112    
/*	[     ]     dele  comp  R7    R8    R9    r -	*/ 
	0x1B, 0x1D, '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, 
1990/1231    
/*	L7    L8    4a    4b    ctrl  a     s     d	*/ 
	0x99, 0x9a, 0xFF, 0xFF, 0xF0, 0x01, 0x13, 0x04, 
/*	f     g     h     j     k     l     ;     '   	*/ 
	0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C,':',  '"', 
1991/0112    
/*	\     ret   enter R10   R11   R12   ins   L9	*/ 
	0x1C, '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e,  
/*	60    L10   numlk shift z     x     c     v	*/ 
	0xFF, 0x9f, 0x7F, 0xF1, 0x1A, 0x18, 0x03, 0x16, 
1990/1231    
/*	b     n     m     ,     .     /     shift lf	*/ 
	0x02, 0x0E, 0x0D, '<',  '>',  '?',  0xF1, '\r', 
1991/0112    
/*	R13   R14   R15   73    74    75    help  caps	*/ 
1990/1231    
	0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 
1991/0112    
/*	lloz  79    rloz  7b    7c    r +  7e    7f	*/ 
1990/1231    
	0xA3, ' ',  0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
}; 
 
static uchar *kbdmap[4] = { 
	keymap, 
	keymapshift, 
	keymapctrl, 
	keymapshiftctrl 
}; 
 
1991/0604    
int 
kbdstate(IOQ *q, int c) 
1990/1231    
{ 
	static shift = 0x00; 
	static caps = 0; 
	static long startclick; 
1991/0713    
	static int repeatc; 
1991/0112    
	static int kbdstate, k1, k2; 
1990/1231    
	int tc; 
1991/1211    
	static int lstate; 
	static uchar kc[4]; 
	uchar ch, code; 
	int i, nk; 
1990/1231    
 
	tc = kbdmap[shift][c&0x7F]; 
1991/1211    
	ch = kbdmap[shift][c&0x7F]; 
1990/1231    
	if(c==0x7F){	/* all keys up */ 
1991/0713    
    norepeat: 
		kbdrepeat(0); 
1990/1231    
		return; 
	} 
	if(tc == 0xFF)	/* shouldn't happen; ignore */ 
1991/1211    
	if(ch == 0xFF)	/* shouldn't happen; ignore */ 
1990/1231    
		return; 
	if(c & 0x80){	/* key went up */ 
		if(tc == 0xF0){		/* control */ 
1991/1211    
		if(ch == 0xF0){		/* control */ 
1990/1231    
			shift &= ~2; 
1991/0713    
			goto norepeat; 
1990/1223    
		} 
1990/1231    
		if(tc == 0xF1){	/* shift */ 
1991/1211    
		if(ch == 0xF1){	/* shift */ 
1990/1231    
			shift &= ~1; 
1991/0713    
			goto norepeat; 
1990/1231    
		} 
		if(tc == 0xF2){	/* caps */ 
1991/1211    
		if(ch == 0xF2){	/* caps */ 
1991/0713    
			goto norepeat; 
1990/1231    
		} 
1991/0713    
		goto norepeat; 
1990/1223    
	} 
1990/1231    
	if(tc == 0xF0){		/* control */ 
1991/1211    
	if(ch == 0xF0){		/* control */ 
1990/1231    
		shift |= 2; 
1991/0713    
		goto norepeat; 
1990/1223    
	} 
1990/1231    
	if(tc==0xF1){	/* shift */ 
1991/1211    
	if(ch==0xF1){	/* shift */ 
1990/1231    
		shift |= 1; 
1991/0713    
		goto norepeat; 
1990/1231    
	} 
	if(tc==0xF2){	/* caps */ 
1991/1211    
	if(ch==0xF2){	/* caps */ 
1990/1231    
		caps ^= 1; 
1991/0713    
		goto norepeat; 
1990/1231    
	} 
	if(caps && 'a'<=tc && tc<='z') 
		tc |= ' '; 
	repeatc = tc; 
1991/1211    
	if(caps && 'a'<=ch && ch<='z') 
		ch |= ' '; 
	repeatc = ch; 
1991/0713    
	kbdrepeat(1); 
1991/0112    
	if(tc == 0xB6)	/* Compose */ 
		kbdstate = 1; 
1991/1211    
	if(ch == 0xB6)	/* Compose */ 
		lstate = 1; 
1991/0112    
	else{ 
		switch(kbdstate){ 
1991/1211    
		switch(lstate){ 
1991/0112    
		case 1: 
			k1 = tc; 
			kbdstate = 2; 
1991/1211    
			kc[0] = ch; 
			lstate = 2; 
			if(ch == 'X') 
				lstate = 3; 
1991/0112    
			break; 
		case 2: 
			k2 = tc; 
			tc = latin1(k1, k2); 
			if(c == 0){ 
1991/0604    
				kbdputc(&kbdq, k1); 
1991/0112    
				tc = k2; 
			} 
			/* fall through */ 
1991/1211    
			kc[1] = ch; 
			c = latin1(kc); 
			nk = 2; 
		putit: 
			lstate = 0; 
			if(c != -1) 
				kbdputc(&kbdq, c); 
			else for(i=0; i<nk; i++) 
				kbdputc(&kbdq, kc[i]); 
			break; 
		case 3: 
		case 4: 
		case 5: 
			kc[lstate-2] = ch; 
			lstate++; 
			break; 
		case 6: 
			kc[4] = ch; 
			c = unicode(kc); 
			nk = 5; 
			goto putit; 
1991/0112    
		default: 
			kbdstate = 0; 
1991/0604    
			kbdputc(&kbdq, tc); 
1991/1211    
			kbdputc(&kbdq, ch); 
			break; 
1991/0112    
		} 
	} 
1991/0604    
} 
 
void 
buzz(int freq, int dur) 
{ 
} 
 
void 
lights(int mask) 
{ 
1991/0707    
} 
 
int 
screenbits(void) 
{ 
	return 1;	/* bits per pixel */ 
} 
 
void 
getcolor(ulong p, ulong *pr, ulong *pg, ulong *pb) 
{ 
	ulong ans; 
 
	/* 
	 * The slc monochrome says 0 is white (max intensity) 
	 */ 
	if(p == 0) 
		ans = ~0; 
	else 
		ans = 0; 
	*pr = *pg = *pb = ans; 
} 
 
 
int 
setcolor(ulong p, ulong r, ulong g, ulong b) 
{ 
	return 0;	/* can't change mono screen colormap */ 
} 
 
int 
hwcursset(uchar *s, uchar *c, int ox, int oy) 
{ 
	return 0; 
} 
 
int 
hwcursmove(int x, int y) 
{ 
	return 0; 
} 
 
void 
mouseclock(void)	/* called splhi */ 
{ 
	mouseupdate(1); 
1990/1223    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)