From 34ed78a1f27a1cd3eb184b6b5304fafdb5b75022 Mon Sep 17 00:00:00 2001
From: Ruben Pollan <meskio@sindominio.net>
Date: Wed, 10 Oct 2018 16:36:11 -0500
Subject: [PATCH] [feat] systray linux: unlink temp files as soon as they are
 in use

Stop generating one file in /tmp for each icon change. Let's move the
clean up to the set icon instead of waiting for the quit clean up.
Unlink will remove the file from /tmp, but app_indicator will hold a
descriptor until it finishes with it.

This is a cherry-pick from a pull-request upstream:
https://github.com/getlantern/systray/pull/63

- Resolves: #60
---
 .../getlantern/systray/systray_linux.c        | 20 +++++--------------
 1 file changed, 5 insertions(+), 15 deletions(-)

diff --git a/vendor/github.com/getlantern/systray/systray_linux.c b/vendor/github.com/getlantern/systray/systray_linux.c
index b56005b9..a78f3cf2 100644
--- a/vendor/github.com/getlantern/systray/systray_linux.c
+++ b/vendor/github.com/getlantern/systray/systray_linux.c
@@ -8,8 +8,6 @@
 static AppIndicator *global_app_indicator;
 static GtkWidget *global_tray_menu = NULL;
 static GList *global_menu_items = NULL;
-// Keep track of all generated temp files to remove when app quits
-static GArray *global_temp_icon_file_names = NULL;
 
 typedef struct {
 	GtkWidget *menu_item;
@@ -31,7 +29,6 @@ int nativeLoop(void) {
 	app_indicator_set_status(global_app_indicator, APP_INDICATOR_STATUS_ACTIVE);
 	global_tray_menu = gtk_menu_new();
 	app_indicator_set_menu(global_app_indicator, GTK_MENU(global_tray_menu));
-	global_temp_icon_file_names = g_array_new(TRUE, FALSE, sizeof(char*));
 	systray_ready();
 	gtk_main();
 	systray_on_exit();
@@ -48,7 +45,6 @@ gboolean do_set_icon(gpointer data) {
 		printf("failed to create temp icon file %s: %s\n", temp_file_name, strerror(errno));
 		return FALSE;
 	}
-	g_array_append_val(global_temp_icon_file_names, temp_file_name);
 	gsize size = 0;
 	gconstpointer icon_data = g_bytes_get_data(bytes, &size);
 	ssize_t written = write(fd, icon_data, size);
@@ -59,6 +55,11 @@ gboolean do_set_icon(gpointer data) {
 	}
 	app_indicator_set_icon_full(global_app_indicator, temp_file_name, "");
 	app_indicator_set_attention_icon_full(global_app_indicator, temp_file_name, "");
+
+	int ret = unlink(temp_file_name);
+	if (ret == -1) {
+		printf("failed to remove temp icon file %s: %s\n", temp_file_name, strerror(errno));
+	}
 	g_bytes_unref(bytes);
 	return FALSE;
 }
@@ -146,17 +147,6 @@ gboolean do_show_menu_item(gpointer data) {
 
 // runs in main thread, should always return FALSE to prevent gtk to execute it again
 gboolean do_quit(gpointer data) {
-	int i;
-	for (i = 0; i < INT_MAX; ++i) {
-		char * temp_file_name = g_array_index(global_temp_icon_file_names, char*, i);
-		if (temp_file_name == NULL) {
-			break;
-		}
-		int ret = unlink(temp_file_name);
-		if (ret == -1) {
-			printf("failed to remove temp icon file %s: %s\n", temp_file_name, strerror(errno));
-		}
-	}
 	// app indicator doesn't provide a way to remove it, hide it as a workaround
 	app_indicator_set_status(global_app_indicator, APP_INDICATOR_STATUS_PASSIVE);
 	gtk_main_quit();
-- 
GitLab