git: 9front

Download patch

ref: e78d01b0984c87fbac71d3d2867baa3385a45c95
parent: 9b6b5c5ba33dc61bbbaa623ff9361ebd1bad945e
parent: fb78a4dd465c05e300d258f3501322dc738ff5fb
author: cinap_lenrek <cinap_lenrek@rei2.9hal>
date: Tue Feb 28 16:45:25 EST 2012

merge

--- a/sys/man/1/paint
+++ b/sys/man/1/paint
@@ -3,7 +3,7 @@
 .SH NAME
 paint \- create image files by drawing with a mouse or other pointing device
 .SH SYNOPSIS
-.B paint
+.B paint [file]
 .SH DESCRIPTION
 .I Paint
 provides a window upon which can be drawn lines by moving the cursor while
@@ -24,6 +24,9 @@
 .TP
 .B c
 Clear the screen. Any unsaved work will be lost.
+.TP
+.B o
+Open a bitmap image file for editing.
 .TP
 .B s
 Save the current screen as a bitmap image. A pop-up box appears
--- a/sys/src/cmd/aux/kbdfs/kbdfs.c
+++ b/sys/src/cmd/aux/kbdfs/kbdfs.c
@@ -29,9 +29,8 @@
 
 struct Key {
 	int	down;
-	int	c;
-	Rune	r;
-	Rune	b;
+	Rune	b;	/* button, unshifted key */
+	Rune	r;	/* rune, shifted key */
 };
 
 struct Scan {
@@ -128,7 +127,7 @@
 [0x28]	'\'',	'`',	Kshift,	'\\',	'z',	'x',	'c',	'v',
 [0x30]	'b',	'n',	'm',	',',	'.',	'/',	Kshift,	'*',
 [0x38]	Kalt,	' ',	Kctl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5,
-[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Knum,	Kscroll,	'7',
+[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Knum,	Kscroll,'7',
 [0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1',
 [0x50]	'2',	'3',	'0',	'.',	0,	0,	0,	KF|11,
 [0x58]	KF|12,	0,	0,	0,	0,	0,	0,	0,
@@ -148,7 +147,7 @@
 [0x28]	'"',	'~',	Kshift,	'|',	'Z',	'X',	'C',	'V',
 [0x30]	'B',	'N',	'M',	'<',	'>',	'?',	Kshift,	'*',
 [0x38]	Kalt,	' ',	Kctl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5,
-[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Knum,	Kscroll,	'7',
+[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Knum,	Kscroll,'7',
 [0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1',
 [0x50]	'2',	'3',	'0',	'.',	0,	0,	0,	KF|11,
 [0x58]	KF|12,	0,	0,	0,	0,	0,	0,	0,
@@ -165,12 +164,12 @@
 [0x10]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x18]	0,	0,	0,	0,	'\n',	Kctl,	0,	0,
 [0x20]	0,	0,	0,	0,	0,	0,	0,	0,
-[0x28]	0,	0,	Kshift,	0,	0,	0,	0,	0,
+[0x28]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x30]	0,	0,	0,	0,	0,	'/',	0,	Kprint,
 [0x38]	Kaltgr,	0,	0,	0,	0,	0,	0,	0,
 [0x40]	0,	0,	0,	0,	0,	0,	Kbreak,	Khome,
 [0x48]	Kup,	Kpgup,	0,	Kleft,	0,	Kright,	0,	Kend,
-[0x50]	Kdown,	Kpgdown,	Kins,	Kdel,	0,	0,	0,	0,
+[0x50]	Kdown,	Kpgdown,Kins,	Kdel,	0,	0,	0,	0,
 [0x58]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x60]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x68]	0,	0,	0,	0,	0,	0,	0,	0,
@@ -190,7 +189,7 @@
 [0x38]	Kaltgr,	0,	0,	0,	0,	0,	0,	0,
 [0x40]	0,	0,	0,	0,	0,	0,	Kbreak,	Khome,
 [0x48]	Kup,	Kpgup,	0,	Kleft,	0,	Kright,	0,	Kend,
-[0x50]	Kdown,	Kpgdown,	Kins,	Kdel,	0,	0,	0,	0,
+[0x50]	Kdown,	Kpgdown,Kins,	Kdel,	0,	0,	0,	0,
 [0x58]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x60]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x68]	0,	0,	0,	0,	0,	0,	0,	0,
@@ -229,33 +228,36 @@
 	Key key;
 
 	/*
-	 *  e0's is the first of a 2 character sequence, e1 the first
+	 *  e0's is the first of a 2 character sequence, e1 and e2 the first
 	 *  of a 3 character sequence (on the safari)
 	 */
-	if(c == 0xe0){
-		scan->esc1 = 1;
+	if(scan->esc2){
+		scan->esc2--;
 		return;
-	} else if(c == 0xe1){
+	} else if(c == 0xe1 || c == 0xe2){
 		scan->esc2 = 2;
 		return;
+	} else if(c == 0xe0){
+		scan->esc1 = 1;
+		return;
 	}
 
 	key.down = (c & 0x80) == 0;
-	key.c = c & 0x7f;
+	c &= 0x7f;
 
-	if(key.c >= Nscan)
+	if(c >= Nscan)
 		return;
 
 	if(scan->esc1)
-		key.r = kbtabesc1[key.c];
+		key.r = kbtabesc1[c];
 	else if(scan->shift)
-		key.r = kbtabshift[key.c];
+		key.r = kbtabshift[c];
 	else if(scan->altgr)
-		key.r = kbtabaltgr[key.c];
+		key.r = kbtabaltgr[c];
 	else if(scan->ctl)
-		key.r = kbtabctl[key.c];
+		key.r = kbtabctl[c];
 	else
-		key.r = kbtab[key.c];
+		key.r = kbtab[c];
 
 	switch(key.r){
 	case Spec|0x60:
@@ -269,10 +271,10 @@
 		break;
 	}
 
-	if(scan->esc1)
+	if(scan->esc1 || kbtab[c] == 0)
 		key.b = key.r;
 	else
-		key.b = kbtab[key.c];
+		key.b = kbtab[c];
 
 	if(scan->caps && key.r<='z' && key.r>='a')
 		key.r += 'A' - 'a';
@@ -280,13 +282,9 @@
 	if(scan->ctl && scan->alt && key.r == Kdel)
 		reboot();
 
-	send(keychan, &key);
+	if(key.b)
+		send(keychan, &key);
 
-	if(scan->esc1)
-		scan->esc1 = 0;
-	else if(scan->esc2)
-		scan->esc2--;
-
 	switch(key.r){
 	case Kshift:
 		scan->shift = key.down;
@@ -307,6 +305,7 @@
 		scan->caps ^= key.down;
 		break;
 	}
+	scan->esc1 = 0;
 }
 
 void
@@ -363,8 +362,7 @@
 void
 keyproc(void *)
 {
-	Rune rb[Nscan*2+1];
-	int cb[Nscan];
+	Rune rb[Nscan+1];
 	Key key;
 	int i, nb;
 	char *s;
@@ -374,19 +372,16 @@
 	nb = 0;
 	while(recv(keychan, &key) > 0){
 		rb[0] = 0;
-		for(i=0; i<nb && cb[i] != key.c; i++)
+		for(i=0; i<nb && rb[i+1] != key.b; i++)
 			;
 		if(!key.down){
-			while(i < nb && cb[i] == key.c){
-				memmove(cb+i, cb+i+1, (nb-i+1) * sizeof(cb[0]));
+			while(i < nb && rb[i+1] == key.b){
 				memmove(rb+i+1, rb+i+2, (nb-i+1) * sizeof(rb[0]));
 				nb--;
 				rb[0] = 'K';
 			}
-		} else if(i == nb && nb < nelem(cb) && key.b){
-			cb[nb] = key.c;
-			rb[nb+1] = key.b;
-			nb++;
+		} else if(i == nb && nb < nelem(rb)-1 && key.b){
+			rb[++nb] = key.b;
 			rb[0] = 'k';
 		}
 		if(rb[0]){
@@ -1119,9 +1114,9 @@
 	case Qkbdin:
 		p = r->ifcall.data;
 		n = r->ifcall.count;
-		if(n <= 0)
-			n = 0;
 		r->ofcall.count = n;
+		if(n == 0)
+			break;
 		if(p[n-1] != 0){
 			/*
 			 * old format as used by bitsy keyboard:
@@ -1148,7 +1143,6 @@
 			if(k.r == 0)
 				break;
 			k.b = k.r;
-			k.c = 0x100 + k.r;	/* fake */
 			k.down = (p[0] == 'r');
 			if(f->aux == nil){
 				f->aux = emalloc9p(sizeof(Scan));
@@ -1156,13 +1150,13 @@
 			}
 			a = f->aux;
 			/*
-			 * handle ^X forms according to keymap,
-			 * assign base and scancode if any
+			 * handle ^X forms according to keymap and
+			 * assign button.
 			 */
 			for(i=0; i<Nscan; i++){
 				if((a->shift && kbtabshift[i] == k.r) || (kbtab[i] == k.r)){
-					k.c = i;
-					k.b = kbtab[i];
+					if(kbtab[i])
+						k.b = kbtab[i];
 					if(a->shift)
 						k.r = kbtabshift[i];
 					else if(a->altgr)
@@ -1172,7 +1166,8 @@
 					break;
 				}
 			}
-			send(keychan, &k);
+			if(k.b)
+				send(keychan, &k);
 			if(k.r == Kshift)
 				a->shift = k.down;
 			else if(k.r == Kaltgr)
--- a/sys/src/cmd/paint.c
+++ b/sys/src/cmd/paint.c
@@ -10,6 +10,22 @@
 		sysfatal("resize failed");
 }
 
+void
+loadimg(char *name)
+{
+	Image *b;
+	int fd;
+
+	fd=open(name, OREAD);
+	if(fd==-1)
+		sysfatal("can't open file");
+	if((b=readimage(display, fd, 0)) == nil)
+		sysfatal("can't read image");
+	draw(screen, screen->r, b, 0, b->r.min);
+	flushimage(display, 1);
+	close(fd);
+}
+
 /* stolen from mothra */
 void
 screendump(char *name, int full)
@@ -35,7 +51,7 @@
 }
 
 void
-main()
+main(int argc, char *argv[])
 {
 	Event e;
 	Point last;
@@ -52,6 +68,23 @@
 	einit(Emouse | Ekeyboard);
 	draw(screen, screen->r, display->white, 0, ZP);
 	flushimage(display, 1);
+
+	ARGBEGIN{
+	default:
+		goto Usage;
+	}ARGEND
+	switch(argc){
+	default:
+	Usage:
+		fprint(2, "Usage: [file]\n");
+		exits("usage");
+	case 0:
+		break;
+	case 1:
+		loadimg(argv[0]);
+		break;
+	}
+
 	while(1){
 		switch(event(&e)){
 		case Emouse:
@@ -79,6 +112,11 @@
 			}
 			if(e.kbdc == 'c')
 				draw(screen, screen->r, display->white, 0, ZP);
+			if(e.kbdc == 'o'){
+				if(eenter("Open file", file, sizeof(file), &e.mouse) <= 0)
+					break;
+				loadimg(file);
+			}
 			if(e.kbdc == 'q')
 				exits(nil);
 			if(e.kbdc == 's'){
--