terminal: Only add the new size to the title when we're resizing

Add a new state_changed_handler callback to the window to know when the
window has changed state; the terminal will use this to know when the
window started and ended its resize operation, and modify the terminal's
titlebar accordingly.
diff --git a/clients/terminal.c b/clients/terminal.c
index 924549e..cc603e9 100644
--- a/clients/terminal.c
+++ b/clients/terminal.c
@@ -834,12 +834,26 @@
 }
 
 static void
+update_title(struct terminal *terminal)
+{
+	if (window_is_resizing(terminal->window)) {
+		char *p;
+		if (asprintf(&p, "%s — [%dx%d]", terminal->title, terminal->width, terminal->height) > 0) {
+			window_set_title(terminal->window, p);
+			free(p);
+		}
+	} else {
+		window_set_title(terminal->window, terminal->title);
+	}
+}
+
+static void
 resize_handler(struct widget *widget,
 	       int32_t width, int32_t height, void *data)
 {
 	struct terminal *terminal = data;
 	int32_t columns, rows, m;
-	char *p;
+
 	m = 2 * terminal->margin;
 	columns = (width - m) / (int32_t) terminal->average_width;
 	rows = (height - m) / (int32_t) terminal->extents.height;
@@ -849,14 +863,17 @@
 		width = columns * terminal->average_width + m;
 		height = rows * terminal->extents.height + m;
 		widget_set_size(terminal->widget, width, height);
-		if (asprintf(&p, "%s — [%dx%d]", terminal->title, columns, rows) > 0) {
-		    window_set_title(terminal->window, p);
-		    terminal->size_in_title = 1;
-		    free(p);
-		}
 	}
 
 	terminal_resize_cells(terminal, columns, rows);
+	update_title(terminal);
+}
+
+static void
+state_changed_handler(struct window *window, void *data)
+{
+	struct terminal *terminal = data;
+	update_title(terminal);
 }
 
 static void
@@ -2745,14 +2762,6 @@
 enter_handler(struct widget *widget,
 	      struct input *input, float x, float y, void *data)
 {
-	struct terminal *terminal = data;
-
-	/* Reset title to get rid of resizing '[WxH]' in titlebar */
-	if (terminal->size_in_title) {
-		window_set_title(terminal->window, terminal->title);
-		terminal->size_in_title = 0;
-	}
-
 	return CURSOR_IBEAM;
 }
 
@@ -2860,6 +2869,7 @@
 	window_set_fullscreen_handler(terminal->window, fullscreen_handler);
 	window_set_output_handler(terminal->window, output_handler);
 	window_set_close_handler(terminal->window, close_handler);
+	window_set_state_changed_handler(terminal->window, state_changed_handler);
 
 	window_set_data_handler(terminal->window, data_handler);
 	window_set_drop_handler(terminal->window, drop_handler);
diff --git a/clients/window.c b/clients/window.c
index 6149618..c46cb72 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -241,6 +241,7 @@
 	window_close_handler_t close_handler;
 	window_fullscreen_handler_t fullscreen_handler;
 	window_output_handler_t output_handler;
+	window_state_changed_handler_t state_changed_handler;
 
 	struct surface *main_surface;
 	struct xdg_surface *xdg_surface;
@@ -3887,6 +3888,9 @@
 	}
 
 	window->next_attach_serial = serial;
+
+	if (window->state_changed_handler)
+		window->state_changed_handler(window, window->user_data);
 }
 
 static void
@@ -4178,6 +4182,12 @@
 		xdg_surface_unset_maximized(window->xdg_surface);
 }
 
+int
+window_is_resizing(struct window *window)
+{
+	return window->resizing;
+}
+
 void
 window_set_minimized(struct window *window)
 {
@@ -4247,6 +4257,13 @@
 }
 
 void
+window_set_state_changed_handler(struct window *window,
+				 window_state_changed_handler_t handler)
+{
+	window->state_changed_handler = handler;
+}
+
+void
 window_set_title(struct window *window, const char *title)
 {
 	free(window->title);
diff --git a/clients/window.h b/clients/window.h
index 5cf6b3e..b7b3f6a 100644
--- a/clients/window.h
+++ b/clients/window.h
@@ -219,6 +219,8 @@
 
 typedef void (*window_output_handler_t)(struct window *window, struct output *output,
 					int enter, void *data);
+typedef void (*window_state_changed_handler_t)(struct window *window,
+					       void *data);
 
 typedef void (*widget_resize_handler_t)(struct widget *widget,
 					int32_t width, int32_t height,
@@ -381,6 +383,9 @@
 void
 window_set_maximized(struct window *window, int maximized);
 
+int
+window_is_resizing(struct window *window);
+
 void
 window_set_minimized(struct window *window);
 
@@ -415,6 +420,9 @@
 void
 window_set_output_handler(struct window *window,
 			  window_output_handler_t handler);
+void
+window_set_state_changed_handler(struct window *window,
+				 window_state_changed_handler_t handler);
 
 void
 window_set_title(struct window *window, const char *title);