diff options
Diffstat (limited to 'mini-commander/src/history.c')
-rw-r--r-- | mini-commander/src/history.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/mini-commander/src/history.c b/mini-commander/src/history.c new file mode 100644 index 00000000..750796da --- /dev/null +++ b/mini-commander/src/history.c @@ -0,0 +1,144 @@ +/* + * Mini-Commander Applet + * Copyright (C) 1998 Oliver Maruhn <[email protected]> + * + * Author: Oliver Maruhn <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Actually the command history is a simple list. So, I guess this + here could also be done with the list routines of glib. */ + +#include <config.h> +#include <string.h> +#include <stdlib.h> + +#include <mateconf/mateconf.h> +#include <mate-panel-applet.h> +#include <mate-panel-applet-mateconf.h> + +#include "history.h" +#include "preferences.h" + +static char *history_command[MC_HISTORY_LIST_LENGTH]; +static void delete_history_entry(int element_number); + + +int +exists_history_entry(int pos) +{ + return(history_command[pos] != NULL); +} + +char * +get_history_entry(int pos) +{ + return(history_command[pos]); +} + +void +set_history_entry(int pos, char * entry) +{ + if(history_command[pos] != NULL) + free(history_command[pos]); + history_command[pos] = (char *)malloc(sizeof(char) * (strlen(entry) + 1)); + strcpy(history_command[pos], entry); +} + +/* load_history indicates whether the history list is being loaded at startup. +** If true then don't save the new entries with mateconf (since they are being read +** using mateconf +*/ +void +append_history_entry(MCData *mcdata, const char * entry, gboolean load_history) +{ + MatePanelApplet *applet = mcdata->applet; + MateConfValue *history; + GSList *list = NULL; + int pos, i; + + /* remove older dupes */ + for(pos = 0; pos <= MC_HISTORY_LIST_LENGTH - 1; pos++) + { + if(exists_history_entry(pos) && strcmp(entry, history_command[pos]) == 0) + /* dupe found */ + delete_history_entry(pos); + } + + /* delete oldest entry */ + if(history_command[0] != NULL) + free(history_command[0]); + + /* move entries */ + for(pos = 0; pos < MC_HISTORY_LIST_LENGTH - 1; pos++) + { + history_command[pos] = history_command[pos+1]; + /* printf("%s\n", history_command[pos]); */ + } + + /* append entry */ + history_command[MC_HISTORY_LIST_LENGTH - 1] = (char *)malloc(sizeof(char) * (strlen(entry) + 1)); + strcpy(history_command[MC_HISTORY_LIST_LENGTH - 1], entry); + + if (load_history) + return; + + /* If not writable, just keeps the history around for this session */ + if ( ! mc_key_writable (mcdata, "history")) + return; + + /* Save history - this seems like a waste to do it every time it's updated + ** but it doesn't seem to work when called on the destroy signal of the applet + */ + for(i = 0; i < MC_HISTORY_LIST_LENGTH; i++) + { + MateConfValue *value_entry; + + value_entry = mateconf_value_new (MATECONF_VALUE_STRING); + if(exists_history_entry(i)) { + mateconf_value_set_string (value_entry, (gchar *) get_history_entry(i)); + list = g_slist_append (list, value_entry); + } + + } + + history = mateconf_value_new (MATECONF_VALUE_LIST); + if (list) { + mateconf_value_set_list_type (history, MATECONF_VALUE_STRING); + mateconf_value_set_list (history, list); + mate_panel_applet_mateconf_set_value (applet, "history", history, NULL); + } + + while (list) { + MateConfValue *value = list->data; + mateconf_value_free (value); + list = g_slist_next (list); + } + + mateconf_value_free (history); + +} + +void +delete_history_entry(int element_number) +{ + int pos; + + for(pos = element_number; pos > 0; --pos) + history_command[pos] = history_command[pos - 1]; + + history_command[0] = NULL; +} |