git: 9front

Download patch

ref: c23c0c8f71503cf84c373e7c45e3b5c3e43e5417
parent: e56cf94e9fa240749bfb0432e615e8f284cec4a5
parent: 0a6f5d8aac296e6b2721e831d7b0623a218a2ba8
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Mon Oct 22 03:11:51 EDT 2012

merge

--- a/sys/src/cmd/rio/dat.h
+++ b/sys/src/cmd/rio/dat.h
@@ -61,6 +61,8 @@
 	Wakeup,
 	Reshaped,
 	Moved,
+	Topped,
+	Repaint,
 	Refresh,
 	Movemouse,
 	Rawon,
@@ -67,7 +69,6 @@
 	Rawoff,
 	Holdon,
 	Holdoff,
-	Repaint,
 	Deleted,
 	Exited,
 };
@@ -76,7 +77,7 @@
 {
 	int		type;
 	Rectangle	r;
-	Image	*image;
+	void		*p;
 };
 
 struct Conswritemesg
@@ -132,7 +133,7 @@
 	Mousectl		mc;
 	Mouseinfo	mouse;
 	Channel		*ck;			/* chan(char*) */
-	Channel		*cctl;		/* chan(Wctlmesg)[20] */
+	Channel		*cctl;		/* chan(Wctlmesg)[4] */
 	Channel		*conswrite;	/* chan(Conswritemesg) */
 	Channel		*consread;	/* chan(Consreadmesg) */
 	Channel		*mouseread;	/* chan(Mousereadmesg) */
@@ -188,8 +189,7 @@
 int		wbswidth(Window*, Rune);
 int		wclickmatch(Window*, int, int, int, uint*);
 int		wclose(Window*);
-int		wctlmesg(Window*, int, Rectangle, Image*);
-int		wctlmesg(Window*, int, Rectangle, Image*);
+int		wctlmesg(Window*, int, Rectangle, void*);
 uint		wbacknl(Window*, uint, uint);
 uint		winsert(Window*, Rune*, int, uint);
 void		waddraw(Window*, Rune*, int);
@@ -213,7 +213,7 @@
 void		wscrdraw(Window*);
 void		wscroll(Window*, int);
 void		wselect(Window*);
-void		wsendctlmesg(Window*, int, Rectangle, Image*);
+void		wsendctlmesg(Window*, int, Rectangle, void*);
 void		wsetcursor(Window*, int);
 void		wsetname(Window*);
 void		wsetorigin(Window*, uint, int);
--- a/sys/src/cmd/rio/rio.c
+++ b/sys/src/cmd/rio/rio.c
@@ -345,7 +345,7 @@
 	while(s = recvp(kbdchan)){
 		if(*s == 'k' || *s == 'K')
 			shiftdown = utfrune(s+1, Kshift) != nil;
-		if(input == nil || input->deleted || sendp(input->ck, s) <= 0)
+		if(input == nil || sendp(input->ck, s) <= 0)
 			free(s);
 	}
 }
@@ -1113,10 +1113,8 @@
 		return;
 	incref(w);
 	i = sweep();
-	if(i){
+	if(i)
 		wsendctlmesg(w, Reshaped, i->r, i);
-		wcurrent(w);
-	}
 	wclose(w);
 }
 
@@ -1132,10 +1130,8 @@
 		return;
 	incref(w);
 	i = drag(w, &r);
-	if(i){
+	if(i)
 		wsendctlmesg(w, Moved, r, i);
-		wcurrent(w);
-	}
 	cornercursor(w, mouse->xy, 1);
 	wclose(w);
 }
@@ -1154,8 +1150,6 @@
 	incref(w);
 	i = allocimage(display, w->screenr, w->i->chan, 0, DNofill);
 	if(i){
-		if(w == input)
-			input = nil;
 		hidden[nhidden++] = w;
 		wsendctlmesg(w, Reshaped, ZR, i);
 	}
@@ -1180,7 +1174,6 @@
 		--nhidden;
 		memmove(hidden+j, hidden+j+1, (nhidden-j)*sizeof(Window*));
 		wsendctlmesg(w, Reshaped, w->i->r, i);
-		wcurrent(w);
 	}
 	wclose(w);
 	return i!=0;
@@ -1257,7 +1250,6 @@
 	threadcreate(winctl, w, 8192);
 	if(!hideit)
 		wcurrent(w);
-	flushimage(display, 1);
 	if(pid == 0){
 		arg = emalloc(5*sizeof(void*));
 		arg[0] = w;
--- a/sys/src/cmd/rio/wctl.c
+++ b/sys/src/cmd/rio/wctl.c
@@ -388,6 +388,7 @@
 		wbottomme(w);
 		return 1;
 	case Current:
+		wtopme(w);
 		wcurrent(w);
 		return 1;
 	case Hide:
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -113,10 +113,7 @@
 		wsetselect(w, w->q0, w->q1);
 		wscrdraw(w);
 	}
-	if(w == input)
-		wborder(w, Selborder);
-	else
-		wborder(w, Unselborder);
+	wborder(w, Selborder);
 	wsetname(w);
 	w->topped = ++topped;
 	w->resized = TRUE;
@@ -312,7 +309,7 @@
 			send(mrm.cm, &m.Mouse);
 			continue;
 		case WCtl:
-			if(wctlmesg(w, wcm.type, wcm.r, wcm.image) == Exited){
+			if(wctlmesg(w, wcm.type, wcm.r, wcm.p) == Exited){
 				for(i=0; i<nelem(kbdq); i++)
 					free(kbdq[i]);
 				chanfree(crm.c1);
@@ -1058,20 +1055,21 @@
 }
 
 void
-wsendctlmesg(Window *w, int type, Rectangle r, Image *image)
+wsendctlmesg(Window *w, int type, Rectangle r, void *p)
 {
 	Wctlmesg wcm;
 
 	wcm.type = type;
 	wcm.r = r;
-	wcm.image = image;
+	wcm.p = p;
 	send(w->cctl, &wcm);
 }
 
 int
-wctlmesg(Window *w, int m, Rectangle r, Image *i)
+wctlmesg(Window *w, int m, Rectangle r, void *p)
 {
 	char buf[64];
+	Image *i = p;
 
 	switch(m){
 	default:
@@ -1078,6 +1076,8 @@
 		error("unknown control message");
 		break;
 	case Wakeup:
+		if(p!=nil)
+			sendp((Channel*)p, w);
 		break;
 	case Moved:
 	case Reshaped:
@@ -1090,6 +1090,55 @@
 		wresize(w, i, m==Moved);
 		proccreate(deletetimeoutproc, estrdup(buf), 4096);
 		flushimage(display, 1);
+		if(Dx(r)<=0){	/* window got hidden, if we had the input, drop it */
+			if(w==input)
+				input = nil;
+			break;
+		}
+		/* fall through to get input if needed */
+	case Topped:
+		if(w->deleted || w==input)
+			break;
+		if(input!=nil){
+			Window *oi;
+			Channel *c;
+	
+			oi = input;
+			incref(oi);
+
+			/*
+			 * have to wait until old input responds before
+			 * changing input to us because the window might
+			 * currently be mouse tracking and it is not
+			 * prepared for getting its input revoked.
+			 */
+			c = chancreate(sizeof(void*), 0);
+			wsendctlmesg(oi, Wakeup, ZR, c);
+			recv(c, nil);
+			chanfree(c);
+
+			/*
+			 * if we are still top window and nobody else has taken
+			 * input from original window, take the input.
+			 */
+			if(!w->deleted && w->topped==topped && oi==input){
+				input = w;
+
+				oi->wctlready = 1;
+				wsendctlmesg(oi, Repaint, ZR, nil);
+			}
+			wclose(oi);
+		} else
+			input = w;
+		w->wctlready = 1;
+		if(m!=Topped && w==input)
+			break;
+		/* fall thrugh for redraw after input change */
+	case Repaint:
+		if(w->deleted || Dx(w->screenr)<=0)
+			break;
+		wrepaint(w);
+		flushimage(display, 1);
 		break;
 	case Refresh:
 		if(w->deleted || Dx(w->screenr)<=0 || !rectclip(&r, w->i->r) || w->mouseopen)
@@ -1114,12 +1163,10 @@
 		break;
 	case Holdon:
 	case Holdoff:
-		if(w == input)
-			wsetcursor(w, 0);
-		/* no break */
-	case Repaint:
 		if(w->deleted)
 			break;
+		if(w==input)
+			wsetcursor(w, 0);
 		wrepaint(w);
 		flushimage(display, 1);
 		break;
@@ -1206,22 +1253,8 @@
 void
 wcurrent(Window *w)
 {
-	Window *oi;
-
-	if(wkeyboard!=nil && w==wkeyboard)
-		return;
-	oi = input;
-	input = w;
-	if(w != oi){
-		if(oi){
-			oi->wctlready = 1;
-			wsendctlmesg(oi, Repaint, ZR, nil);
-		}
-		if(w){
-			w->wctlready = 1;
-			wsendctlmesg(w, Repaint, ZR, nil);
-		}
-	}
+	if(w!=nil && w!=input)
+		wsendctlmesg(w, Topped, ZR, nil);
 }
 
 void
--- a/sys/src/cmd/rio/xfid.c
+++ b/sys/src/cmd/rio/xfid.c
@@ -190,7 +190,6 @@
 				if(pid == 0)
 					pid = -1;	/* make sure we don't pop a shell! - UGH */
 				w = new(i, hideit, scrollit, pid, nil, nil, nil);
-				flushimage(display, 1);
 				newlymade = TRUE;
 			}else
 				err = Ewindow;
@@ -550,7 +549,6 @@
 			filsysrespond(x->fs, x, &fc, buf);
 			return;
 		}
-		flushimage(display, 1);
 		break;
 
 	default:
--