make plumb, pipe, yank a function and reuse them for keybinds and mouse actions - 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 65f7223309e929522ca4e3762604f10653db5aca
(DIR) parent edcbb556469e5381e61f0d733b95b472d55ecf44
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Mon, 29 Mar 2021 20:00:36 +0200
make plumb, pipe, yank a function and reuse them for keybinds and mouse actions
Diffstat:
M sfeed_curses.c | 78 +++++++++++++++++--------------
1 file changed, 43 insertions(+), 35 deletions(-)
---
(DIR) diff --git a/sfeed_curses.c b/sfeed_curses.c
@@ -1531,15 +1531,41 @@ feed_open_selected(struct pane *p)
}
void
-feed_plumb_selected_item(struct pane *p)
+feed_plumb_selected_item(struct pane *p, int field)
{
struct row *row;
struct item *item;
- row = pane_row_get(p, p->pos);
- item = (struct item *)row->data;
+ if (!(row = pane_row_get(p, p->pos)))
+ return;
+ item = row->data;
+ markread(p, p->pos, p->pos, 1);
+ forkexec((char *[]) { plumbercmd, item->fields[field], NULL }, plumberia);
+}
+
+void
+feed_pipe_selected_item(struct pane *p)
+{
+ struct row *row;
+ struct item *item;
+
+ if (!(row = pane_row_get(p, p->pos)))
+ return;
+ item = row->data;
markread(p, p->pos, p->pos, 1);
- forkexec((char *[]) { plumbercmd, item->fields[FieldLink], NULL }, plumberia);
+ pipeitem(pipercmd, item, -1, piperia);
+}
+
+void
+feed_yank_selected_item(struct pane *p, int field)
+{
+ struct row *row;
+ struct item *item;
+
+ if (!(row = pane_row_get(p, p->pos)))
+ return;
+ item = row->data;
+ pipeitem(yankercmd, item, field, yankeria);
}
/* calculate optimal (default) size */
@@ -1736,8 +1762,6 @@ void
mousereport(int button, int release, int keymask, int x, int y)
{
struct pane *p;
- struct row *row;
- struct item *item;
size_t i;
int changedpane, dblclick, pos;
@@ -1786,18 +1810,14 @@ mousereport(int button, int release, int keymask, int x, int y)
if (i == PaneFeeds)
feed_open_selected(&panes[PaneFeeds]);
else if (i == PaneItems && dblclick && !changedpane)
- feed_plumb_selected_item(&panes[PaneItems]);
+ feed_plumb_selected_item(&panes[PaneItems], FieldLink);
break;
case 2: /* right-click */
if (!p->nrows || pos >= p->nrows)
break;
pane_setpos(p, pos);
- if (i == PaneItems) {
- row = pane_row_get(p, p->pos);
- item = (struct item *)row->data;
- markread(p, p->pos, p->pos, 1);
- pipeitem(pipercmd, item, -1, piperia);
- }
+ if (i == PaneItems)
+ feed_pipe_selected_item(&panes[PaneItems]);
break;
case 3: /* scroll up */
case 4: /* scroll down */
@@ -2047,7 +2067,6 @@ main(int argc, char *argv[])
struct pane *p;
struct feed *f;
struct row *row;
- struct item *item;
size_t i;
char *name, *tmp;
char *search = NULL; /* search text */
@@ -2326,12 +2345,8 @@ nextpage:
case 'a': /* attachment */
case 'e': /* enclosure */
case '@':
- if (selpane == PaneItems && panes[selpane].nrows) {
- p = &panes[selpane];
- row = pane_row_get(p, p->pos);
- item = (struct item *)row->data;
- forkexec((char *[]) { plumbercmd, item->fields[FieldEnclosure], NULL }, plumberia);
- }
+ if (selpane == PaneItems)
+ feed_plumb_selected_item(&panes[selpane], FieldEnclosure);
break;
case 'm': /* toggle mouse mode */
usemouse = !usemouse;
@@ -2363,28 +2378,21 @@ nextpage:
case '\n':
openitem:
if (selpane == PaneFeeds && panes[selpane].nrows)
- feed_open_selected(&panes[PaneFeeds]);
+ feed_open_selected(&panes[selpane]);
else if (selpane == PaneItems && panes[selpane].nrows)
- feed_plumb_selected_item(&panes[PaneItems]);
+ feed_plumb_selected_item(&panes[selpane], FieldLink);
break;
case 'c': /* items: pipe TSV line to program */
case 'p':
case '|':
+ if (selpane == PaneItems)
+ feed_pipe_selected_item(&panes[selpane]);
+ break;
case 'y': /* yank: pipe TSV field to yank URL to clipboard */
case 'E': /* yank: pipe TSV field to yank enclosure to clipboard */
- if (selpane == PaneItems && panes[selpane].nrows) {
- p = &panes[selpane];
- row = pane_row_get(p, p->pos);
- item = (struct item *)row->data;
- switch (ch) {
- case 'y': pipeitem(yankercmd, item, FieldLink, yankeria); break;
- case 'E': pipeitem(yankercmd, item, FieldEnclosure, yankeria); break;
- default:
- markread(p, p->pos, p->pos, 1);
- pipeitem(pipercmd, item, -1, piperia);
- break;
- }
- }
+ if (selpane == PaneItems)
+ feed_yank_selected_item(&panes[selpane],
+ ch == 'y' ? FieldLink : FieldEnclosure);
break;
case 'f': /* mark all read */
case 'F': /* mark all unread */