00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <glib.h>
00023 #include <stdio.h>
00024 #include <string.h>
00025
00026 #include <libaudcore/hook.h>
00027
00028 #include "main.h"
00029 #include "misc.h"
00030
00031 #define MAX_ENTRIES 30
00032
00033 static GQueue history = G_QUEUE_INIT;
00034 static bool_t loaded, modified;
00035
00036 static void history_save (void)
00037 {
00038 if (! modified)
00039 return;
00040
00041 config_clear_section ("history");
00042
00043 GList * node = history.head;
00044 for (int i = 0; i < MAX_ENTRIES; i ++)
00045 {
00046 if (! node)
00047 break;
00048
00049 char name[32];
00050 snprintf (name, sizeof name, "entry%d", i);
00051 set_string ("history", name, node->data);
00052
00053 node = node->next;
00054 }
00055
00056 modified = FALSE;
00057 }
00058
00059 static void history_load (void)
00060 {
00061 if (loaded)
00062 return;
00063
00064 for (int i = 0; ; i ++)
00065 {
00066 char name[32];
00067 snprintf (name, sizeof name, "entry%d", i);
00068 char * path = get_string ("history", name);
00069
00070 if (! path[0])
00071 {
00072 g_free (path);
00073 break;
00074 }
00075
00076 g_queue_push_tail (& history, path);
00077 }
00078
00079 loaded = TRUE;
00080 hook_associate ("config save", (HookFunction) history_save, NULL);
00081 }
00082
00083 void history_cleanup (void)
00084 {
00085 if (! loaded)
00086 return;
00087
00088 hook_dissociate ("config save", (HookFunction) history_save);
00089
00090 g_queue_foreach (& history, (GFunc) g_free, NULL);
00091 g_queue_clear (& history);
00092
00093 loaded = FALSE;
00094 modified = FALSE;
00095 }
00096
00097 const char * history_get (int entry)
00098 {
00099 history_load ();
00100 return g_queue_peek_nth (& history, entry);
00101 }
00102
00103 void history_add (const char * path)
00104 {
00105 history_load ();
00106
00107 GList * next;
00108 for (GList * node = history.head; node; node = next)
00109 {
00110 next = node->next;
00111 if (! strcmp (node->data, path))
00112 {
00113 g_free (node->data);
00114 g_queue_delete_link (& history, node);
00115 }
00116 }
00117
00118 g_queue_push_head (& history, g_strdup (path));
00119 modified = TRUE;
00120 }