From 701c579186d403aefd49107be00dd38625c6e357 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Fri, 27 Nov 2020 13:38:09 +0200 Subject: Feeds: Marking all as read; time check improvements For some unknown reason, the parsing of the entry dates is sometimes (randomly?) off by 3600 seconds (one hour). This need a closer investigation; maybe a DST thing? For now check the date instead. --- src/feeds.c | 7 ++++++- src/ui/sidebarwidget.c | 23 ++++++++++++++++++++--- src/visited.c | 15 +++++++++------ src/visited.h | 2 ++ 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/feeds.c b/src/feeds.c index 211ee353..9468ba65 100644 --- a/src/feeds.c +++ b/src/feeds.c @@ -183,8 +183,13 @@ static iBool updateEntries_Feeds_(iFeeds *d, iPtrArray *incoming) { iFeedEntry *existing = *(iFeedEntry **) at_SortedArray(&d->entries, pos); /* Already known, but update it, maybe the time and label have changed. */ iBool changed = iFalse; + iDate newDate; + iDate oldDate; + init_Date(&newDate, &entry->timestamp); + init_Date(&oldDate, &existing->timestamp); if (!equalCase_String(&existing->title, &entry->title) || - cmp_Time(&existing->timestamp, &entry->timestamp)) { + (newDate.year != oldDate.year || newDate.month != oldDate.month || + newDate.day != oldDate.day)) { changed = iTrue; } set_String(&existing->title, &entry->title); diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c index 2edd28a9..35c19f7c 100644 --- a/src/ui/sidebarwidget.c +++ b/src/ui/sidebarwidget.c @@ -115,12 +115,18 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) { switch (d->mode) { case feeds_SidebarMode: { const iString *docUrl = url_DocumentWidget(document_App()); + iTime now; iDate on; - initCurrent_Date(&on); + initCurrent_Time(&now); + init_Date(&on, &now); const int thisYear = on.year; iZap(on); iConstForEach(PtrArray, i, listEntries_Feeds()) { const iFeedEntry *entry = i.ptr; + /* Exclude entries that are too old for Visited to keep track of. */ + if (secondsSince_Time(&now, &entry->timestamp) > maxAge_Visited) { + break; /* the rest are even older */ + } /* Insert date separators. */ { iDate entryDate; init_Date(&entryDate, &entry->timestamp); @@ -158,13 +164,13 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) { as_Widget(d), (iMenuItem[]){ { "Open Entry in New Tab", 0, 0, "feed.entry.opentab" }, { "Open Feed Page", 0, 0, "feed.entry.openfeed" }, - { "---", 0, 0, NULL }, { "Mark as Read", 0, 0, "feed.entry.toggleread" }, { "Add Bookmark...", 0, 0, "feed.entry.bookmark" }, - { "Edit Feed...", 0, 0, "feed.entry.edit" }, { "---", 0, 0, NULL }, + { "Edit Feed...", 0, 0, "feed.entry.edit" }, { uiTextCaution_ColorEscape "Unsubscribe...", 0, 0, "feed.entry.unsubscribe" }, { "---", 0, 0, NULL }, + { "Mark All as Read", SDLK_a, KMOD_SHIFT, "feeds.markallread" }, { "Refresh Feeds", SDLK_r, KMOD_PRIMARY | KMOD_SHIFT, "feeds.refresh" } }, 10); break; @@ -694,6 +700,17 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) else if (equal_Command(cmd, "feeds.update.finished") && d->mode == feeds_SidebarMode) { updateItems_SidebarWidget_(d); } + else if (equal_Command(cmd, "feeds.markallread") && d->mode == feeds_SidebarMode) { + iConstForEach(PtrArray, i, listEntries_Feeds()) { + const iFeedEntry *entry = i.ptr; + const iString *url = &entry->url; + if (!containsUrl_Visited(visited_App(), url)) { + visitUrl_Visited(visited_App(), url, transient_VisitedUrlFlag); + } + } + postCommand_App("visited.changed"); + return iTrue; + } else if (startsWith_CStr(cmd, "feed.entry.") && d->mode == feeds_SidebarMode) { const iSidebarItem *item = d->contextItem; if (item) { diff --git a/src/visited.c b/src/visited.c index 5d8a5676..3e034399 100644 --- a/src/visited.c +++ b/src/visited.c @@ -29,7 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include -static const size_t maxAgeVisited_Visited_ = 2 * 3600 * 24 * 30; /* two months */ +const int maxAge_Visited = 2 * 3600 * 24 * 30; /* two months */ void init_VisitedUrl(iVisitedUrl *d) { initCurrent_Time(&d->when); @@ -113,16 +113,16 @@ void load_Visited(iVisited *d, const char *dirPath) { sscanf(line.start, "%04d-%02d-%02dT%02d:%02d:%02d ", &y, &m, &D, &H, &M, &S); if (!y) break; iVisitedUrl item; + init_VisitedUrl(&item); const char *urlStart = line.start + 20; if (*urlStart == '0' && size_Range(&line) >= 25) { item.flags = strtoul(line.start + 20, NULL, 16); urlStart += 5; } - init_VisitedUrl(&item); init_Time( &item.when, &(iDate){ .year = y, .month = m, .day = D, .hour = H, .minute = M, .second = S }); - if (secondsSince_Time(&now, &item.when) > maxAgeVisited_Visited_) { + if (secondsSince_Time(&now, &item.when) > maxAge_Visited) { continue; /* Too old. */ } initRange_String(&item.url, (iRangecc){ urlStart, line.end }); @@ -179,9 +179,12 @@ void visitUrl_Visited(iVisited *d, const iString *url, uint16_t visitFlags) { void removeUrl_Visited(iVisited *d, const iString *url) { iGuardMutex(d->mtx, { size_t pos = find_Visited_(d, url); - if (pos != iInvalidPos) { - deinit_VisitedUrl(at_SortedArray(&d->visited, pos)); - remove_Array(&d->visited.values, pos); + if (pos < size_SortedArray(&d->visited)) { + iVisitedUrl *visUrl = at_SortedArray(&d->visited, pos); + if (equal_String(&visUrl->url, url)) { + deinit_VisitedUrl(visUrl); + remove_Array(&d->visited.values, pos); + } } }); } diff --git a/src/visited.h b/src/visited.h index 467bad40..fec0b4c3 100644 --- a/src/visited.h +++ b/src/visited.h @@ -31,6 +31,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ iDeclareType(VisitedUrl) iDeclareTypeConstruction(VisitedUrl) +extern const int maxAge_Visited; /* seconds */ + struct Impl_VisitedUrl { iString url; iTime when; -- cgit v1.2.3