code: drawterm

Download patch

ref: 74e47cdeb4f9b8d81766c24391bac05f87922115
parent: b5df2820e20709f48d2c4ce19fecb27e2f0d2105
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Nov 25 11:54:59 EST 2017

drawterm: debounce screen resize

--- a/gui-win32/screen.c
+++ b/gui-win32/screen.c
@@ -445,16 +445,7 @@
 	case WM_SIZE:
 		if(GetClientRect(hwnd, &winr) == 0)
 			break;
-		r = Rect(0, 0, winr.right - winr.left, winr.bottom - winr.top);
-		if(rectclip(&r, gscreen->r) == 0 || badrect(r))
-			break;
-		qlock(&drawlock);
-		gscreen->clipr = r;
-		qunlock(&drawlock);
-		screenwin();
-		deletescreenimage();
-		resetscreenimage();
-		mouseresize();
+		screenresize(Rect(0, 0, winr.right - winr.left, winr.bottom - winr.top));
 		break;
 
 	case WM_COMMAND:
--- a/gui-x11/x11.c
+++ b/gui-x11/x11.c
@@ -656,20 +656,9 @@
 static void
 xresize(XEvent *e)
 {
-	Rectangle r;
-
 	if(e->type != ConfigureNotify)
 		return;
-	r = Rect(0, 0, ((XConfigureEvent*)e)->width, ((XConfigureEvent*)e)->height);
-	if(rectclip(&r, gscreen->r) == 0 || badrect(r) || eqrect(r, gscreen->clipr))
-		return;
-	qlock(&drawlock);
-	gscreen->clipr = r;
-	qunlock(&drawlock);
-	screenwin();
-	deletescreenimage();
-	resetscreenimage();
-	mouseresize();
+	screenresize(Rect(0, 0, ((XConfigureEvent*)e)->width, ((XConfigureEvent*)e)->height));
 }
 
 static void
--- a/kern/screen.h
+++ b/kern/screen.h
@@ -58,7 +58,7 @@
 #define	ishwimage(i)	0
 
 void	terminit(void);
-void	screenwin(void);
+void	screenresize(Rectangle);
 
 void	mouseresize(void);
 void	mousetrack(int, int, int, ulong);
--- a/kern/term.c
+++ b/kern/term.c
@@ -47,7 +47,7 @@
 		combinerect(&flushr, r);
 }
 
-void
+static void
 screenwin(void)
 {
 	Point p;
@@ -86,7 +86,56 @@
 	qunlock(&drawlock);
 }
 
+static struct {
+	Rectangle	r;
+	Rendez		z;
+	int		f;
+} resize;
+
+static int
+isresized(void *arg)
+{
+	return resize.f != 0;
+}
+
+static void
+resizeproc(void *arg)
+{
+	USED(arg);
+	for(;;){
+		sleep(&resize.z, isresized, nil);
+		qlock(&drawlock);
+		resize.f = 0;
+		if(gscreen == nil
+		|| badrect(resize.r)
+		|| rectclip(&resize.r, gscreen->r) == 0
+		|| eqrect(resize.r, gscreen->clipr)){
+			qunlock(&drawlock);
+			continue;
+		}
+		gscreen->clipr = resize.r;
+		qunlock(&drawlock);
+
+		screenwin();
+		deletescreenimage();
+		resetscreenimage();
+		mouseresize();
+
+		osmsleep(1000);
+	}
+}
+
 void
+screenresize(Rectangle r)
+{
+	qlock(&drawlock);
+	resize.r = r;
+	resize.f = 1;
+	wakeup(&resize.z);
+	qunlock(&drawlock);
+}
+
+void
 terminit(void)
 {
 	memdefont = getmemdefont();
@@ -95,6 +144,7 @@
 	out.bwid = memdefont->info[' '].width;
 	screenwin();
 	screenputs = termscreenputs;
+	kproc("resize", resizeproc, nil);
 }
 
 static void