From 1113ce117d5b860220bd979bd02dd067b8a9415e Mon Sep 17 00:00:00 2001
From: Chris Young <chris@unsatisfactorysoftware.co.uk>
Date: Fri, 12 Dec 2014 16:11:20 +0000
Subject: Start and stop GIF animation on first/last user.

---
diff --git a/content/content.c b/content/content.c
index a27647b..1a249e7 100644
--- a/content/content.c
+++ b/content/content.c
@@ -605,6 +605,9 @@ bool content_add_user(struct content *c,
 	user->next = c->user_list->next;
 	c->user_list->next = user;
 
+	if (c->handler->add_user != NULL)
+		c->handler->add_user(c);
+
 	return true;
 }
 
@@ -636,6 +639,10 @@ void content_remove_user(struct content *c,
 		assert(0);
 		return;
 	}
+
+	if (c->handler->remove_user != NULL)
+		c->handler->remove_user(c);
+
 	next = user->next;
 	user->next = next->next;
 	free(next);
diff --git a/content/content_protected.h b/content/content_protected.h
index 7311da6..e5ff1ca 100644
--- a/content/content_protected.h
+++ b/content/content_protected.h
@@ -82,6 +82,8 @@ struct content_handler {
 	bool (*matches_quirks)(const struct content *c, bool quirks);
 	const char *(*get_encoding)(const struct content *c, enum content_encoding_type op);
 	content_type (*type)(void);
+	void (*add_user)(struct content *c);
+	void (*remove_user)(struct content *c);
 
         /** handler dependant content sensitive internal data interface. */
 	void * (*get_internal)(const struct content *c, void *context);
diff --git a/image/gif.c b/image/gif.c
index c2f0ae4..4455ff2 100644
--- a/image/gif.c
+++ b/image/gif.c
@@ -398,6 +398,32 @@ static nserror nsgif_clone(const struct content *old, struct content **newc)
 	return NSERROR_OK;
 }
 
+static void nsgif_add_user(struct content *c)
+{
+	nsgif_content *gif = (nsgif_content *) c;
+
+	/* Ensure this content has already been converted.
+	 * If it hasn't, the animation will start at the conversion phase instead. */
+	if(gif->gif == NULL) return;
+
+	if(content_count_users(c) == 1) {
+		/* First user, and content already converted, so start the animation. */
+		if (gif->gif->frame_count_partial > 1) {
+			guit->browser->schedule(gif->gif->frames[0].frame_delay * 10,
+						nsgif_animate,
+						c);
+		}
+	}
+}
+
+static void nsgif_remove_user(struct content *c)
+{
+	if(content_count_users(c) == 1) {
+		/* Last user is about to be removed from this content, so stop the animation. */
+		guit->browser->schedule(-1, nsgif_animate, c);
+	}
+}
+
 static void *nsgif_get_internal(const struct content *c, void *context)
 {
 	nsgif_content *gif = (nsgif_content *) c;
@@ -421,6 +447,8 @@ static const content_handler nsgif_content_handler = {
 	.destroy = nsgif_destroy,
 	.redraw = nsgif_redraw,
 	.clone = nsgif_clone,
+	.add_user = nsgif_add_user,
+	.remove_user = nsgif_remove_user,
 	.get_internal = nsgif_get_internal,
 	.type = nsgif_content_type,
 	.no_share = false,
--
cgit v0.9.0.3-65-g4555
