make plumb, pipe, yank a function and reuse them for keybinds and mouse actions… | |
git clone git://git.codemadness.org/sfeed_curses | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 65f7223309e929522ca4e3762604f10653db5aca | |
parent edcbb556469e5381e61f0d733b95b472d55ecf44 | |
Author: Hiltjo Posthuma <[email protected]> | |
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(-) | |
--- | |
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 }, plumber… | |
+} | |
+ | |
+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 }, plu… | |
+ 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… | |
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], Fi… | |
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… | |
- } | |
+ if (selpane == PaneItems) | |
+ feed_plumb_selected_item(&panes[selpane], Fiel… | |
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], Fiel… | |
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 clipboa… | |
- 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,… | |
- case 'E': pipeitem(yankercmd, item, FieldEnclo… | |
- 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 … | |
break; | |
case 'f': /* mark all read */ | |
case 'F': /* mark all unread */ |