Fix remembering command when it contains shell special or blank chars.
SVN revision: 13710
This commit is contained in:
parent
96ea83ccb6
commit
9c78703d97
9
src/E.h
9
src/E.h
|
@ -1162,7 +1162,7 @@ int ActionsEnd(EWin * ewin);
|
|||
void About(void);
|
||||
|
||||
int execApplication(const char *params);
|
||||
int doDragButtonEnd(const char *params);
|
||||
void Espawn(int argc, char **argv);
|
||||
|
||||
/* alert.c */
|
||||
void AlertInit(void);
|
||||
|
@ -1677,7 +1677,6 @@ int isfile(const char *s);
|
|||
int isdir(const char *s);
|
||||
int isabspath(const char *s);
|
||||
char **E_ls(const char *dir, int *num);
|
||||
void freestrlist(char **l, int num);
|
||||
void E_rm(const char *s);
|
||||
void E_mv(const char *s, const char *ss);
|
||||
void E_cp(const char *s, const char *ss);
|
||||
|
@ -1922,6 +1921,12 @@ const char *EGetSavePrefixCommon(void);
|
|||
|
||||
/* memory.c */
|
||||
void EDisplayMemUse(void);
|
||||
char **EstrlistDup(char **lst, int num);
|
||||
void EstrlistFree(char **lst, int num);
|
||||
char *EstrlistJoin(char **lst, int num);
|
||||
char *EstrlistEncodeEscaped(char *buf, int len, char **lst,
|
||||
int num);
|
||||
char **EstrlistDecodeEscaped(const char *str, int *pnum);
|
||||
|
||||
/* menus.c */
|
||||
int MenuStyleConfigLoad(FILE * fs);
|
||||
|
|
|
@ -154,6 +154,28 @@ execApplication(const char *params)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
Espawn(int argc __UNUSED__, char **argv)
|
||||
{
|
||||
int fd;
|
||||
|
||||
if (!argv || !argv[0])
|
||||
return;
|
||||
|
||||
if (fork())
|
||||
return;
|
||||
|
||||
setsid();
|
||||
/* Close all file descriptors except the std 3 */
|
||||
for (fd = 3; fd < 1024; fd++)
|
||||
close(fd);
|
||||
|
||||
execvp(argv[0], argv);
|
||||
|
||||
DialogAlertOK(_("There was an error running the program:\n%s\n"), argv[0]);
|
||||
exit(100);
|
||||
}
|
||||
|
||||
void
|
||||
ActionsHandleMotion(void)
|
||||
{
|
||||
|
|
|
@ -366,5 +366,5 @@ CommsBroadcast(const char *s)
|
|||
if (c)
|
||||
CommsSend(c, s);
|
||||
}
|
||||
freestrlist(l, num);
|
||||
EstrlistFree(l, num);
|
||||
}
|
||||
|
|
|
@ -212,7 +212,7 @@ EwinDestroy(EWin * ewin)
|
|||
if (ewin->icccm.wm_command)
|
||||
Efree(ewin->icccm.wm_command);
|
||||
if (ewin->icccm.wm_command_argv)
|
||||
freestrlist(ewin->icccm.wm_command_argv, ewin->icccm.wm_command_argc);
|
||||
EstrlistFree(ewin->icccm.wm_command_argv, ewin->icccm.wm_command_argc);
|
||||
if (ewin->icccm.wm_machine)
|
||||
Efree(ewin->icccm.wm_machine);
|
||||
#if ENABLE_EWMH
|
||||
|
|
11
src/file.c
11
src/file.c
|
@ -195,17 +195,6 @@ E_ls(const char *dir, int *num)
|
|||
return names;
|
||||
}
|
||||
|
||||
void
|
||||
freestrlist(char **l, int num)
|
||||
{
|
||||
if (!l)
|
||||
return;
|
||||
while (num--)
|
||||
if (l[num])
|
||||
Efree(l[num]);
|
||||
Efree(l);
|
||||
}
|
||||
|
||||
void
|
||||
E_rm(const char *s)
|
||||
{
|
||||
|
|
31
src/icccm.c
31
src/icccm.c
|
@ -523,31 +523,6 @@ ICCCM_GetGeoms(EWin * ewin, Atom atom_change)
|
|||
ewin->client.w, ewin->client.h, EwinGetName(ewin));
|
||||
}
|
||||
|
||||
static char *
|
||||
Estrlistjoin(char **pstr, int nstr)
|
||||
{
|
||||
int i, size;
|
||||
char *s;
|
||||
|
||||
if (!pstr || nstr <= 0)
|
||||
return NULL;
|
||||
|
||||
s = NULL;
|
||||
|
||||
size = strlen(pstr[0]) + 1;
|
||||
s = Emalloc(size);
|
||||
strcpy(s, pstr[0]);
|
||||
for (i = 1; i < nstr; i++)
|
||||
{
|
||||
size += strlen(pstr[i]) + 1;
|
||||
s = Erealloc(s, size);
|
||||
strcat(s, " ");
|
||||
strcat(s, pstr[i]);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
#define TryGroup(e) (((e)->client.group != None) && ((e)->client.group != (e)->client.win))
|
||||
|
||||
void
|
||||
|
@ -573,6 +548,9 @@ ICCCM_GetInfo(EWin * ewin, Atom atom_change)
|
|||
if (atom_change == 0 || atom_change == ECORE_X_ATOM_WM_COMMAND)
|
||||
{
|
||||
_EFREE(ewin->icccm.wm_command);
|
||||
if (ewin->icccm.wm_command_argv)
|
||||
EstrlistFree(ewin->icccm.wm_command_argv,
|
||||
ewin->icccm.wm_command_argc);
|
||||
|
||||
ewin->icccm.wm_command_argv =
|
||||
ecore_x_window_prop_string_list_get(ewin->client.win,
|
||||
|
@ -584,8 +562,9 @@ ICCCM_GetInfo(EWin * ewin, Atom atom_change)
|
|||
ECORE_X_ATOM_WM_COMMAND,
|
||||
&(ewin->icccm.
|
||||
wm_command_argc));
|
||||
|
||||
ewin->icccm.wm_command =
|
||||
Estrlistjoin(ewin->icccm.wm_command_argv,
|
||||
EstrlistJoin(ewin->icccm.wm_command_argv,
|
||||
ewin->icccm.wm_command_argc);
|
||||
}
|
||||
|
||||
|
|
155
src/memory.c
155
src/memory.c
|
@ -460,6 +460,161 @@ Estrdupcat2(char *ss, const char *s1, const char *s2)
|
|||
return s;
|
||||
}
|
||||
|
||||
char **
|
||||
EstrlistDup(char **lst, int num)
|
||||
{
|
||||
char **ss;
|
||||
int i;
|
||||
|
||||
if (!lst || num <= 0)
|
||||
return NULL;
|
||||
|
||||
ss = (char **)Emalloc((num + 1) * sizeof(char *));
|
||||
for (i = 0; i < num; i++)
|
||||
ss[i] = Estrdup(lst[i]);
|
||||
ss[i] = NULL;
|
||||
|
||||
return ss;
|
||||
}
|
||||
|
||||
void
|
||||
EstrlistFree(char **lst, int num)
|
||||
{
|
||||
if (!lst)
|
||||
return;
|
||||
while (num--)
|
||||
if (lst[num])
|
||||
Efree(lst[num]);
|
||||
Efree(lst);
|
||||
}
|
||||
|
||||
char *
|
||||
EstrlistJoin(char **lst, int num)
|
||||
{
|
||||
int i, size;
|
||||
char *s;
|
||||
|
||||
if (!lst || num <= 0)
|
||||
return NULL;
|
||||
|
||||
s = NULL;
|
||||
|
||||
size = strlen(lst[0]) + 1;
|
||||
s = Emalloc(size);
|
||||
strcpy(s, lst[0]);
|
||||
for (i = 1; i < num; i++)
|
||||
{
|
||||
size += strlen(lst[i]) + 1;
|
||||
s = Erealloc(s, size);
|
||||
strcat(s, " ");
|
||||
strcat(s, lst[i]);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
char *
|
||||
EstrlistEncodeEscaped(char *buf, int len, char **lst, int num)
|
||||
{
|
||||
int i, j, ch;
|
||||
char *s, *p;
|
||||
|
||||
if (!lst || num <= 0)
|
||||
return NULL;
|
||||
|
||||
j = 0;
|
||||
s = buf;
|
||||
p = lst[0];
|
||||
for (i = 0; i < len - 2; i++)
|
||||
{
|
||||
ch = *p++;
|
||||
switch (ch)
|
||||
{
|
||||
default:
|
||||
*s++ = ch;
|
||||
break;
|
||||
case '\0':
|
||||
if (++j >= num)
|
||||
goto done;
|
||||
p = lst[j];
|
||||
*s++ = ' ';
|
||||
break;
|
||||
case ' ':
|
||||
*s++ = '\\';
|
||||
*s++ = ' ';
|
||||
i++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
*s = '\0';
|
||||
return buf;
|
||||
}
|
||||
|
||||
char **
|
||||
EstrlistDecodeEscaped(const char *str, int *pnum)
|
||||
{
|
||||
int num, len;
|
||||
const char *s, *p;
|
||||
char **lst;
|
||||
|
||||
if (!str)
|
||||
return NULL;
|
||||
|
||||
lst = NULL;
|
||||
num = 0;
|
||||
s = str;
|
||||
for (;;)
|
||||
{
|
||||
while (*s == ' ')
|
||||
s++;
|
||||
if (*s == '\0')
|
||||
break;
|
||||
|
||||
lst = Erealloc(lst, (num + 1) * sizeof(char *));
|
||||
lst[num] = NULL;
|
||||
len = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
p = strchr(s, ' ');
|
||||
if (!p)
|
||||
p = s + strlen(s);
|
||||
|
||||
lst[num] = Erealloc(lst[num], len + p - s + 1);
|
||||
memcpy(lst[num] + len, s, p - s);
|
||||
len += p - s;
|
||||
lst[num][len] = '\0';
|
||||
|
||||
s = p;
|
||||
if (p[-1] == '\\')
|
||||
{
|
||||
if (*p)
|
||||
lst[num][len - 1] = ' ';
|
||||
else
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
while (*s == ' ')
|
||||
s++;
|
||||
if (*s == '\0')
|
||||
break;
|
||||
}
|
||||
num++;
|
||||
}
|
||||
|
||||
/* Append NULL item */
|
||||
lst = Erealloc(lst, (num + 1) * sizeof(char *));
|
||||
lst[num] = NULL;
|
||||
|
||||
*pnum = num;
|
||||
return lst;
|
||||
}
|
||||
|
||||
#if !USE_LIBC_SETENV
|
||||
int
|
||||
Esetenv(const char *name, const char *value, int overwrite __UNUSED__)
|
||||
|
|
|
@ -222,7 +222,7 @@ MenuCreateFromDirectory(const char *name, Menu * parent, MenuStyle * ms,
|
|||
if (p)
|
||||
ProgressbarDestroy(p);
|
||||
if (list)
|
||||
freestrlist(list, num);
|
||||
EstrlistFree(list, num);
|
||||
|
||||
return m;
|
||||
}
|
||||
|
@ -511,7 +511,7 @@ MenuCreateFromGnome(const char *name, Menu * parent, MenuStyle * ms,
|
|||
}
|
||||
}
|
||||
if (list)
|
||||
freestrlist(list, num);
|
||||
EstrlistFree(list, num);
|
||||
|
||||
return m;
|
||||
}
|
||||
|
@ -538,7 +538,7 @@ MenuCreateFromThemes(const char *name, MenuStyle * ms)
|
|||
MenuAddItem(m, mi);
|
||||
}
|
||||
if (lst)
|
||||
freestrlist(lst, i);
|
||||
EstrlistFree(lst, i);
|
||||
|
||||
return m;
|
||||
}
|
||||
|
|
21
src/snaps.c
21
src/snaps.c
|
@ -42,6 +42,8 @@ struct _snapshot
|
|||
char sticky;
|
||||
char shaded;
|
||||
char *cmd;
|
||||
int cmd_argc;
|
||||
char **cmd_argv;
|
||||
int *groups;
|
||||
int num_groups;
|
||||
char skiptask;
|
||||
|
@ -89,6 +91,8 @@ SnapshotDestroy(Snapshot * sn)
|
|||
Efree(sn->border_name);
|
||||
if (sn->cmd)
|
||||
Efree(sn->cmd);
|
||||
if (sn->cmd_argv)
|
||||
EstrlistFree(sn->cmd_argv, sn->cmd_argc);
|
||||
if (sn->groups)
|
||||
Efree(sn->groups);
|
||||
Efree(sn);
|
||||
|
@ -281,7 +285,12 @@ SnapEwinCmd(Snapshot * sn, EWin * ewin)
|
|||
|
||||
if (sn->cmd)
|
||||
Efree(sn->cmd);
|
||||
if (sn->cmd_argv)
|
||||
EstrlistFree(sn->cmd_argv, sn->cmd_argc);
|
||||
sn->cmd = Estrdup(ewin->icccm.wm_command);
|
||||
sn->cmd_argv =
|
||||
EstrlistDup(ewin->icccm.wm_command_argv, ewin->icccm.wm_command_argc);
|
||||
sn->cmd_argc = ewin->icccm.wm_command_argc;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1081,7 +1090,7 @@ Real_SaveSnapInfo(int dumval __UNUSED__, void *dumdat __UNUSED__)
|
|||
{
|
||||
Snapshot **lst, *sn;
|
||||
int i, j, num;
|
||||
char buf[4096], s[4096];
|
||||
char buf[4096], s[4096], ss[4096];
|
||||
FILE *f;
|
||||
|
||||
if (!Mode.wm.save_ok)
|
||||
|
@ -1110,7 +1119,9 @@ Real_SaveSnapInfo(int dumval __UNUSED__, void *dumdat __UNUSED__)
|
|||
if (sn->use_flags & SNAP_USE_BORDER)
|
||||
fprintf(f, "BORDER: %s\n", sn->border_name);
|
||||
if (sn->use_flags & SNAP_USE_COMMAND)
|
||||
fprintf(f, "CMD: %s\n", sn->cmd);
|
||||
fprintf(f, "CMD: %s\n",
|
||||
EstrlistEncodeEscaped(ss, sizeof(ss),
|
||||
sn->cmd_argv, sn->cmd_argc));
|
||||
if (sn->use_flags & SNAP_USE_DESK)
|
||||
fprintf(f, "DESKTOP: %i\n", sn->desktop);
|
||||
if (sn->use_flags & SNAP_USE_POS)
|
||||
|
@ -1176,7 +1187,7 @@ SpawnSnappedCmds(void)
|
|||
{
|
||||
sn = lst[i];
|
||||
if ((sn->use_flags & SNAP_USE_COMMAND) && (sn->cmd) && !sn->used)
|
||||
execApplication(sn->cmd);
|
||||
Espawn(sn->cmd_argc, sn->cmd_argv);
|
||||
}
|
||||
Efree(lst);
|
||||
}
|
||||
|
@ -1227,7 +1238,9 @@ LoadSnapInfo(void)
|
|||
else if (!strcmp(s, "CMD:"))
|
||||
{
|
||||
sn->use_flags |= SNAP_USE_COMMAND;
|
||||
sn->cmd = Estrdup(atword(buf, 2));
|
||||
sn->cmd_argv =
|
||||
EstrlistDecodeEscaped(atword(buf, 2), &(sn->cmd_argc));
|
||||
sn->cmd = EstrlistJoin(sn->cmd_argv, sn->cmd_argc);
|
||||
}
|
||||
else if (!strcmp(s, "DESKTOP:"))
|
||||
{
|
||||
|
|
|
@ -300,7 +300,7 @@ TextSize(TextClass * tclass, int active, int sticky, int state,
|
|||
*width = wid;
|
||||
}
|
||||
}
|
||||
freestrlist(lines, num_lines);
|
||||
EstrlistFree(lines, num_lines);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -765,7 +765,7 @@ TextstateDrawText(TextState * ts, Window win, const char *text, int x, int y,
|
|||
yy += ts->xfont->ascent + ts->xfont->descent;
|
||||
}
|
||||
}
|
||||
freestrlist(lines, num_lines);
|
||||
EstrlistFree(lines, num_lines);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -147,7 +147,7 @@ append_merge_dir(char *dir, char ***list, int *count)
|
|||
(*list)[(*count) - 1] = Estrdup(ss);
|
||||
}
|
||||
}
|
||||
freestrlist(str, num);
|
||||
EstrlistFree(str, num);
|
||||
|
||||
return def;
|
||||
}
|
||||
|
@ -249,7 +249,7 @@ ThemeGetDefault(void)
|
|||
break;
|
||||
}
|
||||
if (lst)
|
||||
freestrlist(lst, num);
|
||||
EstrlistFree(lst, num);
|
||||
if (path)
|
||||
return ThemeGetPath(path);
|
||||
|
||||
|
@ -469,7 +469,7 @@ ThemesIpc(const char *params, Client * c __UNUSED__)
|
|||
for (i = 0; i < num; i++)
|
||||
IpcPrintf("%s\n", lst[i]);
|
||||
if (lst)
|
||||
freestrlist(lst, num);
|
||||
EstrlistFree(lst, num);
|
||||
}
|
||||
else if (!strcmp(cmd, "use"))
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue