diff options
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | data/glade/epiphany.glade | 2 | ||||
-rw-r--r-- | embed/ephy-history.c | 104 | ||||
-rw-r--r-- | embed/ephy-history.h | 3 | ||||
-rw-r--r-- | lib/toolbar/ephy-tb-button.c | 33 | ||||
-rw-r--r-- | src/bookmarks/ephy-bookmarks.c | 1 | ||||
-rwxr-xr-x | src/history-dialog.c | 4 |
8 files changed, 159 insertions, 7 deletions
@@ -1,3 +1,20 @@ +2003-01-01 Marco Pesenti Gritti <marco@it.gnome.org> + + * TODO: + * data/glade/epiphany.glade: + * embed/ephy-history.c: (page_is_obsolete), + (remove_obsolete_pages), (periodic_save_cb), (ephy_history_init), + (ephy_history_finalize), (ephy_history_clear), + (ephy_history_get_last_page), (ephy_history_remove): + * embed/ephy-history.h: + * lib/toolbar/ephy-tb-button.c: (button_state_changed_cb), + (ephy_tb_button_set_show_arrow), (ephy_tb_button_set_enable_menu): + * src/bookmarks/ephy-bookmarks.c: (ephy_bookmarks_add): + * src/history-dialog.c: (get_date_filter): + + Save history every 5 minutes, drop items older than 30 days, + fix Clear. Better prelight for navigation buttons. + 2002-12-31 Marco Pesenti Gritti <marco@it.gnome.org> * configure.in: @@ -1,7 +1,6 @@ To do: - implement phoenix like popup blocking / make popups less annoying -- drop items from history when they are not visited since some time Done: @@ -17,3 +16,4 @@ Done: * autocompletion refine borked for bookmarks * history scoring for autocompletion * urls like www.gnome.org and gnome.org should use same folder in history +* drop items from history when they are not visited since some time diff --git a/data/glade/epiphany.glade b/data/glade/epiphany.glade index 520d9217e..c9d30cb91 100644 --- a/data/glade/epiphany.glade +++ b/data/glade/epiphany.glade @@ -248,7 +248,7 @@ <child> <widget class="GtkMenuItem" id="convertwidget7"> <property name="visible">True</property> - <property name="label" translatable="yes">Month</property> + <property name="label" translatable="yes">Two weeks</property> <property name="use_underline">True</property> </widget> </child> diff --git a/embed/ephy-history.c b/embed/ephy-history.c index 0511cfe67..7c6f08e9d 100644 --- a/embed/ephy-history.c +++ b/embed/ephy-history.c @@ -30,6 +30,11 @@ #define EPHY_HISTORY_XML_VERSION "0.1" +/* how often to save the history, in milliseconds */ +#define HISTORY_SAVE_INTERVAL (60 * 5 * 1000) + +#define HISTORY_PAGE_OBSOLETE_DAYS 30 + struct EphyHistoryPrivate { char *xml_file; @@ -40,6 +45,7 @@ struct EphyHistoryPrivate GStaticRWLock *hosts_hash_lock; GHashTable *pages_hash; GStaticRWLock *pages_hash_lock; + int autosave_timeout; }; enum @@ -214,6 +220,49 @@ ephy_history_load (EphyHistory *eb) xmlFreeDoc (doc); } +static gboolean +page_is_obsolete (EphyNode *node, GDate *now) +{ + int last_visit; + GDate date; + + last_visit = ephy_node_get_property_int + (node, EPHY_NODE_PAGE_PROP_LAST_VISIT); + + g_date_clear (&date, 1); + g_date_set_time (&date, last_visit); + + return (g_date_days_between (&date, now) >= + HISTORY_PAGE_OBSOLETE_DAYS); +} + +static void +remove_obsolete_pages (EphyHistory *eb) +{ + GPtrArray *children; + int i; + GTime now; + GDate current_date; + + now = time (NULL); + g_date_clear (¤t_date, 1); + g_date_set_time (¤t_date, time (NULL)); + + children = ephy_node_get_children (eb->priv->pages); + ephy_node_thaw (eb->priv->pages); + for (i = 0; i < children->len; i++) + { + EphyNode *kid; + + kid = g_ptr_array_index (children, i); + + if (page_is_obsolete (kid, ¤t_date)) + { + ephy_history_remove (eb, kid); + } + } +} + static void ephy_history_save (EphyHistory *eb) { @@ -311,6 +360,15 @@ pages_removed_cb (EphyNode *node, g_static_rw_lock_writer_unlock (eb->priv->pages_hash_lock); } +static gboolean +periodic_save_cb (EphyHistory *eh) +{ + remove_obsolete_pages (eh); + ephy_history_save (eh); + + return TRUE; +} + static void ephy_history_init (EphyHistory *eb) { @@ -360,6 +418,12 @@ ephy_history_init (EphyHistory *eb) ephy_history_load (eb); ephy_history_emit_data_changed (eb); + + /* setup the periodic history saving callback */ + eb->priv->autosave_timeout = + g_timeout_add (HISTORY_SAVE_INTERVAL, + (GSourceFunc)periodic_save_cb, + eb); } static void @@ -383,6 +447,8 @@ ephy_history_finalize (GObject *object) g_hash_table_destroy (eb->priv->hosts_hash); g_static_rw_lock_free (eb->priv->hosts_hash_lock); + g_source_remove (eb->priv->autosave_timeout); + g_free (eb->priv); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -653,7 +719,19 @@ ephy_history_set_page_title (EphyHistory *gh, void ephy_history_clear (EphyHistory *gh) { - ephy_node_unref (gh->priv->hosts); + GPtrArray *children; + int i; + + children = ephy_node_get_children (gh->priv->hosts); + ephy_node_thaw (gh->priv->hosts); + for (i = 0; i < children->len; i++) + { + EphyNode *kid; + + kid = g_ptr_array_index (children, i); + ephy_node_unref (kid); + } + ephy_history_save (gh); } @@ -677,3 +755,27 @@ ephy_history_get_last_page (EphyHistory *gh) return ephy_node_get_property_string (gh->priv->last_page, EPHY_NODE_PAGE_PROP_LOCATION); } + +void +ephy_history_remove (EphyHistory *gh, EphyNode *node) +{ + EphyNode *host; + int host_id; + + host_id = ephy_node_get_property_int (node, EPHY_NODE_PAGE_PROP_HOST_ID); + if (host_id < 0) + { + ephy_node_unref (node); + return; + } + + host = ephy_node_get_from_id (host_id); + if (ephy_node_get_n_children (host) == 1) + { + ephy_node_unref (host); + } + else + { + ephy_node_unref (node); + } +} diff --git a/embed/ephy-history.h b/embed/ephy-history.h index 641ab6d7c..4bb9c14b1 100644 --- a/embed/ephy-history.h +++ b/embed/ephy-history.h @@ -85,6 +85,9 @@ void ephy_history_set_page_title (EphyHistory *gh, const char *ephy_history_get_last_page (EphyHistory *gh); +void ephy_history_remove (EphyHistory *gh, + EphyNode *node); + void ephy_history_clear (EphyHistory *gh); G_END_DECLS diff --git a/lib/toolbar/ephy-tb-button.c b/lib/toolbar/ephy-tb-button.c index 4b251a094..4485102f0 100644 --- a/lib/toolbar/ephy-tb-button.c +++ b/lib/toolbar/ephy-tb-button.c @@ -374,6 +374,30 @@ ephy_tb_button_set_image (EphyTbButton *b, GtkWidget *image) ephy_tb_button_build (b); } +static void +button_state_changed_cb (GtkWidget *widget, GtkStateType previous_state, EphyTbButton *b) +{ + EphyTbButtonPrivate *p = b->priv; + GtkWidget *button; + GtkStateType state = GTK_WIDGET_STATE (widget); + GtkStateType other; + + if (state == GTK_STATE_ACTIVE || + state == GTK_STATE_SELECTED || + state == GTK_STATE_INSENSITIVE) + { + return; + } + + button = (widget == p->arrow_widget) ? p->button : p->arrow_widget; + other = GTK_WIDGET_STATE (button); + + if (state != other) + { + gtk_widget_set_state (button, state); + } +} + void ephy_tb_button_set_show_arrow (EphyTbButton *b, gboolean value) { @@ -402,10 +426,15 @@ ephy_tb_button_set_show_arrow (EphyTbButton *b, gboolean value) g_signal_connect (p->arrow_widget, "key_press_event", G_CALLBACK (ephy_tb_button_arrow_key_press_event_cb), b); - g_signal_connect (p->arrow_widget, "button_press_event", G_CALLBACK (ephy_tb_button_arrow_button_press_event_cb), b); + g_signal_connect (p->arrow_widget, "state_changed", + G_CALLBACK (button_state_changed_cb), + b); + g_signal_connect (p->button, "state_changed", + G_CALLBACK (button_state_changed_cb), + b); gtk_widget_show_all (p->arrow_widget); gtk_box_pack_end_defaults (GTK_BOX (b), p->arrow_widget); @@ -420,7 +449,7 @@ ephy_tb_button_set_enable_menu (EphyTbButton *b, gboolean value) if (value && !p->menu) { p->menu = GTK_MENU (gtk_menu_new ()); - g_signal_connect (p->menu, "deactivate", + g_signal_connect (p->menu, "deactivate", G_CALLBACK (ephy_tb_button_menu_deactivated_cb), b); } else if (!value && p->menu) diff --git a/src/bookmarks/ephy-bookmarks.c b/src/bookmarks/ephy-bookmarks.c index 2353ea7da..2432846e3 100644 --- a/src/bookmarks/ephy-bookmarks.c +++ b/src/bookmarks/ephy-bookmarks.c @@ -644,6 +644,7 @@ ephy_bookmarks_add (EphyBookmarks *eb, ephy_node_add_child (eb->priv->bookmarks, bm); ephy_bookmarks_emit_data_changed (eb); + ephy_bookmarks_save (eb); return bm; } diff --git a/src/history-dialog.c b/src/history-dialog.c index 4f5b5cc2b..ac9aa5449 100755 --- a/src/history-dialog.c +++ b/src/history-dialog.c @@ -311,9 +311,9 @@ get_date_filter (int filter_type, case 4: g_date_subtract_days (¤t_date, 7); break; - /* Month */ + /* Two weeks */ case 5: - g_date_subtract_months (¤t_date, 1); + g_date_subtract_days (¤t_date, 14); break; default: break; |