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)
{