window: Get rid of the window child allocation concept
diff --git a/clients/terminal.c b/clients/terminal.c
index b6e3139..06a7a1f 100644
--- a/clients/terminal.c
+++ b/clients/terminal.c
@@ -499,7 +499,7 @@
 	struct rectangle allocation;
 	int top_margin, side_margin, col, row, ref_x;
 
-	window_get_child_allocation(terminal->window, &allocation);
+	widget_get_allocation(terminal->widget, &allocation);
 	side_margin = allocation.x + (allocation.width - terminal->width * terminal->extents.max_x_advance) / 2;
 	top_margin = allocation.y + (allocation.height - terminal->height * terminal->extents.height) / 2;
 
@@ -694,7 +694,7 @@
 }
 
 static void
-terminal_resize(struct terminal *terminal, int width, int height)
+terminal_resize_cells(struct terminal *terminal, int width, int height)
 {
 	size_t size;
 	union utf8_char *data;
@@ -704,7 +704,6 @@
 	int i, l, total_rows;
 	struct rectangle allocation;
 	struct winsize ws;
-	int32_t pixel_width, pixel_height;
 
 	if (width < 1)
 		width = 1;
@@ -713,15 +712,6 @@
 	if (terminal->width == width && terminal->height == height)
 		return;
 
-	if (!terminal->fullscreen) {
-		pixel_width = width *
-			terminal->extents.max_x_advance + 2 * terminal->margin;
-		pixel_height = height *
-			terminal->extents.height + 2 * terminal->margin;
-		window_set_child_size(terminal->window,
-				      pixel_width, pixel_height);
-	}
-
 	data_pitch = width * sizeof(union utf8_char);
 	size = data_pitch * height;
 	data = malloc(size);
@@ -771,12 +761,46 @@
 	/* Update the window size */
 	ws.ws_row = terminal->height;
 	ws.ws_col = terminal->width;
-	window_get_child_allocation(terminal->window, &allocation);
+	widget_get_allocation(terminal->widget, &allocation);
 	ws.ws_xpixel = allocation.width;
 	ws.ws_ypixel = allocation.height;
 	ioctl(terminal->master, TIOCSWINSZ, &ws);
 }
 
+static void
+resize_handler(struct widget *widget,
+	       int32_t width, int32_t height, void *data)
+{
+	struct terminal *terminal = data;
+	int32_t columns, rows, m;
+
+	m = 2 * terminal->margin;
+	columns = (width - m) / (int32_t) terminal->extents.max_x_advance;
+	rows = (height - m) / (int32_t) terminal->extents.height;
+
+	if (!terminal->fullscreen) {
+		width = columns * terminal->extents.max_x_advance + m;
+		height = rows * terminal->extents.height + m;
+		widget_set_size(terminal->widget, width, height);
+	}
+
+	terminal_resize_cells(terminal, columns, rows);
+}
+
+static void
+terminal_resize(struct terminal *terminal, int columns, int rows)
+{
+	int32_t width, height, m;
+
+	if (terminal->fullscreen)
+		return;
+
+	m = 2 * terminal->margin;
+	width = columns * terminal->extents.max_x_advance + m;
+	height = rows * terminal->extents.height + m;
+	widget_schedule_resize(terminal->widget, width, height);
+}
+
 struct color_scheme DEFAULT_COLORS = {
 	{
 		{0,    0,    0,    1}, /* black */
@@ -915,7 +939,7 @@
 	cairo_font_extents_t extents;
 
 	surface = window_get_surface(terminal->window);
-	window_get_child_allocation(terminal->window, &allocation);
+	widget_get_allocation(terminal->widget, &allocation);
 	cr = cairo_create(surface);
 	cairo_rectangle(cr, allocation.x, allocation.y,
 			allocation.width, allocation.height);
@@ -1011,25 +1035,6 @@
 }
 
 static void
-resize_handler(struct widget *widget,
-	       int32_t pixel_width, int32_t pixel_height, void *data)
-{
-	struct terminal *terminal = data;
-	int32_t width, height;
-
-	width = (pixel_width - 2 * terminal->margin) /
-		(int32_t) terminal->extents.max_x_advance;
-	height = (pixel_height - 2 * terminal->margin) /
-		(int32_t) terminal->extents.height;
-
-	if (terminal->fullscreen)
-		window_set_child_size(terminal->window,
-				      pixel_width, pixel_height);
-
-	terminal_resize(terminal, width, height);
-}
-
-static void
 terminal_data(struct terminal *terminal, const char *data, size_t length);
 
 static void
@@ -1488,10 +1493,8 @@
 		switch (args[0]) {
 		case 4:  /* resize px */
 			if (set[1] && set[2]) {
-				window_set_child_size(terminal->window,
-						      args[2], args[1]);
-				resize_handler(terminal->widget,
-					       args[2], args[1], terminal);
+				widget_schedule_resize(terminal->widget,
+						       args[2], args[1]);
 			}
 			break;
 		case 8:  /* resize ch */
@@ -1500,13 +1503,13 @@
 			}
 			break;
 		case 13: /* report position */
-			window_get_child_allocation(terminal->window, &allocation);
+			widget_get_allocation(terminal->widget, &allocation);
 			snprintf(response, MAX_RESPONSE, "\e[3;%d;%dt",
 				 allocation.x, allocation.y);
 			terminal_write(terminal, response, strlen(response));
 			break;
 		case 14: /* report px */
-			window_get_child_allocation(terminal->window, &allocation);
+			widget_get_allocation(terminal->widget, &allocation);
 			snprintf(response, MAX_RESPONSE, "\e[4;%d;%dt",
 				 allocation.height, allocation.width);
 			terminal_write(terminal, response, strlen(response));
@@ -2354,8 +2357,6 @@
 	if (!terminal->fullscreen)
 		terminal_resize(terminal, 80, 24);
 
-	window_schedule_redraw(terminal->window);
-
 	return 0;
 }