summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app.c15
-rw-r--r--src/feeds.c12
-rw-r--r--src/feeds.h4
-rw-r--r--src/ui/sidebarwidget.c3
-rw-r--r--src/ui/window.c34
5 files changed, 55 insertions, 13 deletions
diff --git a/src/app.c b/src/app.c
index 01a2e5a8..92334d42 100644
--- a/src/app.c
+++ b/src/app.c
@@ -1246,6 +1246,21 @@ iBool handleCommand_App(const char *cmd) {
1246 save_Bookmarks(d->bookmarks, dataDir_App_); 1246 save_Bookmarks(d->bookmarks, dataDir_App_);
1247 return iFalse; 1247 return iFalse;
1248 } 1248 }
1249 else if (equal_Command(cmd, "feeds.refresh")) {
1250 refresh_Feeds();
1251 return iTrue;
1252 }
1253 else if (equal_Command(cmd, "feeds.update.started")) {
1254 setFlags_Widget(findWidget_App("feeds.progress"), hidden_WidgetFlag, iFalse);
1255 refresh_App();
1256 return iFalse;
1257 }
1258 else if (equal_Command(cmd, "feeds.update.finished")) {
1259 setFlags_Widget(findWidget_App("feeds.progress"), hidden_WidgetFlag, iTrue);
1260 refreshFinished_Feeds();
1261 refresh_App();
1262 return iFalse;
1263 }
1249 else if (equal_Command(cmd, "visited.changed")) { 1264 else if (equal_Command(cmd, "visited.changed")) {
1250 save_Visited(d->visited, dataDir_App_); 1265 save_Visited(d->visited, dataDir_App_);
1251 return iFalse; 1266 return iFalse;
diff --git a/src/feeds.c b/src/feeds.c
index 9538d948..1af42477 100644
--- a/src/feeds.c
+++ b/src/feeds.c
@@ -259,7 +259,7 @@ static const iPtrArray *listSubscriptions_(void) {
259 259
260static iBool startWorker_Feeds_(iFeeds *d) { 260static iBool startWorker_Feeds_(iFeeds *d) {
261 if (d->worker) { 261 if (d->worker) {
262 return iFalse; /* Oops? */ 262 return iFalse; /* Refresh is already ongoing. */
263 } 263 }
264 /* Queue up all the subscriptions for the worker. */ 264 /* Queue up all the subscriptions for the worker. */
265 iConstForEach(PtrArray, i, listSubscriptions_()) { 265 iConstForEach(PtrArray, i, listSubscriptions_()) {
@@ -449,6 +449,14 @@ void deinit_Feeds(void) {
449 deinit_SortedArray(&d->entries); 449 deinit_SortedArray(&d->entries);
450} 450}
451 451
452void refresh_Feeds(void) {
453 startWorker_Feeds_(&feeds_);
454}
455
456void refreshFinished_Feeds(void) {
457 stopWorker_Feeds_(&feeds_);
458}
459
452static int cmpTimeDescending_FeedEntryPtr_(const void *a, const void *b) { 460static int cmpTimeDescending_FeedEntryPtr_(const void *a, const void *b) {
453 const iFeedEntry * const *e1 = a, * const *e2 = b; 461 const iFeedEntry * const *e1 = a, * const *e2 = b;
454 return -cmp_Time(&(*e1)->timestamp, &(*e2)->timestamp); 462 return -cmp_Time(&(*e1)->timestamp, &(*e2)->timestamp);
@@ -470,7 +478,7 @@ const iPtrArray *listEntries_Feeds(void) {
470const iString *entryListPage_Feeds(void) { 478const iString *entryListPage_Feeds(void) {
471 iFeeds *d = &feeds_; 479 iFeeds *d = &feeds_;
472 iString *src = collectNew_String(); 480 iString *src = collectNew_String();
473 format_String(src, "# Aggregated Gemini feeds\n"); 481 format_String(src, "# Feed entries\n\n");
474 lock_Mutex(d->mtx); 482 lock_Mutex(d->mtx);
475 const iPtrArray *subs = listSubscriptions_(); 483 const iPtrArray *subs = listSubscriptions_();
476 int elapsed = elapsedSeconds_Time(&d->lastRefreshedAt) / 60; 484 int elapsed = elapsedSeconds_Time(&d->lastRefreshedAt) / 60;
diff --git a/src/feeds.h b/src/feeds.h
index 7ad6c2aa..eb516690 100644
--- a/src/feeds.h
+++ b/src/feeds.h
@@ -36,7 +36,9 @@ struct Impl_FeedEntry {
36 36
37void init_Feeds (const char *saveDir); 37void init_Feeds (const char *saveDir);
38void deinit_Feeds (void); 38void deinit_Feeds (void);
39void refresh_Feeds (void);
39 40
40const iPtrArray * listEntries_Feeds (void); 41void refreshFinished_Feeds (void); /* called on "feeds.update.finished" */
41 42
43const iPtrArray * listEntries_Feeds (void);
42const iString * entryListPage_Feeds (void); 44const iString * entryListPage_Feeds (void);
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c
index 3fdfe190..3bd0f229 100644
--- a/src/ui/sidebarwidget.c
+++ b/src/ui/sidebarwidget.c
@@ -690,6 +690,9 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
690 (d->mode == history_SidebarMode || d->mode == feeds_SidebarMode)) { 690 (d->mode == history_SidebarMode || d->mode == feeds_SidebarMode)) {
691 updateItems_SidebarWidget_(d); 691 updateItems_SidebarWidget_(d);
692 } 692 }
693 else if (equal_Command(cmd, "feeds.update.finished") && d->mode == feeds_SidebarMode) {
694 updateItems_SidebarWidget_(d);
695 }
693 else if (equal_Command(cmd, "bookmarks.changed") && d->mode == bookmarks_SidebarMode) { 696 else if (equal_Command(cmd, "bookmarks.changed") && d->mode == bookmarks_SidebarMode) {
694 updateItems_SidebarWidget_(d); 697 updateItems_SidebarWidget_(d);
695 } 698 }
diff --git a/src/ui/window.c b/src/ui/window.c
index 6e046bdc..b4b8fff6 100644
--- a/src/ui/window.c
+++ b/src/ui/window.c
@@ -159,8 +159,9 @@ static const iMenuItem viewMenuItems_[] = {
159static iMenuItem bookmarksMenuItems_[] = { 159static iMenuItem bookmarksMenuItems_[] = {
160 { "Bookmark This Page...", SDLK_d, KMOD_PRIMARY, "bookmark.add" }, 160 { "Bookmark This Page...", SDLK_d, KMOD_PRIMARY, "bookmark.add" },
161 { "---", 0, 0, NULL }, 161 { "---", 0, 0, NULL },
162 { "Subscribe as Feed", 0, 0, "bookmark.addtag tag:subscribed" }, 162 { "Subscribe to This Page", 0, 0, "bookmark.addtag tag:subscribed" },
163 { "---", 0, 0, NULL }, 163 { "---", 0, 0, NULL },
164 { "Show Feed Entries", 0, 0, "open url:about:feeds" },
164 { "Refresh Feeds", SDLK_r, KMOD_PRIMARY | KMOD_SHIFT, "feeds.refresh" }, 165 { "Refresh Feeds", SDLK_r, KMOD_PRIMARY | KMOD_SHIFT, "feeds.refresh" },
165}; 166};
166 167
@@ -401,16 +402,29 @@ static void setupUserInterface_Window(iWindow *d) {
401 setNotifyEdits_InputWidget(url, iTrue); 402 setNotifyEdits_InputWidget(url, iTrue);
402 setTextCStr_InputWidget(url, "gemini://"); 403 setTextCStr_InputWidget(url, "gemini://");
403 addChildFlags_Widget(navBar, iClob(url), expand_WidgetFlag); 404 addChildFlags_Widget(navBar, iClob(url), expand_WidgetFlag);
404 /* Download progress indicator is inside the input field, but hidden normally. */
405 setPadding_Widget(as_Widget(url),0, 0, gap_UI * 1, 0); 405 setPadding_Widget(as_Widget(url),0, 0, gap_UI * 1, 0);
406 iLabelWidget *progress = new_LabelWidget(uiTextCaution_ColorEscape "00.000 MB", NULL); 406 /* Feeds refresh indicator is inside the input field. */ {
407 setId_Widget(as_Widget(progress), "document.progress"); 407 iLabelWidget *fprog = new_LabelWidget(uiTextCaution_ColorEscape
408 setAlignVisually_LabelWidget(progress, iTrue); 408 "\u2605 Refreshing Feeds...", NULL);
409 shrink_Rect(&as_Widget(progress)->rect, init_I2(0, gap_UI)); 409 setId_Widget(as_Widget(fprog), "feeds.progress");
410 addChildFlags_Widget(as_Widget(url), 410 setBackgroundColor_Widget(as_Widget(fprog), uiBackground_ColorId);
411 iClob(progress), 411 setAlignVisually_LabelWidget(fprog, iTrue);
412 moveToParentRightEdge_WidgetFlag); 412 shrink_Rect(&as_Widget(fprog)->rect, init_I2(0, gap_UI));
413 setBackgroundColor_Widget(as_Widget(progress), uiBackground_ColorId); 413 addChildFlags_Widget(as_Widget(url),
414 iClob(fprog),
415 moveToParentRightEdge_WidgetFlag | hidden_WidgetFlag);
416 }
417 /* Download progress indicator is also inside the input field, but hidden normally.
418 TODO: It shouldn't overlap the feeds indicator... */ {
419 iLabelWidget *progress = new_LabelWidget(uiTextCaution_ColorEscape "00.000 MB", NULL);
420 setId_Widget(as_Widget(progress), "document.progress");
421 setBackgroundColor_Widget(as_Widget(progress), uiBackground_ColorId);
422 setAlignVisually_LabelWidget(progress, iTrue);
423 shrink_Rect(&as_Widget(progress)->rect, init_I2(0, gap_UI));
424 addChildFlags_Widget(as_Widget(url),
425 iClob(progress),
426 moveToParentRightEdge_WidgetFlag);
427 }
414 } 428 }
415 setId_Widget(addChild_Widget( 429 setId_Widget(addChild_Widget(
416 navBar, iClob(newIcon_LabelWidget(reloadCStr_, 0, 0, "navigate.reload"))), 430 navBar, iClob(newIcon_LabelWidget(reloadCStr_, 0, 0, "navigate.reload"))),