mirror of
https://github.com/Llewellynvdm/conky.git
synced 2025-02-12 08:58:28 +00:00
add support for template objects
Basically you can define a template like this: | template0 \1:\n ${fs_free \2} / ${fs_used \2} and use it later like this: | ${template0 root /} | ${template0 boot /boot} which is exactly the same as the following: | root: | ${fs_free /} / ${fs_used /} | boot: | ${fs_free /boot} / ${fs_used /boot} hope you like it, I do already. :) git-svn-id: https://conky.svn.sourceforge.net/svnroot/conky/trunk/conky1@1270 7f574dfc-610e-0410-a909-a81674777703
This commit is contained in:
parent
820e0d24c4
commit
ce5eb880e7
@ -1,5 +1,8 @@
|
|||||||
# $Id$
|
# $Id$
|
||||||
|
|
||||||
|
2008-11-29
|
||||||
|
* Added template support
|
||||||
|
|
||||||
2008-10-08
|
2008-10-08
|
||||||
* Applied OpenBSD patches
|
* Applied OpenBSD patches
|
||||||
* Added $if_mpd_playing patch (thanks tarpman)
|
* Added $if_mpd_playing patch (thanks tarpman)
|
||||||
|
@ -357,6 +357,13 @@
|
|||||||
<para></para></listitem>
|
<para></para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><command><option>templateN</option></command></term>
|
||||||
|
<listitem>
|
||||||
|
Define a template for later use inside TEXT segments. Substitute N by a digit between 0 and 9, inclusively. The value of the variable is being inserted into the stuff below TEXT at the corresponding position, but before some substitutions are applied: any occuring '\N' (where N is a positive integer) will be substituted by the Nth param specified, any occuring '\n' will be translated into a real newline and '\\' is being substituted by a single backslash ('\').
|
||||||
|
<para></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><command><option>total_run_times</option></command></term>
|
<term><command><option>total_run_times</option></command></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
@ -1970,6 +1970,18 @@
|
|||||||
<para></para></listitem>
|
<para></para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term>
|
||||||
|
<command><option>templateN</option></command>
|
||||||
|
<option>(arg1)</option>
|
||||||
|
<option>(arg2)</option>
|
||||||
|
<option>(arg3 ...)</option>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
Evaluate the content of the templateN configuration variable (where N is a value between 0 and 9, inclusively), applying substitutions as described in the documentation of the corresponding configuration variable. The number of arguments is optional, but must match the highest referred index in the template.
|
||||||
|
<para></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>
|
<term>
|
||||||
<command><option>time</option></command>
|
<command><option>time</option></command>
|
||||||
|
170
src/conky.c
170
src/conky.c
@ -385,6 +385,8 @@ static int sensor_device;
|
|||||||
static long color0, color1, color2, color3, color4, color5, color6, color7,
|
static long color0, color1, color2, color3, color4, color5, color6, color7,
|
||||||
color8, color9;
|
color8, color9;
|
||||||
|
|
||||||
|
static char *template[10];
|
||||||
|
|
||||||
/* maximum number of special things, e.g. fonts, offsets, aligns, etc. */
|
/* maximum number of special things, e.g. fonts, offsets, aligns, etc. */
|
||||||
static unsigned int max_specials = MAX_SPECIALS_DEFAULT;
|
static unsigned int max_specials = MAX_SPECIALS_DEFAULT;
|
||||||
|
|
||||||
@ -4263,6 +4265,114 @@ static struct text_object *create_plain_text(const char *s)
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct text_object_list *extract_variable_text_internal(const char *, char);
|
||||||
|
|
||||||
|
/* handle_template_object - core logic of the template object
|
||||||
|
*
|
||||||
|
* use config variables like this:
|
||||||
|
* template1 = "$\1\2"
|
||||||
|
* template2 = "\1: ${fs_bar 4,100 \2} ${fs_used \2} / ${fs_size \2}"
|
||||||
|
*
|
||||||
|
* and use them like this:
|
||||||
|
* ${template1 node name}
|
||||||
|
* ${template2 root /}
|
||||||
|
* ${template2 cdrom /mnt/cdrom}
|
||||||
|
*/
|
||||||
|
static int handle_template_object(struct text_object_list **list,
|
||||||
|
char allow_threaded, const char *tmpl, const char *args)
|
||||||
|
{
|
||||||
|
char *args_dup, *template_dup, *p, *p_old;
|
||||||
|
char **argsp = NULL;
|
||||||
|
int text_idx;
|
||||||
|
unsigned int tmpl_num, argcnt = 0, template_idx;
|
||||||
|
char *eval_text;
|
||||||
|
struct text_object_list *eval_list;
|
||||||
|
|
||||||
|
if ((sscanf(tmpl, "template%u", &template_idx) != 1) ||
|
||||||
|
(template_idx > 9))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
args_dup = strdup(args);
|
||||||
|
p = args_dup;
|
||||||
|
while (*p) {
|
||||||
|
while (*p && *p == ' ')
|
||||||
|
p++;
|
||||||
|
p_old = p;
|
||||||
|
while (*p && *p != ' ')
|
||||||
|
p++;
|
||||||
|
if (*p) {
|
||||||
|
(*p) = '\0';
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
argsp = realloc(argsp, ++argcnt * sizeof(char *));
|
||||||
|
argsp[argcnt - 1] = p_old;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = template_dup = strdup(template[template_idx]);
|
||||||
|
|
||||||
|
/* not exact text len, but always enough so don't care. */
|
||||||
|
eval_text = calloc(strlen(template_dup) + strlen(args), sizeof(char *));
|
||||||
|
memset(eval_text, 0, strlen(template_dup) + strlen(args));
|
||||||
|
|
||||||
|
text_idx = 0;
|
||||||
|
while (*p) {
|
||||||
|
switch (*p) {
|
||||||
|
case '\\':
|
||||||
|
if (*(p + 1) == '\\') {
|
||||||
|
eval_text[text_idx++] = '\\';
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (*(p + 1) == 'n') {
|
||||||
|
eval_text[text_idx++] = '\n';
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ((sscanf(p, "\\%u", &tmpl_num) != 1) ||
|
||||||
|
(tmpl_num > argcnt))
|
||||||
|
return 1;
|
||||||
|
tmpl_num--; /* convert number to array idx */
|
||||||
|
memcpy(eval_text + text_idx,
|
||||||
|
argsp[tmpl_num], strlen(argsp[tmpl_num]));
|
||||||
|
text_idx += strlen(argsp[tmpl_num]);
|
||||||
|
/* following is tricky:
|
||||||
|
* jump over all decimal digits of tmpl_num,
|
||||||
|
* but beware of the fact that it could be 0
|
||||||
|
* at the beginning. */
|
||||||
|
p++;
|
||||||
|
while (tmpl_num > 9) {
|
||||||
|
tmpl_num /= 10;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
eval_text[text_idx++] = *p;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
eval_list = extract_variable_text_internal(eval_text, allow_threaded);
|
||||||
|
if (eval_list) {
|
||||||
|
(*list)->text_objects = realloc((*list)->text_objects,
|
||||||
|
sizeof(struct text_object) *
|
||||||
|
((*list)->text_object_count +
|
||||||
|
eval_list->text_object_count));
|
||||||
|
memcpy((*list)->text_objects + (*list)->text_object_count,
|
||||||
|
eval_list->text_objects,
|
||||||
|
sizeof(struct text_object) *
|
||||||
|
eval_list->text_object_count);
|
||||||
|
(*list)->text_object_count += eval_list->text_object_count;
|
||||||
|
free(eval_list->text_objects);
|
||||||
|
free(eval_list);
|
||||||
|
}
|
||||||
|
free(args_dup);
|
||||||
|
free(template_dup);
|
||||||
|
free(eval_text);
|
||||||
|
free(argsp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct text_object_list *extract_variable_text_internal(const char *const_p, char allow_threaded)
|
static struct text_object_list *extract_variable_text_internal(const char *const_p, char allow_threaded)
|
||||||
{
|
{
|
||||||
struct text_object_list *retval;
|
struct text_object_list *retval;
|
||||||
@ -4368,19 +4478,24 @@ static struct text_object_list *extract_variable_text_internal(const char *const
|
|||||||
tmp_p++;
|
tmp_p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create new object
|
if (!strncmp(buf, "template", 8)) {
|
||||||
obj = construct_text_object(buf, arg,
|
if (handle_template_object(&retval, allow_threaded, buf, arg))
|
||||||
retval->text_object_count, retval->text_objects, line, allow_threaded);
|
printf("Error: handling template '%s' failed for args '%s'\n", buf, arg);
|
||||||
if (obj != NULL) {
|
} else {
|
||||||
// allocate memory for the object
|
// create new object
|
||||||
retval->text_objects = realloc(retval->text_objects,
|
obj = construct_text_object(buf, arg,
|
||||||
sizeof(struct text_object) *
|
retval->text_object_count, retval->text_objects, line, allow_threaded);
|
||||||
(retval->text_object_count + 1));
|
if (obj != NULL) {
|
||||||
// assign the new object to the end of the list.
|
// allocate memory for the object
|
||||||
memcpy(
|
retval->text_objects = realloc(retval->text_objects,
|
||||||
&retval->text_objects[retval->text_object_count++],
|
sizeof(struct text_object) *
|
||||||
obj, sizeof(struct text_object));
|
(retval->text_object_count + 1));
|
||||||
free(obj);
|
// assign the new object to the end of the list.
|
||||||
|
memcpy(
|
||||||
|
&retval->text_objects[retval->text_object_count++],
|
||||||
|
obj, sizeof(struct text_object));
|
||||||
|
free(obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
@ -8234,6 +8349,16 @@ static void set_default_configurations(void)
|
|||||||
color7 = default_fg_color;
|
color7 = default_fg_color;
|
||||||
color8 = default_fg_color;
|
color8 = default_fg_color;
|
||||||
color9 = default_fg_color;
|
color9 = default_fg_color;
|
||||||
|
template[0] = strdup("");
|
||||||
|
template[1] = strdup("");
|
||||||
|
template[2] = strdup("");
|
||||||
|
template[3] = strdup("");
|
||||||
|
template[4] = strdup("");
|
||||||
|
template[5] = strdup("");
|
||||||
|
template[6] = strdup("");
|
||||||
|
template[7] = strdup("");
|
||||||
|
template[8] = strdup("");
|
||||||
|
template[9] = strdup("");
|
||||||
draw_shades = 1;
|
draw_shades = 1;
|
||||||
draw_borders = 0;
|
draw_borders = 0;
|
||||||
draw_graph_borders = 1;
|
draw_graph_borders = 1;
|
||||||
@ -8465,6 +8590,25 @@ static void load_config_file(const char *f)
|
|||||||
CONF_ERR;
|
CONF_ERR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#define TEMPLATE_CONF(n) \
|
||||||
|
CONF("template"#n) { \
|
||||||
|
if (value) { \
|
||||||
|
free(template[n]); \
|
||||||
|
template[n] = strdup(value); \
|
||||||
|
} else { \
|
||||||
|
CONF_ERR; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
TEMPLATE_CONF(0)
|
||||||
|
TEMPLATE_CONF(1)
|
||||||
|
TEMPLATE_CONF(2)
|
||||||
|
TEMPLATE_CONF(3)
|
||||||
|
TEMPLATE_CONF(4)
|
||||||
|
TEMPLATE_CONF(5)
|
||||||
|
TEMPLATE_CONF(6)
|
||||||
|
TEMPLATE_CONF(7)
|
||||||
|
TEMPLATE_CONF(8)
|
||||||
|
TEMPLATE_CONF(9)
|
||||||
CONF("default_color") {
|
CONF("default_color") {
|
||||||
if (value) {
|
if (value) {
|
||||||
default_fg_color = get_x11_color(value);
|
default_fg_color = get_x11_color(value);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user