#include #include #include #include #include "web_history.h" #include "web.h" void web_history_free (WebHistory *history) { if (history->title) g_free (history->title); g_free (history->url); g_free (history); } static void web_history_clear_cb (GtkWidget *widget, gpointer data) { GtkContainer *container = data; gtk_container_remove (container, widget); } void web_history_clear (WebPages *pages, gboolean back, gboolean forward) { GtkWidget *widget; if (back) { widget = glade_xml_get_widget (pages->xml, "back_menuitem"); gtk_widget_set_sensitive (widget, FALSE); widget = glade_xml_get_widget (pages->xml, "back_button"); gtk_widget_set_sensitive (widget, FALSE); gtk_container_foreach (GTK_CONTAINER (pages->history), web_history_clear_cb, pages->history); } if (forward) { widget = glade_xml_get_widget ( pages->xml, "forward_menuitem"); widget = glade_xml_get_widget ( pages->xml, "forward_button"); gtk_widget_set_sensitive (widget, FALSE); gtk_container_foreach (GTK_CONTAINER (pages->history_forward), web_history_clear_cb, pages->history_forward); } } void web_history_go (GtkMenuItem *menuitem, WebHistory *current) { WebData *data = current->parent; web_history_move (data->history, &data->history_forward, current); web_history_build (data->history, data->history_forward, data->parent); web_go (data, current->url, TRUE); } void web_history_append (WebHistory *history, WebPages *pages) { GtkWidget *widget; web_history_clear (pages, FALSE, TRUE); widget = gtk_menu_item_new_with_label ( history->title ? history->title : history->url); gtk_widget_show (widget); /* TODO: Callback to go to url, forward */ gtk_menu_shell_append (GTK_MENU_SHELL (pages->history), widget); g_signal_connect (G_OBJECT (widget), "activate", G_CALLBACK (web_history_go), history); widget = glade_xml_get_widget (pages->xml, "back_menuitem"); gtk_widget_set_sensitive (widget, TRUE); widget = glade_xml_get_widget (pages->xml, "back_button"); gtk_widget_set_sensitive (widget, TRUE); } void web_history_build (GList *history, GList *history_forward, WebPages *pages) { GtkWidget *widget; web_history_clear (pages, TRUE, TRUE); if (g_list_length (history) > 1) { for (; history->next; history = history->next) { WebHistory *h = history->data; GtkWidget *item = gtk_menu_item_new_with_label ( h->title ? h->title : h->url); gtk_menu_shell_append (GTK_MENU_SHELL (pages->history), item); g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (web_history_go), h); } widget = glade_xml_get_widget (pages->xml, "back_menuitem"); gtk_widget_set_sensitive (widget, TRUE); widget = glade_xml_get_widget (pages->xml, "back_button"); gtk_widget_set_sensitive (widget, TRUE); } if (g_list_length (history_forward) > 0) { for (; history_forward; history_forward = history_forward->next) { WebHistory *h = history_forward->data; GtkWidget *item = gtk_menu_item_new_with_label ( h->title ? h->title : h->url); gtk_menu_shell_append (GTK_MENU_SHELL ( pages->history_forward), item); g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (web_history_go), h); } widget = glade_xml_get_widget (pages->xml, "forward_menuitem"); gtk_widget_set_sensitive (widget, TRUE); widget = glade_xml_get_widget (pages->xml, "forward_button"); gtk_widget_set_sensitive (widget, TRUE); } gtk_widget_show_all (pages->history); gtk_widget_show_all (pages->history_forward); } void web_history_move (GList *history, GList **history_forward, WebHistory *active) { GList *hist_pos, *connected; /* Connect the lists */ connected = g_list_concat (history, *history_forward); /* Find new active history item */ hist_pos = g_list_find (connected, active); /* Disconnect lists at the new point */ *history_forward = hist_pos->next; hist_pos->next = NULL; if (*history_forward) (*history_forward)->prev = NULL; }