aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRuben Pollan2018-10-10 15:10:48 -0500
committerRuben Pollan2018-10-15 12:01:59 -0500
commitd4613247e513da1d1517c86e67472b31e98a4167 (patch)
tree59e87ae488e2a2d80f03f8e0985c321b2301ecb3
parent3fd1443dac5c8297999189fe28d5836b2b075b66 (diff)
downloadsystray-d4613247e513da1d1517c86e67472b31e98a4167.tar.bz2
linux: delete temp files as soon as they are not needed
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.
-rw-r--r--systray_linux.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/systray_linux.c b/systray_linux.c
index b56005b..3ed8ada 100644
--- a/systray_linux.c
+++ b/systray_linux.c
@@ -8,8 +8,7 @@
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;
+static char temp_file_name[PATH_MAX] = "";
typedef struct {
GtkWidget *menu_item;
@@ -31,24 +30,32 @@ 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();
return 0;
}
+void _unlink_temp_file() {
+ if (strlen(temp_file_name) != 0) {
+ int ret = unlink(temp_file_name);
+ if (ret == -1) {
+ printf("failed to remove temp icon file %s: %s\n", temp_file_name, strerror(errno));
+ }
+ temp_file_name[0] = '\0';
+ }
+}
+
// runs in main thread, should always return FALSE to prevent gtk to execute it again
gboolean do_set_icon(gpointer data) {
GBytes* bytes = (GBytes*)data;
- char* temp_file_name = malloc(PATH_MAX);
+ _unlink_temp_file();
strcpy(temp_file_name, "/tmp/systray_XXXXXX");
int fd = mkstemp(temp_file_name);
if (fd == -1) {
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);
@@ -146,17 +153,7 @@ 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));
- }
- }
+ _unlink_temp_file();
// 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();