diff --git a/ChangeLog b/ChangeLog
index 0fd8a333..bcb44e8f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,8 +6,6 @@
* Added support for X alignment across multi-lined objects (i.e., using
$alignr with $exec)
* Disabled OpenMP code until GCC's implementation stabilizes
-
-2009-07-18
* www.weather.com can now be used as well as a source of weather data
2009-07-11
diff --git a/doc/variables.xml b/doc/variables.xml
index 8d18ecf0..a016be57 100644
--- a/doc/variables.xml
+++ b/doc/variables.xml
@@ -2583,12 +2583,11 @@
may also contain variables. 'step' is optional and defaults
to 1 if not set. If a var creates output on multiple lines
then the lines are placed behind each other separated with
- a '|'-sign. Do NOT use vars that change colors or otherwise
- affect the design inside a scrolling text. If you want
- spaces between the start and the end of 'text', place them
- at the end of 'text' not at the front ("foobar" and "
- foobar" can both generate "barfoo" but "foobar " will keep
- the spaces like this "bar foo").
+ a '|'-sign. The effect of $color is disabled inside scroll.
+ If you want spaces between the start and the end of 'text',
+ place them at the end of 'text' not at the front ("4 foobar"
+ can generate "arfo" but "4 foobar " will keep the space like
+ this "ar f").
diff --git a/src/conky.c b/src/conky.c
index 6291772a..0971cba3 100644
--- a/src/conky.c
+++ b/src/conky.c
@@ -1238,6 +1238,8 @@ static int parse_top_args(const char *s, const char *arg, struct text_object *ob
return 1;
}
+long current_text_color;
+
/* construct_text_object() creates a new text_object */
static struct text_object *construct_text_object(const char *s,
const char *arg, long line, char allow_threaded, void **ifblock_opaque, void *free_at_crash)
@@ -1650,28 +1652,39 @@ static struct text_object *construct_text_object(const char *s,
#ifdef X11
if (output_methods & TO_X) {
obj->data.l = arg ? get_x11_color(arg) : default_fg_color;
+ current_text_color = obj->data.l;
}
#endif /* X11 */
END OBJ(color0, 0)
obj->data.l = color0;
+ current_text_color = obj->data.l;
END OBJ(color1, 0)
obj->data.l = color1;
+ current_text_color = obj->data.l;
END OBJ(color2, 0)
obj->data.l = color2;
+ current_text_color = obj->data.l;
END OBJ(color3, 0)
obj->data.l = color3;
+ current_text_color = obj->data.l;
END OBJ(color4, 0)
obj->data.l = color4;
+ current_text_color = obj->data.l;
END OBJ(color5, 0)
obj->data.l = color5;
+ current_text_color = obj->data.l;
END OBJ(color6, 0)
obj->data.l = color6;
+ current_text_color = obj->data.l;
END OBJ(color7, 0)
obj->data.l = color7;
+ current_text_color = obj->data.l;
END OBJ(color8, 0)
obj->data.l = color8;
+ current_text_color = obj->data.l;
END OBJ(color9, 0)
obj->data.l = color9;
+ current_text_color = obj->data.l;
#ifdef X11
END OBJ(font, 0)
obj->data.s = scan_font(arg);
@@ -2967,6 +2980,7 @@ static struct text_object *construct_text_object(const char *s,
END OBJ(scroll, 0)
int n1 = 0, n2 = 0;
+ obj->data.scroll.resetcolor = current_text_color;
obj->data.scroll.step = 1;
if (arg && sscanf(arg, "%u %n", &obj->data.scroll.show, &n1) > 0) {
sscanf(arg + n1, "%u %n", &obj->data.scroll.step, &n2);
@@ -5775,7 +5789,7 @@ static void generate_text_internal(char *p, int p_max_size,
snprintf(p, p_max_size, "%s", buf);
}
OBJ(scroll) {
- unsigned int j;
+ unsigned int j, k, colorchanges = 0;
char *tmp, buf[max_user_text];
generate_text_internal(buf, max_user_text,
*obj->sub, cur);
@@ -5784,11 +5798,16 @@ static void generate_text_internal(char *p, int p_max_size,
snprintf(p, p_max_size, "%s", buf);
break;
}
-#define LINESEPARATOR '|'
- //place all the lines behind each other with LINESEPARATOR between them
for(j = 0; buf[j] != 0; j++) {
- if(buf[j]=='\n') {
+ switch(buf[j]) {
+ case '\n': //place all the lines behind each other with LINESEPARATOR between them
+#define LINESEPARATOR '|'
buf[j]=LINESEPARATOR;
+ break;
+ case 1: //make sure $color isn't treated like a char
+ strfold(buf+j, 1);
+ colorchanges++;
+ break;
}
}
//scroll the output obj->data.scroll.start places by copying that many chars from
@@ -5803,7 +5822,10 @@ static void generate_text_internal(char *p, int p_max_size,
free(tmp);
//only show the requested number of chars
if(obj->data.scroll.show < j) {
- buf[obj->data.scroll.show] = 0;
+ for(k = 0; k < colorchanges; k++) {
+ buf[obj->data.scroll.show + k] = 1;
+ }
+ buf[obj->data.scroll.show + colorchanges] = 0;
}
//next time, scroll a place more or reset scrolling if we are at the end
obj->data.scroll.start += obj->data.scroll.step;
@@ -5811,6 +5833,7 @@ static void generate_text_internal(char *p, int p_max_size,
obj->data.scroll.start = 0;
}
snprintf(p, p_max_size, "%s", buf);
+ new_fg(p + strlen(p), obj->data.scroll.resetcolor);
}
OBJ(combine) {
char buf[2][max_user_text];
@@ -7688,6 +7711,7 @@ static void set_default_configurations_for_x(void)
color7 = default_fg_color;
color8 = default_fg_color;
color9 = default_fg_color;
+ current_text_color = default_fg_color;
}
#endif /* X11 */
diff --git a/src/text_object.h b/src/text_object.h
index 75ae83ec..4d759a20 100644
--- a/src/text_object.h
+++ b/src/text_object.h
@@ -561,6 +561,7 @@ struct text_object {
unsigned int show;
unsigned int step;
unsigned int start;
+ long resetcolor;
} scroll;
struct {