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

Reply via email to