make a function for the common code for opening/plumbing a feed or item - sfeed_curses - sfeed curses UI (now part of sfeed, development is in sfeed)
 (HTM) git clone git://git.codemadness.org/sfeed_curses
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 263fecaf915f6ae1ea2b2fea1f599502c9500b20
 (DIR) parent 031a577c39cdd4fcf518569d2ca7e869e646313f
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Thu, 25 Mar 2021 22:38:21 +0100
       
       make a function for the common code for opening/plumbing a feed or item
       
       The common code was in the mouse handling and key handling and it is large
       enough to be a separate function also.
       
       Diffstat:
         M sfeed_curses.c                      |      92 +++++++++++++++----------------
       
       1 file changed, 44 insertions(+), 48 deletions(-)
       ---
 (DIR) diff --git a/sfeed_curses.c b/sfeed_curses.c
       @@ -1476,6 +1476,41 @@ feeds_reloadall(void)
                updatetitle();
        }
        
       +void
       +feed_open_selected(struct pane *p)
       +{
       +        struct feed *f;
       +        struct row *row;
       +
       +        row = pane_row_get(p, p->pos);
       +        f = (struct feed *)row->data;
       +        feeds_set(f);
       +        urls_read();
       +        if (f->fp)
       +                feed_load(f, f->fp);
       +        urls_free();
       +        /* redraw row: counts could be changed */
       +        updatesidebar();
       +        updatetitle();
       +
       +        if (layout == LayoutMonocle) {
       +                selpane = PaneItems;
       +                updategeom();
       +        }
       +}
       +
       +void
       +feed_plumb_selected_item(struct pane *p)
       +{
       +        struct row *row;
       +        struct item *item;
       +
       +        row = pane_row_get(p, p->pos);
       +        item = (struct item *)row->data;
       +        markread(p, p->pos, p->pos, 1);
       +        forkexec((char *[]) { plumbercmd, item->fields[FieldLink], NULL }, plumberia);
       +}
       +
        /* calculate optimal (default) size */
        int
        getsidebarsizedefault(void)
       @@ -1670,7 +1705,6 @@ void
        mousereport(int button, int release, int keymask, int x, int y)
        {
                struct pane *p;
       -        struct feed *f;
                struct row *row;
                struct item *item;
                size_t i;
       @@ -1718,30 +1752,10 @@ mousereport(int button, int release, int keymask, int x, int y)
                                if (!p->nrows || pos >= p->nrows)
                                        break;
                                pane_setpos(p, pos);
       -                        if (i == PaneFeeds) {
       -                                row = pane_row_get(p, p->pos);
       -                                f = (struct feed *)row->data;
       -                                feeds_set(f);
       -                                urls_read();
       -                                if (f->fp)
       -                                        feed_load(f, f->fp);
       -                                urls_free();
       -                                /* redraw row: counts could be changed */
       -                                updatesidebar();
       -                                updatetitle();
       -
       -                                if (layout == LayoutMonocle) {
       -                                        selpane = PaneItems;
       -                                        updategeom();
       -                                }
       -                        } else if (i == PaneItems) {
       -                                if (dblclick && !changedpane) {
       -                                        row = pane_row_get(p, p->pos);
       -                                        item = (struct item *)row->data;
       -                                        markread(p, p->pos, p->pos, 1);
       -                                        forkexec((char *[]) { plumbercmd, item->fields[FieldLink], NULL }, plumberia);
       -                                }
       -                        }
       +                        if (i == PaneFeeds)
       +                                feed_open_selected(&panes[PaneFeeds]);
       +                        else if (i == PaneItems && dblclick && !changedpane)
       +                                feed_plumb_selected_item(&panes[PaneItems]);
                                break;
                        case 2: /* right-click */
                                if (!p->nrows || pos >= p->nrows)
       @@ -2300,29 +2314,11 @@ nextpage:
                                break;
                        case 'o': /* feeds: load, items: plumb URL */
                        case '\n':
       -                        p = &panes[selpane];
       -                        if (selpane == PaneFeeds && panes[selpane].nrows) {
       -                                row = pane_row_get(p, p->pos);
       -                                f = (struct feed *)row->data;
       -                                feeds_set(f);
       -                                urls_read();
       -                                if (f->fp)
       -                                        feed_load(f, f->fp);
       -                                urls_free();
       -                                /* redraw row: counts could be changed */
       -                                updatesidebar();
       -                                updatetitle();
       -
       -                                if (layout == LayoutMonocle) {
       -                                        selpane = PaneItems;
       -                                        updategeom();
       -                                }
       -                        } else if (selpane == PaneItems && panes[selpane].nrows) {
       -                                row = pane_row_get(p, p->pos);
       -                                item = (struct item *)row->data;
       -                                markread(p, p->pos, p->pos, 1);
       -                                forkexec((char *[]) { plumbercmd, item->fields[FieldLink], NULL }, plumberia);
       -                        }
       +openitem:
       +                        if (selpane == PaneFeeds && panes[selpane].nrows)
       +                                feed_open_selected(&panes[PaneFeeds]);
       +                        else if (selpane == PaneItems && panes[selpane].nrows)
       +                                feed_plumb_selected_item(&panes[PaneItems]);
                                break;
                        case 'c': /* items: pipe TSV line to program */
                        case 'p':