Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: E.h actions.c comms.c ewins.c file.c icccm.c memory.c menus-misc.c snaps.c text.c theme.c Log Message: Fix remembering command when it contains shell special or blank chars. =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v retrieving revision 1.387 retrieving revision 1.388 diff -u -3 -r1.387 -r1.388 --- E.h 6 Mar 2005 21:29:43 -0000 1.387 +++ E.h 12 Mar 2005 11:09:29 -0000 1.388 @@ -1162,7 +1162,7 @@ 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 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 @@ /* 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); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/actions.c,v retrieving revision 1.185 retrieving revision 1.186 diff -u -3 -r1.185 -r1.186 --- actions.c 25 Feb 2005 19:18:00 -0000 1.185 +++ actions.c 12 Mar 2005 11:09:31 -0000 1.186 @@ -155,6 +155,28 @@ } 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) { switch (Mode.mode) =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/comms.c,v retrieving revision 1.66 retrieving revision 1.67 diff -u -3 -r1.66 -r1.67 --- comms.c 6 Mar 2005 11:17:04 -0000 1.66 +++ comms.c 12 Mar 2005 11:09:31 -0000 1.67 @@ -366,5 +366,5 @@ if (c) CommsSend(c, s); } - freestrlist(l, num); + EstrlistFree(l, num); } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ewins.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -3 -r1.29 -r1.30 --- ewins.c 9 Mar 2005 23:36:49 -0000 1.29 +++ ewins.c 12 Mar 2005 11:09:32 -0000 1.30 @@ -212,7 +212,7 @@ 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 =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/file.c,v retrieving revision 1.66 retrieving revision 1.67 diff -u -3 -r1.66 -r1.67 --- file.c 1 Feb 2005 23:29:46 -0000 1.66 +++ file.c 12 Mar 2005 11:09:32 -0000 1.67 @@ -196,17 +196,6 @@ } 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) { if ((!s) || (!*s)) =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/icccm.c,v retrieving revision 1.88 retrieving revision 1.89 diff -u -3 -r1.88 -r1.89 --- icccm.c 6 Mar 2005 11:40:55 -0000 1.88 +++ icccm.c 12 Mar 2005 11:09:32 -0000 1.89 @@ -523,31 +523,6 @@ 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 @@ 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 @@ 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); } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/memory.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -3 -r1.40 -r1.41 --- memory.c 25 Jan 2005 21:57:38 -0000 1.40 +++ memory.c 12 Mar 2005 11:09:33 -0000 1.41 @@ -460,6 +460,161 @@ 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__) =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/menus-misc.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- menus-misc.c 1 Feb 2005 21:38:35 -0000 1.6 +++ menus-misc.c 12 Mar 2005 11:09:33 -0000 1.7 @@ -222,7 +222,7 @@ if (p) ProgressbarDestroy(p); if (list) - freestrlist(list, num); + EstrlistFree(list, num); return m; } @@ -511,7 +511,7 @@ } } if (list) - freestrlist(list, num); + EstrlistFree(list, num); return m; } @@ -538,7 +538,7 @@ MenuAddItem(m, mi); } if (lst) - freestrlist(lst, i); + EstrlistFree(lst, i); return m; } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/snaps.c,v retrieving revision 1.85 retrieving revision 1.86 diff -u -3 -r1.85 -r1.86 --- snaps.c 6 Mar 2005 11:40:56 -0000 1.85 +++ snaps.c 12 Mar 2005 11:09:33 -0000 1.86 @@ -42,6 +42,8 @@ char sticky; char shaded; char *cmd; + int cmd_argc; + char **cmd_argv; int *groups; int num_groups; char skiptask; @@ -89,6 +91,8 @@ 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 @@ 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 @@ { 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 @@ 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 @@ { 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 @@ 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:")) { =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/text.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -3 -r1.50 -r1.51 --- text.c 9 Mar 2005 23:06:43 -0000 1.50 +++ text.c 12 Mar 2005 11:09:33 -0000 1.51 @@ -300,7 +300,7 @@ *width = wid; } } - freestrlist(lines, num_lines); + EstrlistFree(lines, num_lines); } void @@ -765,7 +765,7 @@ yy += ts->xfont->ascent + ts->xfont->descent; } } - freestrlist(lines, num_lines); + EstrlistFree(lines, num_lines); } void =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/theme.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -3 -r1.44 -r1.45 --- theme.c 27 Feb 2005 18:57:49 -0000 1.44 +++ theme.c 12 Mar 2005 11:09:33 -0000 1.45 @@ -147,7 +147,7 @@ (*list)[(*count) - 1] = Estrdup(ss); } } - freestrlist(str, num); + EstrlistFree(str, num); return def; } @@ -249,7 +249,7 @@ break; } if (lst) - freestrlist(lst, num); + EstrlistFree(lst, num); if (path) return ThemeGetPath(path); @@ -469,7 +469,7 @@ for (i = 0; i < num; i++) IpcPrintf("%s\n", lst[i]); if (lst) - freestrlist(lst, num); + EstrlistFree(lst, num); } else if (!strcmp(cmd, "use")) { ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs