I've written a patch to allow nesting of variables as in $[desk.name$[desk.n]].

/Viktor
Index: ChangeLog
===================================================================
RCS file: /home/cvs/fvwm/fvwm/ChangeLog,v
retrieving revision 1.2621
diff -u -r1.2621 ChangeLog
--- ChangeLog   26 Aug 2005 02:11:58 -0000      1.2621
+++ ChangeLog   13 Sep 2005 06:00:41 -0000
@@ -1,3 +1,10 @@
+2005-09-13  Viktor Griph  <[EMAIL PROTECTED]>
+
+       * NEWS: 
+       * AUTHORS: 
+       * fvwm/expand.c (expand_vars_extended, expand_vars): 
+       allow nesting of variables
+
 2005-08-26  Mikhael Goikhman  <[EMAIL PROTECTED]>
 
        * NEWS:
Index: AUTHORS
===================================================================
RCS file: /home/cvs/fvwm/fvwm/AUTHORS,v
retrieving revision 1.105
diff -u -r1.105 AUTHORS
--- AUTHORS     23 Aug 2005 23:14:02 -0000      1.105
+++ AUTHORS     13 Sep 2005 06:00:41 -0000
@@ -8,6 +8,7 @@
 Viktor Griph:
 Patch for Perl modules on 64 bit machines.
 EdgeHasPointer and EdgeIsActive test conditions.
+Nested variable expansion
 
 Bjoern Steinbrink:
 Patch for FvwmScript tasks running too often.
Index: NEWS
===================================================================
RCS file: /home/cvs/fvwm/fvwm/NEWS,v
retrieving revision 1.573
diff -u -r1.573 NEWS
--- NEWS        26 Aug 2005 02:11:58 -0000      1.573
+++ NEWS        13 Sep 2005 06:00:42 -0000
@@ -5,6 +5,10 @@
 
 Changes in beta release 2.5.15 (not released yet)
 
+* New features:
+
+   - Variables can be nested as $[desk.name$[desk.n]]
+
 * Bug Fixes:
 
    - Supported a new fribidi version 0.10.5 in addition to 0.10.4.
Index: fvwm/expand.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/expand.c,v
retrieving revision 1.17
diff -u -r1.17 expand.c
--- fvwm/expand.c       3 Jun 2004 12:43:24 -0000       1.17
+++ fvwm/expand.c       13 Sep 2005 06:00:42 -0000
@@ -196,7 +196,7 @@
 /* ---------------------------- local functions ---------------------------- */
 
 static signed int expand_vars_extended(
-       char *var_name, char *output, cond_rc_t *cond_rc,
+       char *var_name, char *output,char *arguments[], cond_rc_t *cond_rc,
        const exec_context_t *exc)
 {
        char *s;
@@ -217,6 +217,8 @@
        Window context_w = Scr.Root;
        FvwmWindow *fw = exc->w.fw;
 
+       /* handle nested variables */
+       var_name=expand_vars(var_name,arguments,False,False,cond_rc,exc);
        /* allow partial matches for *.cs, gt, ... etc. variables */
        switch ((i = GetTokenIndex(var_name, partial_function_vars, -1, &rest)))
        {
@@ -723,7 +725,7 @@
        cond_rc_t *cond_rc, const exec_context_t *exc)
 {
        int l, i, l2, n, k, j, m;
-       int xlen;
+       int xlen, xlevel;
        char *out;
        char *var;
        const char *string = NULL;
@@ -755,9 +757,22 @@
                                /* extended variables */
                                var = &input[i+2];
                                m = i + 2;
-                               while (m < l && input[m] != ']' && input[m])
+                               xlevel = 1;
+                               while (m < l && xlevel && input[m])
                                {
-                                       m++;
+                                       /* handle nested variables */
+                                       if (input[m] == ']')
+                                       {
+                                               xlevel--;
+                                       }
+                                       else if (input[m] == '[')
+                                       {
+                                               xlevel++;
+                                       }
+                                       if (xlevel)
+                                       {
+                                               m++;
+                                       }
                                }
                                if (input[m] == ']')
                                {
@@ -767,7 +782,8 @@
                                        if (!addto)
                                        {
                                                xlen = expand_vars_extended(
-                                                       var, NULL, cond_rc,
+                                                       var, NULL, arguments,
+                                                       cond_rc,
                                                        exc);
                                                if (xlen >= 0)
                                                {
@@ -890,9 +906,22 @@
                                }
                                var = &input[i+2];
                                m = i + 2;
-                               while (m < l && input[m] != ']' && input[m])
+                               xlevel = 1;
+                               while (m < l && xlevel && input[m])
                                {
-                                       m++;
+                                       /* handle nested variables */
+                                       if (input[m] == ']')
+                                       {
+                                               xlevel--;
+                                       }
+                                       else if (input[m] == '[')
+                                       {
+                                               xlevel++;
+                                       }
+                                       if (xlevel)
+                                       {
+                                               m++;
+                                       }
                                }
                                if (input[m] == ']')
                                {
@@ -900,7 +929,8 @@
                                        /* handle variable name */
                                        k = strlen(var);
                                        xlen = expand_vars_extended(
-                                               var, &out[j], cond_rc, exc);
+                                               var, &out[j], arguments,
+                                               cond_rc, exc);
                                        input[m] = ']';
                                        if (xlen >= 0)
                                        {

Reply via email to