Simplified it_shell_cmd() using SXIV_IMG env-variable

This commit is contained in:
Bert 2011-09-03 15:58:58 +02:00
parent de6b58a315
commit 9fa0bbca17
2 changed files with 28 additions and 43 deletions

View file

@ -16,7 +16,9 @@
* Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301, USA.
*/ */
#define _POSIX_C_SOURCE 200112L /* for setenv(3) */
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/wait.h> #include <sys/wait.h>
@ -345,45 +347,27 @@ int it_open_with(arg_t a) {
warn("could not exec: %s", prog); warn("could not exec: %s", prog);
exit(1); exit(1);
} else if (pid < 0) { } else if (pid < 0) {
warn("could not for. program was: %s", prog); warn("could not fork. program was: %s", prog);
} }
return 0; return 0;
} }
int it_shell_cmd(arg_t a) { int it_shell_cmd(arg_t a) {
const char *cline = (const char*) a; int n, status;
char *cn, *cmdline; const char *cmdline = (const char*) a;
const char *co, *fpath;
int fpcnt, fplen, status;
pid_t pid; pid_t pid;
if (!cline || !*cline) if (!cmdline || !*cmdline)
return 0; return 0;
/* build command line: */ n = mode == MODE_IMAGE ? fileidx : tns.sel;
fpcnt = 0;
co = cline - 1; if (setenv("SXIV_IMG", files[n].path, 1) < 0) {
while ((co = strchr(co + 1, '#'))) warn("could not change env.-variable: SXIV_IMG. command line was: %s",
fpcnt++; cmdline);
if (!fpcnt)
return 0; return 0;
fpath = files[mode == MODE_IMAGE ? fileidx : tns.sel].path;
fplen = strlen(fpath);
cn = cmdline = (char*) s_malloc((strlen(cline) + fpcnt * (fplen + 2)) *
sizeof(char));
/* replace all '#' with filename: */
for (co = cline; *co; co++) {
if (*co == '#') {
*cn++ = '"';
strcpy(cn, fpath);
cn += fplen;
*cn++ = '"';
} else {
*cn++ = *co;
} }
}
*cn = '\0';
win_set_cursor(&win, CURSOR_WATCH); win_set_cursor(&win, CURSOR_WATCH);
@ -402,25 +386,22 @@ int it_shell_cmd(arg_t a) {
WEXITSTATUS(status), cmdline); WEXITSTATUS(status), cmdline);
if (mode == MODE_IMAGE) { if (mode == MODE_IMAGE) {
if (fileidx < tns.cnt)
tns_load(&tns, fileidx, &files[fileidx], False, True);
img_close(&img, 1); img_close(&img, 1);
load_image(fileidx); load_image(fileidx);
} else { }
if (!tns_load(&tns, tns.sel, &files[tns.sel], True, False)) { if (!tns_load(&tns, n, &files[n], True, mode == MODE_IMAGE) &&
mode == MODE_THUMB)
{
remove_file(tns.sel, 0); remove_file(tns.sel, 0);
tns.dirty = 1; tns.dirty = 1;
if (tns.sel >= tns.cnt) if (tns.sel >= tns.cnt)
tns.sel = tns.cnt - 1; tns.sel = tns.cnt - 1;
} }
}
end: end:
if (mode == MODE_THUMB) if (mode == MODE_THUMB)
win_set_cursor(&win, CURSOR_ARROW); win_set_cursor(&win, CURSOR_ARROW);
/* else: cursor gets reset in redraw() */ /* else: cursor gets reset in redraw() */
free(cmdline);
return 1; return 1;
} }

View file

@ -110,11 +110,15 @@ static const keymap_t keys[] = {
/* open current image with given program: */ /* open current image with given program: */
{ True, XK_g, it_open_with, (arg_t) "gimp" }, { True, XK_g, it_open_with, (arg_t) "gimp" },
/* run shell command line on current file ('#' is replaced by file path: */ /* run shell command line on current file ("$SXIV_IMG"): */
{ True, XK_less, it_shell_cmd, (arg_t) "mogrify -rotate -90 #" }, { True, XK_less, it_shell_cmd, (arg_t) \
{ True, XK_greater, it_shell_cmd, (arg_t) "mogrify -rotate +90 #" }, "mogrify -rotate -90 \"$SXIV_IMG\"" },
{ True, XK_comma, it_shell_cmd, (arg_t) "jpegtran -rotate 270 -copy all -outfile # #" }, { True, XK_greater, it_shell_cmd, (arg_t) \
{ True, XK_period, it_shell_cmd, (arg_t) "jpegtran -rotate 90 -copy all -outfile # #" }, "mogrify -rotate +90 \"$SXIV_IMG\"" },
{ True, XK_comma, it_shell_cmd, (arg_t) \
"jpegtran -rotate 270 -copy all -outfile \"$SXIV_IMG\" \"$SXIV_IMG\"" },
{ True, XK_period, it_shell_cmd, (arg_t) \
"jpegtran -rotate 90 -copy all -outfile \"$SXIV_IMG\" \"$SXIV_IMG\"" },
}; };
/* mouse button mappings for image mode: */ /* mouse button mappings for image mode: */