There is still a problem in FvwmButtons when you omit the "waitfor" string in
lines like:
*FvwmButtons Xterm   rterm.xpm	     	Exec exec xterm & 
The code for parsing these lines has been more or less broken for a long time
now.  Attached is my attempt at a patch to cure things:
*** FvwmButtons.c.orig	Tue Mar 26 10:40:01 1996
--- FvwmButtons.c	Tue Mar 26 10:47:34 1996
***************
*** 375,414 ****
                         * case the button stays down until window
                         * "identifier" materializes */
                        i=4;
                        while((Buttons[CurrentButton].action[i] != 0)&&
- 			    (Buttons[CurrentButton].action[i] != '"')&&
                              isspace(Buttons[CurrentButton].action[i]))
                          i++;
                        if(Buttons[CurrentButton].action[i] == '"')
                          {
                            i2=i+1;
                            while((Buttons[CurrentButton].action[i2] != 0)&&
                                  (Buttons[CurrentButton].action[i2] != '"'))
                              i2++;
                          }
! 		      else
                          i2 = i;
  
- 		      if(i2 - i >1)
- 			{
- 			  Buttons[CurrentButton].hangon = safemalloc(i2-i);
- 			  strncpy(Buttons[CurrentButton].hangon,
- 				  &Buttons[CurrentButton].action[i+1],i2-i-1);
- 			  Buttons[CurrentButton].hangon[i2-i-1] = 0;
- 			  Buttons[CurrentButton].up = 0;
- 			  Buttons[CurrentButton].swallow = 0;
- 			}
- 		      else
- 			{
- #if 0
- 			  i2 = 4; /* ckh - should this be i2++ instead? */
- #else
-                           i2++;
- #endif
- 			}
                        tmp=safemalloc(strlen(Buttons[CurrentButton].action));
                        strcpy(tmp,"Exec ");
! 		      i3= i2+1;
                        while((Buttons[CurrentButton].action[i3] != 0)&&
                              (isspace(Buttons[CurrentButton].action[i3])))
                          i3++;			  
--- 375,446 ----
                         * case the button stays down until window
                         * "identifier" materializes */
                        i=4;
+ 
+ 		      /* Looping while != '"' and isspace is redundant */
+ 
                        while((Buttons[CurrentButton].action[i] != 0)&&
                              isspace(Buttons[CurrentButton].action[i]))
                          i++;
+ 
+ 		      /* 
+ 			 Watch carefully from now on ... 
+ 
+ 		         i is pointing at the first non-space character after the
+ 			 leading "exec", or at the end of the string.
+ 
+ 			 Test for a quote.
+ 		      */
+ 
                        if(Buttons[CurrentButton].action[i] == '"')
                          {
                            i2=i+1;
                            while((Buttons[CurrentButton].action[i2] != 0)&&
                                  (Buttons[CurrentButton].action[i2] != '"'))
                              i2++;
+ 
+ 			  /* 
+ 			     Now i is index of opening quote and i2 is index of
+ 			     closing quote or null terminator
+ 			  */
+ 
+ 			  if(i2 - i >1)
+ 			    {
+ 			      /* We know there is something between the quotes */
+ 
+ 			      Buttons[CurrentButton].hangon = safemalloc(i2-i);
+ 			      strncpy(Buttons[CurrentButton].hangon,
+ 				      &Buttons[CurrentButton].action[i+1],i2-i-1);
+ 			      Buttons[CurrentButton].hangon[i2-i-1] = 0;
+ 			      Buttons[CurrentButton].up = 0;
+ 			      Buttons[CurrentButton].swallow = 0;
+ 			    }
+ 
+ 			  /* 
+ 			     Move i2 to the character after the closing quote (unless the
+ 			     quote was missing - we don't want to skip over the end of
+ 			     the string.
+ 			  */
+ 
+ 			  if (Buttons[CurrentButton].action[i2] == '"')
+ 			    i2++;
                          }
! 		       else
! 			/*
! 			   No quote was found.  Leave i2 pointing at non-space character
! 			   after the leading "exec".
! 			*/
                          i2 = i;
  
                        tmp=safemalloc(strlen(Buttons[CurrentButton].action));
                        strcpy(tmp,"Exec ");
! 
! 		      /* 
! 			 Now i2 is pointing after any closing quote.  Skip to beginning of 
! 			 action.  DO NOT add 1 to i2 here since we could lose the first
! 			 character of the action.
! 		      */
! 
! 		      i3= i2;
                        while((Buttons[CurrentButton].action[i3] != 0)&&
                              (isspace(Buttons[CurrentButton].action[i3])))
                          i3++;			  
-- 
-------------------------------------------------------------------------------
Richard Evans			 		Telephone : (+44) 1223 428200
Tadpole Technology plc		 		Fax       : (+44) 1223 428201
Cambridge Science Park
Milton Road			 		E-Mail    : rde_at_tadpole.co.uk
Cambridge, CB4 4WQ, UK
-------------------------------------------------------------------------------
--
Visit the official FVWM web page at <URL:http://www.hpc.uh.edu/fvwm/>.
To unsubscribe from the list, send "unsubscribe fvwm" in the body of a
message to majordomo_at_hpc.uh.edu.
To report problems, send mail to fvwm-owner_at_hpc.uh.edu.
Received on Tue Apr 02 1996 - 08:11:00 BST