commit 1040cc7fd1cf748a26766e65b2a2fde17e27310d from: Omar Polo date: Sun Jan 02 22:29:15 2022 UTC implement persistent tab history The session file is now overloaded with the history info, that means that upon startup telescope can repopulate each tab history! The price to pay is that one can't start an old telescope with a new session file, otherwise will get a lot of fancy '<' and '>' tabs... commit - 92ce02e268a0aab7b86c441c9c01299d3af83d1d commit + 1040cc7fd1cf748a26766e65b2a2fde17e27310d blob - d844b079644dcc343610c602e3b3195153dd665c blob + 626acdd09c64f839c2167ded50fb825bc3689705 --- fs.c +++ fs.c @@ -50,6 +50,7 @@ static void handle_update_cert(struct imsg*, size_t) static void handle_file_open(struct imsg*, size_t); static void handle_session_start(struct imsg*, size_t); static void handle_session_tab(struct imsg*, size_t); +static void handle_session_tab_hist(struct imsg*, size_t); static void handle_session_end(struct imsg*, size_t); static void handle_dispatch_imsg(int, short, void*); static int fs_send_ui(int, uint32_t, int, const void *, uint16_t); @@ -94,6 +95,7 @@ static imsg_handlerfn *handlers[] = { [IMSG_FILE_OPEN] = handle_file_open, [IMSG_SESSION_START] = handle_session_start, [IMSG_SESSION_TAB] = handle_session_tab, + [IMSG_SESSION_TAB_HIST] = handle_session_tab_hist, [IMSG_SESSION_END] = handle_session_end, }; @@ -505,6 +507,24 @@ handle_session_tab(struct imsg *imsg, size_t datalen) } static void +handle_session_tab_hist(struct imsg *imsg, size_t datalen) +{ + struct session_tab_hist th; + + if (session == NULL) + die(); + + if (datalen != sizeof(th)) + die(); + + memcpy(&th, imsg->data, sizeof(th)); + if (th.uri[sizeof(th.uri)-1] != '\0') + die(); + + fprintf(session, "%s %s\n", th.future ? ">" : "<", th.uri); +} + +static void handle_session_end(struct imsg *imsg, size_t datalen) { if (session == NULL) @@ -701,6 +721,20 @@ sendtab(uint32_t flags, const char *uri, const char *t strlcpy(tab.title, title, sizeof(tab.title)); fs_send_ui(IMSG_SESSION_TAB, 0, -1, &tab, sizeof(tab)); +} + +static inline void +sendhist(const char *uri, int future) +{ + struct session_tab_hist sth; + + memset(&sth, 0, sizeof(sth)); + sth.future = future; + + if (strlcpy(sth.uri, uri, sizeof(sth.uri)) >= sizeof(sth.uri)) + return; + + fs_send_ui(IMSG_SESSION_TAB_HIST, 0, -1, &sth, sizeof(sth)); } static void @@ -711,8 +745,9 @@ load_last_session(int fd, short event, void *d) size_t linesize = 0; ssize_t linelen; int first_time = 0; + int future; const char *title; - char *nl, *line = NULL; + char *nl, *s, *line = NULL; if ((session = fopen(session_file, "r")) == NULL) { /* first time? */ @@ -723,8 +758,17 @@ load_last_session(int fd, short event, void *d) while ((linelen = getline(&line, &linesize, session)) != -1) { if ((nl = strchr(line, '\n')) != NULL) *nl = '\0'; - parse_session_line(line, &title, &flags); - sendtab(flags, line, title); + + if (*line == '<' || *line == '>') { + future = *line == '>'; + s = line+1; + if (*s != ' ') + continue; + sendhist(++s, future); + } else { + parse_session_line(line, &title, &flags); + sendtab(flags, line, title); + } } fclose(session); blob - ae4787379ee5e66cd0b232ed3091336387949b8d blob + 5e48fbdecfc07b88e66e1a9d8d9e1db284fa8ffd --- fs.h +++ fs.h @@ -29,6 +29,11 @@ struct session_tab { char title[TITLE_MAX]; }; +struct session_tab_hist { + char uri[GEMINI_URL_LEN]; + int future; +}; + extern char config_path_base[PATH_MAX]; extern char data_path_base[PATH_MAX]; extern char cache_path_base[PATH_MAX]; blob - 93e92fb9938e4e1c09423aaf5bfa4b9cbdde11e2 blob + 04488d125831333010987d9ada582bdd7f56f50c --- hist.c +++ hist.c @@ -37,6 +37,13 @@ hist_push(struct histhead *head, struct hist *h) TAILQ_INSERT_TAIL(&head->head, h, entries); } +void +hist_add_before(struct histhead *head, struct hist *curr, struct hist *h) +{ + head->len++; + TAILQ_INSERT_BEFORE(curr, h, entries); +} + struct hist * hist_pop(struct histhead *head) { blob - 79ebe209795f743920f3b58d88ece2df42401d8f blob + c3b8bf4d957d13e5a94dc793b4a5a7a47613696d --- session.c +++ session.c @@ -112,7 +112,10 @@ void save_session(void) { struct session_tab st; + struct session_tab_hist sth; struct tab *tab; + struct hist *h; + int future; if (safe_mode) return; @@ -128,6 +131,19 @@ save_session(void) strlcpy(st.uri, tab->hist_cur->h, sizeof(st.uri)); strlcpy(st.title, tab->buffer.page.title, sizeof(st.title)); ui_send_fs(IMSG_SESSION_TAB, 0, &st, sizeof(st)); + + future = 0; + TAILQ_FOREACH(h, &tab->hist.head, entries) { + if (h == tab->hist_cur) { + future = 1; + continue; + } + + memset(&sth, 0, sizeof(sth)); + strlcpy(sth.uri, h->h, sizeof(sth.uri)); + sth.future = future; + ui_send_fs(IMSG_SESSION_TAB_HIST, 0, &sth, sizeof(sth)); + } } ui_send_fs(IMSG_SESSION_END, 0, NULL, 0); blob - d884b8c2a8640baf5d73d7a9db615ddb4ca8c72e blob + eed4139686565bc6aa1457e6ca0f8cb5feee90c2 --- telescope.c +++ telescope.c @@ -158,6 +158,7 @@ static imsg_handlerfn *handlers[] = { [IMSG_UPDATE_CERT_OK] = handle_imsg_update_cert_ok, [IMSG_FILE_OPENED] = handle_imsg_file_opened, [IMSG_SESSION_TAB] = handle_imsg_session, + [IMSG_SESSION_TAB_HIST] = handle_imsg_session, [IMSG_SESSION_END] = handle_imsg_session, }; @@ -498,8 +499,10 @@ static void handle_imsg_session(struct imsg *imsg, size_t datalen) { static struct tab *curr; + static struct tab *tab; struct session_tab st; - struct tab *tab; + struct session_tab_hist sth; + struct hist *h; int first_time; /* @@ -523,6 +526,24 @@ handle_imsg_session(struct imsg *imsg, size_t datalen) curr = tab; break; + case IMSG_SESSION_TAB_HIST: + if (tab == NULL || datalen != sizeof(sth)) + die(); + + memcpy(&sth, imsg->data, sizeof(sth)); + if (sth.uri[sizeof(sth.uri)-1] != '\0') + die(); + + if ((h = calloc(1, sizeof(*h))) == NULL) + die(); + strlcpy(h->h, sth.uri, sizeof(h->h)); + + if (sth.future) + hist_push(&tab->hist, h); + else + hist_add_before(&tab->hist, tab->hist_cur, h); + break; + case IMSG_SESSION_END: if (datalen != sizeof(first_time)) die(); blob - a0bd94a5f30f133c6a26a40186a686519816e0ec blob + 8fda4e4d9bd99b892d3cc5a29d9a629e15bdc0db --- telescope.h +++ telescope.h @@ -69,6 +69,7 @@ enum imsg_type { IMSG_SESSION_START, IMSG_SESSION_TAB, + IMSG_SESSION_TAB_HIST, IMSG_SESSION_END, }; @@ -292,6 +293,7 @@ void recompute_help(void); /* hist.c */ void hist_clear_forward(struct histhead*, struct hist*); void hist_push(struct histhead*, struct hist*); +void hist_add_before(struct histhead *, struct hist *, struct hist *); struct hist *hist_pop(struct histhead *); /* mime.c */