Commit Diff


commit - c155dcfeb74766db97c08d7a09cca4b42ba45f0f
commit + 0f897f99ef576ae80a1e2d7cee29c498e3449b36
blob - 4d9074937866c66506da05243f5b78c9d56b7a01
blob + 7e795906356fe389fba5113e85181edd8673d1ce
--- src/cmd/devdraw/x11-init.c
+++ src/cmd/devdraw/x11-init.c
@@ -690,18 +690,10 @@ _xconfigure(XEvent *e)
 	XConfigureEvent *xe = (XConfigureEvent*)e;
 
 	if(!fullscreen){
-		// I can't figure this out: apparently window managers
-		// (e.g., rio, twm) send ConfigureEvents using absolute
-		// screen coordinates, but X sends events using coordinates
-		// relative to the parent window.  
-		if(xe->send_event)
-			windowrect = Rect(xe->x, xe->y, xe->x+xe->width, xe->y+xe->height);
-		else{
-			int rx, ry;
-			XWindow w;
-			if(XTranslateCoordinates(_x.display, _x.drawable, DefaultRootWindow(_x.display), xe->x, xe->y, &rx, &ry, &w))
-				windowrect = Rect(rx, ry, rx+xe->width, ry+xe->height);
-		}
+		int rx, ry;
+		XWindow w;
+		if(XTranslateCoordinates(_x.display, _x.drawable, DefaultRootWindow(_x.display), 0, 0, &rx, &ry, &w))
+			windowrect = Rect(rx, ry, rx+xe->width, ry+xe->height);
 	}
 
 	if(xe->width == Dx(_x.screenr) && xe->height == Dy(_x.screenr))
blob - b237cd1d9f7fa97acfeec2d3db8e1bfabd9cbc85
blob + c7ae135c86def4dedce9bd35d92cb831b10aa5f1
--- src/cmd/rio/event.c
+++ src/cmd/rio/event.c
@@ -124,9 +124,6 @@ configurereq(XConfigureRequestEvent *e)
 	e->value_mask &= ~CWSibling;
 
 	if(c){
-		c->x -= c->border;
-		c->y -= c->border;
-
 		if(e->value_mask & CWX)
 			c->x = e->x;
 		if(e->value_mask & CWY)
@@ -138,31 +135,19 @@ configurereq(XConfigureRequestEvent *e)
 		if(e->value_mask & CWBorderWidth)
 			c->border = e->border_width;
 	
-		if(!(e->value_mask & (CWX|CWY))){
-			e->x = 0;
-			e->y = 0;
-		}
-
-		if((e->value_mask & (CWWidth|CWHeight)) == (CWWidth|CWHeight)
-		&& c->dx >= c->screen->width && c->dy >= c->screen->height
-		&& e->x == 0 && e->y == 0){
+		if(c->dx >= c->screen->width && c->dy >= c->screen->height)
 			c->border = 0;
-			e->value_mask |= CWX|CWY;
-		}else
+		else
 			c->border = BORDER;
 
-		c->x += c->border;
-		c->y += c->border;
-		
-		e->x = c->x;
-		e->y = c->y;
-
 		if(e->value_mask & CWStackMode){
 			if(e->detail == Above)
 				top(c);
 			else
 				e->value_mask &= ~CWStackMode;
 		}
+		e->value_mask |= CWX|CWY|CWHeight|CWWidth;
+
 		if(c->parent != c->screen->root && c->window == e->window){
 			wc.x = c->x - c->border;
 			wc.y = c->y - c->border;
@@ -172,6 +157,7 @@ configurereq(XConfigureRequestEvent *e)
 			wc.sibling = None;
 			wc.stack_mode = e->detail;
 			XConfigureWindow(dpy, c->parent, e->value_mask, &wc);
+
 			if(e->value_mask & CWStackMode){
 				top(c);
 				active(c);
@@ -179,22 +165,21 @@ configurereq(XConfigureRequestEvent *e)
 		}
 	}
 
-	if(c && c->init){
+	if(c && c->parent != c->screen->root){
 		wc.x = c->border;
 		wc.y = c->border;
-	}
-	else {
-		wc.x = e->x;
-		wc.y = e->y;
+	}else {
+		wc.x = c->x;
+		wc.y = c->y;
 	}
-	wc.width = e->width;
-	wc.height = e->height;
+	wc.width = c->dx;
+	wc.height = c->dy;
 	wc.border_width = 0;
 	wc.sibling = None;
 	wc.stack_mode = Above;
 	e->value_mask &= ~CWStackMode;
 	e->value_mask |= CWBorderWidth;
-	XConfigureWindow(dpy, e->window, e->value_mask, &wc);
+	XConfigureWindow(dpy, c->window, e->value_mask, &wc);
 }
 
 void
blob - afb2bb8bbd3ae0f26b6c4751a332195affb84593
blob + a7f3162a7e9552fe76023a2fb08e3fa6c5d8e520
--- src/cmd/rio/main.c
+++ src/cmd/rio/main.c
@@ -523,7 +523,6 @@ cleanup(void)
 	for(i = 0; i < 2; i++){
 		for(c = cc[i]; c; c = c->next){
 			if(!withdrawn(c)){
-				gravitate(c, 1);
 				XReparentWindow(dpy, c->window, c->screen->root,
 						c->x, c->y);
 			}
blob - 6900b47cefa1108972c180c0becd49d18b97ebee
blob + 33951151ee71d782d1feaade7546a8d2bc3f0970
--- src/cmd/rio/manage.c
+++ src/cmd/rio/manage.c
@@ -122,10 +122,8 @@ manage(Client *c, int mapped)
 				cmapfocus(current);
 			return 0;
 		}
-	} else
-		gravitate(c, 0);
+	}
 
-
 	attrs.border_pixel =  c->screen->black;
 	attrs.background_pixel =  c->screen->white;
 	attrs.colormap = c->screen->def_cmap;
@@ -243,9 +241,7 @@ void
 withdraw(Client *c)
 {
 	XUnmapWindow(dpy, c->parent);
-	gravitate(c, 1);
 	XReparentWindow(dpy, c->window, c->screen->root, c->x, c->y);
-	gravitate(c, 0);
 	XRemoveFromSaveSet(dpy, c->window);
 	setstate(c, WithdrawnState);
 
@@ -253,68 +249,6 @@ withdraw(Client *c)
 	ignore_badwindow = 1;
 	XSync(dpy, False);
 	ignore_badwindow = 0;
-}
-
-void
-gravitate(Client *c, int invert)
-{
-	int gravity, dx, dy, delta;
-
-	gravity = NorthWestGravity;
-	if(c->size.flags & PWinGravity)
-		gravity = c->size.win_gravity;
-
-	delta = c->border-BORDER;
-	switch (gravity){
-	case NorthWestGravity:
-		dx = 0;
-		dy = 0;
-		break;
-	case NorthGravity:
-		dx = delta;
-		dy = 0;
-		break;
-	case NorthEastGravity:
-		dx = 2*delta;
-		dy = 0;
-		break;
-	case WestGravity:
-		dx = 0;
-		dy = delta;
-		break;
-	case CenterGravity:
-	case StaticGravity:
-		dx = delta;
-		dy = delta;
-		break;
-	case EastGravity:
-		dx = 2*delta;
-		dy = delta;
-		break;
-	case SouthWestGravity:
-		dx = 0;
-		dy = 2*delta;
-		break;
-	case SouthGravity:
-		dx = delta;
-		dy = 2*delta;
-		break;
-	case SouthEastGravity:
-		dx = 2*delta;
-		dy = 2*delta;
-		break;
-	default:
-		fprintf(stderr, "rio: bad window gravity %d for 0x%x\n", gravity, (int)c->window);
-		return;
-	}
-	dx += BORDER;
-	dy += BORDER;
-	if(invert){
-		dx = -dx;
-		dy = -dy;
-	}
-	c->x += dx;
-	c->y += dy;
 }
 
 static void